Что такое уязвимость bash CVE-2014-6271 (Shellshock) и как ее исправить?


141

В последнее время ходят новости о «CVE-2014-6271» (см. USN-2362-1 ), который является уязвимостью в Bash. Как я узнаю, что на меня это влияет, как я могу это исправить, и почему меня это должно волновать?

Это сделано как канонический ответ на эту уязвимость из-за ее масштабов и серьезности.


18
"Как мне это исправить?" -> просто запустите менеджер обновлений! Действительно, Ubuntu выпускает обновления безопасности, есть специальная команда безопасности. Пожалуйста, не публикуйте ответы о сборке Bash из исходного кода! ; Это бесполезно сложно и сложно поддерживать вашу систему в будущем.
gertvdijk

5
Кроме того, также дополнительный CVE для неполного исправления. CVE-2014-7169
gertvdijk

18
Пожалуйста , публикуйте ответы о строительстве из источника. Независимо от того, должны они или нет, у некоторых людей есть древние серверы Ubuntu, и сборка из исходного кода может быть их единственным вариантом.
GaryO

3
ой, извините, я только что понял, что в тесте я поставил bash вместо dash. Неважно, это нормально.
Мэтт Х

4
Читайте: oss-sec: Re: CVE-2014-6271: удаленное выполнение кода через bash . Ошибка Bash до сих пор не исправлена
blade19899

Ответы:


126

Что такое Баш?

Bash - это интерактивная оболочка по умолчанию в Ubuntu. Когда вы взаимодействуете с терминалом (через эмулятор терминала, через tty или ssh), вы, как правило, вводите команды, которые bashбудут читать и выполнять. Даже если вы вообще не используете терминал, у вас все равно есть Bash.

На Ubuntu /bin/shэто не bash (это тире). Эта уязвимость затрагивает только bash.

Как подвиг влияет на меня?

Bash и ОС отслеживают набор переменных среды, которые описывают текущего вошедшего в систему пользователя, где искать программы на жестком диске и другие подобные функции. Создав переменную среды с определенной структурой, злоумышленник сможет выполнить код при следующем запуске Bash.

Атакующий может установить эту переменную среды несколькими способами:

  • Удаленно подключитесь к службе, такой как SSH, с определенной настройкой, такой как git over ssh. Как предупреждает Митр, использование ForceCommandопции sshd является вектором атаки. Аккаунты, оболочка которых не 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, все же рекомендуется перезагрузить компьютер немедленно, если это возможно.


20
Извините, вы уязвимы . Оригинальный патч не решает всю проблему. См. Cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-7169 AFAIAA, в настоящее время нет общедоступных исправлений. Смотрите , например , people.canonical.com/~ubuntu-security/cve/pkg/bash.html
Mormegil

4
@hexafraction Где вы читаете, что 12.10 получает обновление для этого? Я так не думаю, 12.10, 13.04, 13.10 - это конец жизни ! А также репозитории backport не используются для обновлений безопасности .
gertvdijk

2
@hexafraction Нет, они не делают! В этом весь смысл окончания жизни: больше никакой поддержки.
gertvdijk

1
@ MichaelHärtl Если вы работаете в Ubuntu 12.10, вы можете скачать версию bash 12.04 с packages.ubuntu.com/precise/bash и установить ее вручную.
Дэвид

2
Исправление для CVE-2014-7169 доступно в диспетчере обновлений (для меня).
Кальмариус

27

Украл это у Хакера Новости . Если у вас есть проблемы с вашими репозиториями, такими как я (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 !!


1
Вот как собрать bash 3.2 с патчем для debian lenny: gist.github.com/mattwhite/86de50d30134129e44ef
Мэтт Уайт

13
-1. Нет необходимости строить из исходного кода. У Ubuntu есть исправление безопасности в репозиториях. Если у вас "проблемы с репо", исправьте это. Скорее всего, вы будете уязвимы, если не будете получать обновления безопасности!
gertvdijk

1
@ Matt White Спасибо! Вы только что сэкономили мне пару часов :)
Флориан Фида,

5
@FlorianFida Это AskUbuntu! Ожидается, что все на этом сайте будут публиковать ответы в рамках использования Ubuntu.
gertvdijk

6
@ MichaelHärtl 12.10 - конец жизни. Он уже не получает никаких обновлений безопасности уже давно. Обновить!!!
gertvdijk

9

Примечание. Обновление безопасности для 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

1
Это было правильно, но теперь стал доступен официальный патч, поэтому выпущено обновление для системы безопасности. Следовательно, эти шаги больше не нужны.
Роби Басак

Это верно. Я отредактирую вышеупомянутый пост. Спасибо.
branch.lizard 26.09.14

1

Если вы на 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"

0

Я использую 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

Вопрос. В первоначальном вопросе 1 возможный вектор атаки указан как «сценарии, выполняемые неуказанными клиентами DHCP». Что это значит? Означает ли это, что Ubuntu / sbin / dhclient <- уязвим?
Отруби

Я думаю, что неуказанные клиенты означают, что в Ubuntu есть зараженный / sbin / dhclient, который затем запускает команды, которые приводят к запуску сценария bash-скрипта. Это то, что DHCP-клиенты уязвимы для шелл-шока? (Надеюсь, что это имеет смысл, см. Мое сообщение от 10 октября)
Бран
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.