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

137

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

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

    
задан hexafraction 24.09.2014 в 21:48
источник

5 ответов

125

Что такое Bash?

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

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

Как влияет на меня эксплоит?

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

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

  • Удаленное подключение к службе, например SSH, с конкретной настройкой, такой как git over ssh. Как предупреждает Митра, использование параметра sshd ForceCommand является вектором атаки. Учетные записи, чья оболочка не является bash, не затрагиваются.
  • Обманывать вас при настройке переменной окружения.
  • Вызов другой программы для установки переменной окружения, чтобы иметь это созданное значение. Например, у вас может быть веб-сервер и скрипт, которым необходимо установить переменную среды с определенным пользовательским контентом. Даже если этот скрипт создает свой собственный и не затрагивает другие переменные среды, этого достаточно. Для успешного использования эксплойта достаточно одной переменной среды с любым именем и созданным значением .
  • Другие способы, о которых я здесь не упоминал.

Как только они устанавливают эту переменную, в следующий раз, когда bash откроется для причины any , будет запущен код вашего злоумышленника. Это особенно страшно с sudo -s , поскольку он порождает bash как суперпользователя (административное правило пользователя с полным контролем над данными и программами вашего компьютера). Даже если вы только начинаете bash в качестве стандартного пользователя, файлы этого пользователя могут быть удалены.

Важно отметить, что даже если вы не используете bash самостоятельно, многие программы будут порождать bash сами по себе как часть их работы. Даже в этом случае вы уязвимы. Тем не менее, /bin/sh Ubuntu не является bash, поэтому затрагиваются только программы, явно вызывающие bash, а не оболочку сценариев по умолчанию.

В соответствии с Mitre:

  

, включающие функцию 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 Панголин и 10.04 Lucid Lynx. Если вы не находитесь в одной из этих версий LTS, но находитесь в разумно недавней версии, вы, скорее всего, сможете найти исправленный пакет.

Сначала проверьте,

Если вы уязвимы, вы должны сначала просмотреть новейшие списки пакетов:

sudo apt-get update && sudo apt-get install bash

Первая команда гарантирует, что у вас есть новейший список пакетов, который включает фиксированную версию, а вторая команда устанавливает самую новую (исправленную) версию bash.

Пока ошибка появляется только в том случае, когда bash порождается, по-прежнему рекомендуется перезагрузить сразу, если это возможно.

    
ответ дан hexafraction 24.09.2014 в 21:48
источник
27

Снимите это с cft over в Hacker News . Если у вас возникли проблемы с вашими репозициями, такими как я (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 !!

    
ответ дан Bobby Saget 25.09.2014 в 02:30
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
    
ответ дан branch.lizard 25.09.2014 в 18:30
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"
    
ответ дан ldrrp 25.09.2014 в 17:13
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 : in 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
    
ответ дан sdaau 28.09.2014 в 10:16