В командном интерпретаторе 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:
После выполнения указанной команды в переменную окружения будет скопирована в том числе строка '() { 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]
[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]
Ну и в чем её опасность? Есть очень простые вопросы:
1. Если юзеру можно, к примеру, запустить команду date, или какую иную, в интерактивном режиме, то в чем опасность, если оно запуститься с использованием выявленной "уязвимости"? По моему в этом случае опасность несколько преувеличена.
2. Если мы хотим исполнить какую-либо на удаленном компьютере, через ssh, то вначале надо авторизоваться так или иначе в ssh. Верно? И только затем наша команда исполнится. Верно? Тогда какая нафиг разница, как именно передать имя команды на удаленный компьютер, традиционным способом или вновь выявленным в переменной окружения? Результат будет одинаков - команда исполнится при условии, если её исполнение разрешено данному юзеру. А если не разрешено, если не вписано, например, в sudoers, то как поднять полномочия (применить sudo на команду) исполнения?
Так что никакой особой опасности в данной "уязвимости" я пока не усматриваю. Так как будут исполняться только те команды, которые юзер (который должен перед этим легально зарегистрироваться в системе) и сам имеет право исполнять. То есть данную уязвимость скорее можно отнести к разряду Сам Себе Злобный Буратино, чем реально атакующей вещи.