Я использую Natty 11.04, который является EOL (и я обновил /etc/apt/sources.list, чтобы использовать old-releases.ubuntu.com), поэтому я должен собрать из исходного кода. Я хотел создать .deb, поэтому, по крайней мере, менеджер пакетов «знает», что версия bash не является версией по умолчанию. Я не на 100% успешен - однако, пакет зарегистрирован как «более новый» и bash
бинарный файл исправлен, так что вот что я сделал:
apt-get source bash
wget https://gist.githubusercontent.com/drj11/e85ca2d7503f28ebfde8/raw/31bd53ed2e47b220d3c728f5440758e0f76769de/gistfile1.c -O bash_CVE-2014-6271.patch
wget https://gist.githubusercontent.com/drj11/239e04c686f0886253fa/raw/046e697da6d4491c3b733b0207811c55ceb9d927/gistfile1.c -O bash_CVE-2014-6271_plus.patch
cd bash-4.2/
Теперь в каталоге (sub) bash-4.2/
есть: файл bash-4.2.tar.xz
, который нужно распаковать, чтобы добраться до bash
источника; и подкаталог называется debian
.
Я сделал следующие изменения, чтобы избежать зависимости от texlive
: в bash-4.2/debian/control
:
Source: bash
...
Build-Depends: autoconf, autotools-dev, patch, bison, libncurses5-dev,
# texinfo, debhelper (>= 5), texi2html, locales, gettext, sharutils, time, xz-ut
ils
debhelper (>= 5), locales, gettext, sharutils, time, xz-utils
# Build-Depends-Indep: texlive-latex-base, ghostscript
Build-Depends-Indep: ghostscript
... и в bash-4.2/debian/rules
:
binary-doc: bash-install #bash-doc-build
dh_testdir
dh_testroot
mkdir -p $(d_doc)/usr/share/doc/$(p)
dh_installdocs -p$(p_doc)
ifeq ($(with_gfdl),yes)
#cp -p build-bash/doc/bashref.pdf $(d_doc)/usr/share/doc/$(p)/.
#dh_link -p$(p_doc) \
# /usr/share/doc/$(p)/bashref.pdf /usr/share/doc/$(p_doc)/bashref.pdf
else
rm -f $(d_doc)/usr/share/doc-base/bashref
endif
rm -f $(d_doc)/usr/share/info/dir*
#cp -p build-bash/doc/bash.html build-bash/doc/bash.pdf \
# $(d_doc)/usr/share/doc/$(p)/
#dh_link -p$(p_doc) \
# /usr/share/doc/$(p)/bash.html /usr/share/doc/$(p_doc)/bash.html \
# /usr/share/doc/$(p)/bash.pdf /usr/share/doc/$(p_doc)/bash.pdf
dh_installchangelogs -p$(p_doc) bash/CWRU/changelog
...
Чтобы изменить версию, в этом bash-4.2/
каталоге выполните:
bash-4.2$ dch --local patchCVE
... и заполните примечания в журнале изменений, когда их спросят. Это обеспечит вызов .deb (и связанных с ним метаданных) (в моем случае) bash_4.2-0ubuntu3patchCVE1_i386.deb
.
Затем вы можете попробовать построить с помощью dpkg-buildpackage -us -uc
или debuild
команды. Обратите внимание - любой из них повторно распакует исходный код из zip-файла - переопределив любые патчи, которые у вас могли быть! Тем не менее, запустите один из них один раз, чтобы исходный код был распакован и собран (примечание debuild
может все же завершиться с ошибкой в конце из-за texlive, но он должен распаковать и собрать источник).
Затем примените патчи; обратите внимание, что вы должны использовать -p1
здесь, потому что в данный момент вы находитесь в bash-4.2/
каталоге:
bash-4.2$ patch -p1 < ../bash_CVE-2014-6271.patch
bash-4.2$ patch -p1 < ../bash_CVE-2014-6271_plus.patch
Затем пересоберите исправленную версию, выполнив:
bash-4.2$ fakeroot debian/rules build
Это перестроит исполняемый файл; чтобы проверить это:
bash-4.2$ env VAR='() { :;}; echo Bash is vulnerable!' ./build-bash/bash -c "echo Bash Test"
Чтобы собрать файлы .deb, запустите:
bash-4.2$ fakeroot debian/rules binary
Это сохранит файлы .deb в родительском каталоге; перечислить их содержание:
bash-4.2$ dpkg -c ../bash_4.2-0ubuntu3patchCVE1_i386.deb
Чтобы установить .deb:
bash-4.2$ sudo dpkg -i ../bash_4.2-0ubuntu3patchCVE1_i386.deb
Однако по какой-то причине этот .deb содержит непатентованный двоичный файл (?!), Поэтому мне пришлось дополнительно сделать:
bash-4.2$ sudo cp bash-4.2/build-bash/bash /bin/
... и после этого тест начал проходить правильно для меня:
$ env VAR='() { :;}; echo Bash is!' bash -c "echo Bash Test"
bash: warning: VAR: ignoring function definition attempt
bash: error importing function definition for `VAR'
Bash Test