Я використовую 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/
Тепер у (під) каталозі 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
командувати. Зауважте - будь-який із них повторно розпакує джерело з блискавки - таким чином, замінить будь-які виправлення, які у вас могли бути! Все-таки запустіть один із них один раз, щоб джерело було розпаковано та побудовано (примітка 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