Что такое уязвимость bash CVE-2014-6271 (Shellshock) и как ее исправить?
В последнее время ходят новости о "CVE-2014-6271" (см. USN-2362-1), который является уязвимостью в Bash. Как я узнаю, что на меня это влияет, как я могу это исправить, и почему меня это должно волновать?
Это сделано как канонический ответ на эту уязвимость из-за ее масштабов и серьезности.
5 ответов
Что такое Баш?
Bash - это интерактивная оболочка по умолчанию в Ubuntu. Когда вы взаимодействуете с терминалом (через эмулятор терминала, через tty или ssh), вы обычно набираете команды, которые bash
будет читать и выполнять. Даже если вы вообще не используете терминал, у вас все равно есть Bash.
На Ubuntu, /bin/sh
это не Баш (это тире). Эта уязвимость затрагивает только bash.
Как подвиг влияет на меня?
Bash и ОС отслеживают набор переменных среды, которые описывают текущего вошедшего в систему пользователя, где искать программы на жестком диске и другие подобные функции. Создав переменную среды с определенной структурой, злоумышленник сможет выполнить код при следующем запуске Bash.
Атакующий может установить эту переменную среды несколькими способами:
- Удаленно подключитесь к службе, такой как SSH, с определенной настройкой, такой как git over ssh. Как предупреждает Митра, использование sshd
ForceCommand
опция является вектором атаки. Аккаунты, оболочка которых не bash, не затрагиваются. - Обманывают вас в установке переменной окружения.
- Вызывает другую программу, чтобы установить переменную окружения, чтобы иметь это созданное значение. Например, у вас может быть веб-сервер и сценарий, которым необходимо установить переменную среды с определенным пользовательским содержимым. Даже если этот скрипт создает свой собственный и не затрагивает другие переменные окружения, этого достаточно. Для успеха эксплойта достаточно одной переменной среды с любым именем и созданным значением.
- Другие способы я не упомянул здесь.
Как только они установят эту переменную, в следующий раз bash
открывается по любой причине, код вашего злоумышленника будет запущен. Это особенно страшно с sudo -s
, поскольку он порождает bash как суперпользователь (административное пользовательское правило, которое полностью контролирует данные и программы вашего компьютера). Даже если вы запускаете bash только как обычный пользователь, файлы этого пользователя могут быть удалены.
Важно отметить, что, даже если вы сами не используете bash, многие программы сами запускают bash в рамках своей работы. Даже в этом случае вы уязвимы. Тем не менее, Ubuntu /bin/sh
не bash, поэтому затрагиваются только программы, которые явно вызывают bash, а не оболочку сценариев по умолчанию.
По словам Митры:
векторы, включающие функцию ForceCommand в OpenSSH sshd, модули mod_cgi и mod_cgid в HTTP-сервере Apache, сценарии, выполняемые неуказанными клиентами DHCP, и другие ситуации, в которых настройка среды происходит через границу привилегий при выполнении Bash.
Я уязвим?
Используйте dpkg, чтобы проверить версию установленного пакета:
dpkg -s bash | grep Version
Это будет искать информацию на вашем bash
пакет и отфильтруйте выходные данные, чтобы показать только версию. Фиксированные версии 4.3-7ubuntu1.4
, 4.2-2ubuntu2.5
, а также 4.1-2ubuntu3.4
,
Например, я вижу:
wlan1-loopback% dpkg -s bash | grep Version
Version: 4.3-7ubuntu1.4
и могу определить, что я не уязвим.
Как мне обновить?
Стандартный менеджер обновлений предложит вам это обновление. Это яркий пример того, как важны обновления безопасности, независимо от того, какую операционную систему вы используете или насколько хорошо она поддерживается.
В бюллетене USN говорится, что были выпущены новые версии для Ubuntu 14.04 Trusty Tahr, 12.04 Precise Pangolin и 10.04 Lucid Lynx. Если вы не пользуетесь одной из этих версий LTS, но пользуетесь достаточно свежей версией, вы, скорее всего, сможете найти пропатченный пакет.
Во-первых, проверьте, если вы
Если вы уязвимы, вы должны сначала получить новейшие списки пакетов:
sudo apt-get update && sudo apt-get install bash
Первая команда гарантирует, что у вас есть список новейших пакетов, который включает в себя фиксированную версию, а вторая команда устанавливает самую новую (фиксированную) версию bash.
Несмотря на то, что ошибка появляется только при появлении bash, все же рекомендуется перезагрузить компьютер немедленно, если это возможно.
Украл это у Хакера Новости. Если у вас есть проблемы с вашими репозиториями, такими как я (Odroid-XU), то это должно хорошо работать, если вы хотите патчить / строить из исходного кода.
TMPDIR=/tmp/bash-src
mkdir $TMPDIR
cd $TMPDIR
#download bash
wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
#download all patches
for i in $(seq -f "%03g" 1 999); do
wget http://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i
if [[ $? -ne "0" ]]; then
MAX=$(expr $i - 1)
break;
fi
done
tar zxf bash-4.3.tar.gz
cd bash-4.3
#apply all patches
for i in $(seq -f "%03g" 1 $MAX);do
echo apply patch bash43-$i
patch -p0 < ../bash43-$i
done
#build and install
./configure && make
sudo make install
cd ../..
rm -r $TMPDIR
Затем запустите:
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
И если вы получите:
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test
Тогда у тебя все хорошо!
ВНИМАНИЕ: make install установит bash в /usr/local/bin
, так /bin/bash
не изменяется и может быть вызван из curl!
Примечание. Обновление безопасности для CVE-2014-7169 было выпущено как стандартное обновление безопасности. Нет необходимости добавлять дополнительные ppa для получения этого патча. Нужно только следующее.
sudo apt-get update
sudo apt-get upgrade
Чтобы убедиться, что вы исправили Bash правильно, выполните следующую команду
dpkg -s bash | grep Version
Если вы находитесь на 14.04 LTS, вы должны увидеть результат:
Version: 4.3-7ubuntu1.4
Если вы находитесь на 12.04 LTS, ваш вывод должен быть:
Version: 4.2-2ubuntu2.5
Если вы на 11.04: используйте следующие шаги (у меня это сработало)
cd ~/
mkdir bash
wget https://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
for i in $(seq -f "%03g" 0 25); do wget https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done
если не скачивается требуемый патч то установите пакет ftp
apt-get install ftp
for i in $(seq -f "%03g" 0 25); do wget https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done
tar zxvf bash-4.3.tar.gz
cd bash-4.3
for i in $(seq -f "%03g" 0 25);do patch -p0 < ../bash43-$i; done
./configure && make && make install
apt-get install build-essential
./configure && make && make install
Чтобы увидеть, был ли применен патч:
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
Я использую 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
команда. Обратите внимание - любой из них повторно распакует исходный код из 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