Что такое уязвимость 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
Другие вопросы по тегам