LinuxForum.Fans
Тема

Критическая уязвимость в bash

Автор: lone_wolf 47 сообщений 8099 просмотров
25.09.2014 10:09 · отредактировано #393752

В командном интерпретаторе Bash выявлена опасная уязвимость (CVE-2014-6271), позволяющая организовать выполнение кода в контексте другого сеанса bash. Проблема вызвана недоработкой в организации экспорта переменных окружения и shell-функций в другие экземпляры bash, что приводит к выполнению блоков кода из специально оформленных переменных окружения, полученных от других процессов.

Во многих типовых конфигурациях уязвимость может быть эксплуатирована по сети, если bash вызывается в качестве shell-интерпретатора. Потенциально может быть атаковано любое приложение которые запускает bash или скрипты на bash с установкой переменных окружения на основе внешних данных (манипуляция с подобными suid-программами может привести к повышению привилегий в системе). В том числе могут быть атакованы CGI-скрипты (написанные на bash или в которых вызывается bash), dhclient, CUPS и конфигурации OpenSSH.

Текущие версии bash используют переменные окружения для экспорта функций, при этом если в переменной содержится "() {", то её содержимое воспринимается как функция. Из-за ошибки, после завершения тела функции, обработка продолжается и после символа "}". Если после функции указана команда, то bash выполнит и её (например, "VAR=() { ignored; }; /bin/id"). Уязвимость проявляется для любых переменных окружения, имя не имеет значения.

В случае с OpenSSH атака может быть проведена через подстановку переменной окружения SSH_ORIGINAL_COMMAND:

[console] ssh -o 'rsaauthentication yes' 0 '() { ignored; }; /usr/bin/id'[/console]

После выполнения указанной команды в переменную окружения будет скопирована в том числе строка '() { ignored; }; /usr/bin/id', которая инициирует запуск команды /usr/bin/id на стороне удалённой системы. Аналогичные атаки могут быть проведены через переменную окружения TERM или при запуске CGI-скриптов через переменные REMOTE_USER, HTTP_CUSTOM, QUERY_STRING и т.п. (например, можно передать значение "() {" вместо имени пользователя или в теле HTTP-заголовка "Custom:").

Для устранения проблемы подготовлена серия патчей. Обновления пакетов с bash уже выпущены для Debian, Ubuntu, RHEL, CentOS. Оценить появление обновлений для других систем можно на следующих страницах: Fedora, [url=openSUSE]openSUSE[/url], SLES, Slackware, Gentoo, OpenBSD, NetBSD, FreeBSD. (p.s. В Slakware уже есть обнова)

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

[console] env x='() { :;}; echo vulnerable' bash -c "echo this is a test"[/console]
В качестве обходного временного пути защиты может быть применена блокировка по маске через iptables:

[console] iptables using -m string --hex-string '|28 29 20 7B|'[/console]


Новость взята c opennet

25.09.2014 11:17 · отредактировано #393765
"lone_wolf" написал:
Для проверки системы на наличие уязвимости

[console=user]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[/console]

Таки это говорит о том, что её нет?

"lone_wolf" написал:
если в переменной содержится "() {"

Ну так без пробела? тогда:

[console=user]env x='(){ :;}; echo vulnerable' bash -c "echo this is a test"
this is a test
[/console]

Что-то я запутался, помогите знатоки bash!

25.09.2014 11:27 #393767

в debian 6 уже прикрыли :)

25.09.2014 11:55 #393770

Даже патченные версии все равно уязвимы, насколько я понимаю

25.09.2014 11:56 #393771
"stranger" написал:
Таки это говорит о том, что её нет?

файлика при этом не создается в текущей директории?

25.09.2014 12:03 · отредактировано #393775
"alexfinn" написал:
файлика при этом не создается в текущей директории?

Точно нет. И да, писать-то таки без пробела, как сказано изначально или с пробелом, как в приведённой строке?

25.09.2014 12:38 #393782

при запуске вот этого:

text
X='() { (a)=>\' bash -c "echo date"

в директории получается файлик и именем echo и датой внутри

25.09.2014 12:41 #393784
"alexfinn" написал:
при запуске вот этого:

Ага! Разобрались. Да. Создался, содержит дату. И о чём это нам говорит, о наличии уязвимости или об отсутствии?

25.09.2014 12:46 #393788

:) типа, все еще о наличии

25.09.2014 12:56 #393794

alexfinn, спасибо (плюсанул)! Будем ждать...

25.09.2014 13:00 #393795

"alexfinn" написал:
Даже патченные версии все равно уязвимы, насколько я понимаю
под centos рабтает, а вот под debian нет
text

cat /etc/redhat-release
CentOS release 6.5 (Final)

rpm -aq|grep bash bash-4.1.2-15.el6_5.1.x86_64

... env X='() { (a)=>\' sh -c "echo date"; cat echo sh: X: line 1: syntax error near unexpected token `=' sh: X: line 1: `' sh: error importing function definition for `X' Thu Sep 25 13:00:19 MSK 2014

+

text

lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.6 (wheezy)
Release:        7.6
Codename:       wheezy

dpkg -l|grep bash ii bash 4.2+dfsg-0.1 amd64 GNU Bourne Again SHell

env X='() { (a)=>\' sh -c "echo date"; cat echo date cat: echo: No such file or directory

25.09.2014 13:11 #393798

на Центе 7 работает, на Убунте 14.04 - нет... это на данный момент

25.09.2014 13:25 · отредактировано #393801

Ну и в чем её опасность? Есть очень простые вопросы:
1. Если юзеру можно, к примеру, запустить команду date, или какую иную, в интерактивном режиме, то в чем опасность, если оно запуститься с использованием выявленной "уязвимости"? По моему в этом случае опасность несколько преувеличена.
2. Если мы хотим исполнить какую-либо на удаленном компьютере, через ssh, то вначале надо авторизоваться так или иначе в ssh. Верно? И только затем наша команда исполнится. Верно? Тогда какая нафиг разница, как именно передать имя команды на удаленный компьютер, традиционным способом или вновь выявленным в переменной окружения? Результат будет одинаков - команда исполнится при условии, если её исполнение разрешено данному юзеру. А если не разрешено, если не вписано, например, в sudoers, то как поднять полномочия (применить sudo на команду) исполнения?

Так что никакой особой опасности в данной "уязвимости" я пока не усматриваю. Так как будут исполняться только те команды, которые юзер (который должен перед этим легально зарегистрироваться в системе) и сам имеет право исполнять. То есть данную уязвимость скорее можно отнести к разряду Сам Себе Злобный Буратино, чем реально атакующей вещи.

25.09.2014 13:43 #393807

Тем линуксы мне и нравятся, найдена уязвимость - все бросились проверять (что правильно - бережем свои сервачки) :)

25.09.2014 13:59 #393812

"Bif" написал:
найдена уязвимость - все бросились проверять
это свойственно всем нормальным админам(*nix,win etc.)
25.09.2014 14:02 #393814
"alexfinn" написал:
на Центе 7 работает, на Убунте 14.04 - нет... это на данный момент

В Ubuntu/Debian sh сомтрит на dash, в котором уязвимости нет.

Там работает так:
[console]env X='() { (a)=>\' bash -c "echo date"; cat echo[/console]

"Cruiser78" написал:
Так что никакой особой опасности в данной "уязвимости" я пока не усматриваю.

http://www.opennet.ru/opennews/art.shtml?num=40670
И вообще любой сервис, который изменяет переменные окружения и дергает какие-то bash скрипты, теоретически уязвим.

25.09.2014 14:16 #393816

да, это я позабыл совсем про dash

25.09.2014 15:02 · отредактировано #393822
alexfinn написал:
при запуске вот этого:
text
X='() { (a)=>\' bash -c "echo date"

в директории получается файлик и именем echo и датой внутри

alexfinn написал:
:) типа, все еще о наличии

Че-то я вообще ничего не понял.
Выполняю

text
X='() { (a)=>\' bash -c "echo date"

Файл с названием echo создается. Это говорит о том, что уязвимость есть, верно?

Но при этом мне минувшей ночью пришло обновление якобы с фиксом: http://advisories.mageia.org/MGASA-2014-0388.html
Как-то это странно.

25.09.2014 15:10 #393826
"xxblx" написал:
Файл с названием echo создается. Это говорит о том, что уязвимость есть, верно?

Ага.

"xxblx" написал:
Но при этом мне минувшей ночью пришло обновление якобы с фиксом: http://advisories.mageia.org/MGASA-2014-0388.html
Как-то это странно.

Обновление решило проблему только частично.

25.09.2014 15:15 · отредактировано #393829

neol, а вот если выполнить команду из шапки топика

text
env x='() { :;}; echo vulnerable'  bash -c "echo this is a test"

ничего не создается тогда.
Похоже да, проблема частично решена.

Войдите или зарегистрируйтесь, чтобы ответить.