Наложение патчей обновления системы в OpenBSD


Брайан Шонхорст

Перевод: Сгибнев Михаил

В этом документе рассматривается методика наложения патчей, направленных на исправление ошибок в OpenBSD. Эта статья предназначена для начального круга читателей, тем кому нехватает документации на официальном сайте OpenBSD.

Наложение на систему патчей безопасности должно быть сделано сразу после установки. Эти патчи закрывают бреши в системе безопасности, выявленные начиная с момента выпуска системы. Будет хорошей идеей подписаться на список рассылки security-announce, для своевременного получения уведомлений о выходе исправления.

Официальный список патчей, доступных для OpenBSD можно найти на узле Errata. Последний релиз будет отображен наряду со списком исправления для предыдущих версий. Вы будете должны установить исправления, отмеченные как для всех архитектур, так и для конкретно вашей (например для i386 это будет "i386 only" и "All architectures").

Нам необходимо будет иметь две вещи: исходные тексты для обновления бинарных файлов (или исходные тексты ОС полностью) и непосредственно сам патч.
Исходные тексты и бинарные файлы
В случае бинарных файлов не возмодно внесение исправлений, так как они находятся в нечитабельном для человека виде и могут быть использованы только процессором. Вообще, довольно часто выполнимые программы идентифицируются как двоичные файлы. Например ядро bsd или httpd.

Исходные тексты могут быть довольно легко прочитаны человеком, поскольку соответствуют текстовому стандарту ASCII и обычно представляют собой программу, написанную на одном из языков программирования (C, C++ и т.д). Для превращения исходных текстов в бинарный вид необходимо провести процесс компиляции.

Наша задача заключается во внесении исправлений в исходный код программ, содержащих ошибки, компиляции и установке исправленных версий.
Установка исходных текстов
Чтобы нам было что исправлять, необходимо получить эти самые исходные тексты. В этом примере мы рассмотрим установку с официального CD. Для того, чтобы узнать о других методах, обратитесь к OpenBSD FAQ.

Вставьте необходимый диск (в 3.4 это диск 3) и примонтируйте его. Нам необходим архив src.tar.gz.

$ sudo mount /dev/cd0c /mnt

Перейдите в каталог, в который вы хотите установить исходные тексты и, если это еще не так, добавьте имя своей учетной записи в группу wsrc, отредактировав /etc/group.

$ cd /usr/src

Распаковываем архив

$ sudo tar -xzvf /mnt/src.tar.gz

Это потребует некоторого времени, после которого полный набор исходных текстов системы будет установлен на ваш жесткий диск. После завершения процесса компакт-диск можно отмонтировать.

$ sudo umount /mnt

Получение патчей
Теперь мы должны получить текущий набор исправлений. Вы можете получить их через ftp или cvs, в нашем примере это будет ftp. Для получения файлов Вы можете выбрать зеркало ближайшее к Вам. Они должны находиться в каталоге /pub/OpenBSD/patches. Удостоверьтесь, что получаете файлы, соответствующие имеющейся у вас версии OpenBSD (в нашем примере 3.4.tar.gz).

$ cd /home/bschonho
$ ftp openbsdmirrorofyourchoice.com
Name: anonymous
Pass: myemail
Logged in anonymously
ftp> cd patches/
ftp> get 3.4.tar.gz
Transfer completed
ftp> quit

Распаковываем:

$ tar -xzvf 3.4.tar.gz

В результате вы получите каталог 3.4, содержащий исправления.
Наложение патчей
Наложение патчей заключается в наложении инструкций, находящихся в патче на исправляемую программу. Так, если Вы смотрите в папке исправлений 3.4 (или иначе, в зависимости от устанавливаемой версии), Вы должны увидеть папки для различных архитектур и одну общую (common) папку. Все базовые системы устанавливают общие исправления. В нашем случае первый патч устраняет неточность в документации, поэтому для наглядности мы сразу перейдем ко второму, где устраняется проблема безопасности OpenSSL.

Просмотрим его содержимое:

$ less 3.4/common/002_asn1.patch

применяем:

cd /usr/src
patch -p0 < 002_asn1.patch

Пересобираем и устанавливаем OpenSSL:

cd lib/libssl
make obj
make depend
make
make install

Собственно, это и все, что необходимо знать. Учтите, что команда cd lib/libssl подразумевает, что вы уже находитесь в каталоге /usr/src.

После того, как мы перешли в каталог /usr/src применим патч, который находится в моем домашнем каталоге:

$ sudo patch -p0 < /home/bschonho/3.4/common/002_asn1.patch
Patching file lib/libssl/src/ssl/s3_srvr.c using Plan A...
Hunk #1 succeeded at 432.
Hunk #2 succeeded at 846.
Hunk #3 succeeded at 860.
Hunk #4 succeeded at 1358.
done

Выглядит неплохо! Исходный текст был исправлен. Теперь мы можем перекомпилировать бинарные файлы для OpenSSL. Удостоверьтесь, что вы можете использовать sudo, если вы не вошли как root. Некоторые из выполняемых команд могут занять много времени(10 минут или больше), в зависимости от мощности машины.

$ cd lib/libssl
$ sudo make obj
===> crypto
/usr/src/lib/libssl/crypto/obj -> /usr/obj/lib/libssl/crypto
===> ssl
/usr/src/lib/libssl/ssl/obj -> /usr/obj/lib/libssl/ssl
===> man
/usr/src/lib/libssl/man/obj -> /usr/obj/lib/libssl/man

$ sudo make depend
lib/libssl/ssl/../src/ssl/s3_pkt.c /usr/src/lib/libssl/ssl/../src/ssl/ssl_err.c
/usr/src/lib/libssl/ssl/../src/ssl/t1_meth.c
===> man

$ sudo make
.cat3
( cd `dirname /usr/src/lib/libssl/man/../src/doc/ssl/ssl.pod` && pod2man --section=3 --official
--center='OpenSSL' --release="OpenBSD `uname -r`" `basename /usr/src/lib/libssl/man/../src/doc/ssl/ssl.pod` )
| nroff -Tascii -man > ssl.cat3

Устанавливаем новые файлы взамен старых:

$ sudo make install
/usr/share/man/cat3/lh_free.0 -> /usr/share/man/cat3/lhash.0
/usr/share/man/cat3/lh_insert.0 -> /usr/share/man/cat3/lhash.0
/usr/share/man/cat3/lh_new.0 -> /usr/share/man/cat3/lhash.0
/usr/share/man/cat3/lh_retrieve.0 -> /usr/share/man/cat3/lhash.0

Удостоверьтесь, что наложили все исправления, находящиеся в каталоге. В результате применения патчей может потребоваться перезапуск некоторых сервисов. возможно, вам стоит почитать статью по перекомпиляции ядра.

Обновлено: 13.03.2015