Що таке вразливість башти CVE-2014-6271 (Shellshock) і як це виправити?


141

Нещодавно з'явилися новини щодо "CVE-2014-6271" (Див. USN-2362-1 ), що є вразливим для Баша. Як дізнатись, чи на мене це впливає, як я можу це виправити, і чому я повинен піклуватися?

Це розроблено як канонічна відповідь на цю вразливість через її масштаби та суворість.


18
"як це виправити?" -> просто запустіть менеджер оновлень! Дійсно, Ubuntu випускає оновлення безпеки, є спеціальна команда з безпеки. Будь ласка, не публікуйте відповіді про створення Bash від джерела! ; це зайво складне і складніше підтримувати свою систему в майбутньому.
gertvdijk

5
Плюс також додатковий CVE для неповного виправлення. CVE-2014-7169
gertvdijk

18
Будь ласка , опублікуйте відповіді про будівництво з джерела. Потрібно чи ні, у деяких людей є старовинні сервери Ubuntu, і будівництво з джерела може бути єдиним варіантом.
GaryO

3
ой, вибачте, що щойно зрозумів, що став тест замість тире. Неважливо, це добре.
Метт H

4
Читання: oss-sec: Re: CVE-2014-6271: віддалене виконання коду через bash . Помилка Bash досі не виправлена
blade19899

Відповіді:


126

Що таке Баш?

Bash - це за замовчуванням інтерактивна оболонка в Ubuntu. Коли ви взаємодієте з терміналом (або через емулятор термінала, через tty, або ssh), ви, як правило, набираєте команди, які bashбудуть читати та виконувати. Навіть якщо ви взагалі не використовуєте термінал, у вас все одно є Bash.

На Ubuntu, /bin/shне bash (це тире). На цю вразливість впливає лише баш.

Як на мене впливає подвиг?

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

Зловмисник може встановити цю змінну середовища декількома способами:

  • Віддалене підключення до такої служби, як SSH із певним налаштуванням, наприклад git over ssh Як попереджає Мітер, використання параметра sshd ForceCommandє вектором атаки. Облікові записи, чия оболонка не є ударом, не впливають.
  • Обмежує вас у встановленні змінної середовища.
  • Викликаючи іншу програму встановити змінну оточення, щоб мати це створене значення. Наприклад, у вас може бути веб-сервер і скрипт, яким потрібно встановити змінну середовища з конкретним вмістом користувача. Навіть якщо цей скрипт створює свій власний і не торкається інших змінних оточення, цього достатньо. Однієї змінної середовища з будь-яким ім'ям і створеним значенням достатньо для успіху експлуатації .
  • Інших способів я тут не згадував.

Як тільки вони встановлять цю змінну, наступного разу 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 Bulletin стверджує , що нові версії були випущені для Ubuntu 14.04 Trusty тар, 12.04 Precise Pangolin і 10.04 Lucid Lynx. Якщо ви не перебуваєте в одній з цих версій LTS, але у вас досить нова версія, швидше за все, ви зможете знайти виправлений пакет.

Спочатку перевірте, чи є ви

Якщо ви вразливі, спершу слід схопити нові списки пакунків:

sudo apt-get update && sudo apt-get install 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 - це дуже багато кінця життя ! А також резервні сховища не використовуються для оновлень безпеки .
gertvdijk

2
@hexafraction Ні, вони ні! У цьому вся суть того, що закінчується життя: вже немає підтримки.
gertvdijk

1
@ MichaelHärtl Якщо ви перебуваєте на Ubuntu 12.10, ви можете завантажити версію bash 12.04 з пакунків.ubuntu.com/ precise/bash та встановити її вручну.
Девід,

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

27

Викрав це з КФТ у 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 in /usr/local/bin, тому /bin/bashвін не змінюється і його можна викликати з curl !!


1
Ось як створити bash 3.2 за допомогою патча на debian lenny: gist.github.com/mattwhite/86de50d30134129e44ef
Matt White

13
-1. Не потрібно будувати з джерела. Ubuntu має виправлення безпеки у сховищах. Якщо у вас є "проблеми з репо", виправте це замість цього. Ви, ймовірно, будете вразливі ще багатьма способами, якщо не отримаєте оновлення безпеки!
gertvdijk

1
@Matt White Дякую! Ти щойно врятував мене пару годин :)
Флоріан Фіда,

5
@FlorianFida Це AskUbuntu! Очікується, що всі на цьому веб-сайті розмістять відповіді в рамках використання Ubuntu.
gertvdijk

6
@ MichaelHärtl 12.10 закінчено життя. Він уже давно не отримує оновлень безпеки. Оновлення !!!
gertvdijk

9

Примітка. Патч безпеки для CVE-2014-7169 випущено у вигляді стандартного оновлення безпеки. Немає необхідності додавати додаткові додаткові програми для отримання цього виправлення. Потрібно лише наступне.

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

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/

Тепер у (під) каталозі 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

Запитання: Оригінальне запитання зазначає 1 можливий вектор атаки як "сценарії, виконані невизначеними клієнтами DHCP". Що це значить? Чи означає це, що Ubuntu / sbin / dhclient <- вразливий?
Бран

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