В командном интерпретаторе Bash выявлена опасная уязвимость (CVE-2014-6271), позволяющая организовать выполнение кода в контексте другого сеанса bash. Проблема вызвана недоработкой в организации экспорта переменных окружения и shell-функций в другие экземпляры bash, что приводит к выполнению блоков кода из специально оформленных переменных окружения, полученных от других процессов.
Во многих типовых конфигурация уязвимость может быть эксплуатирована по сети, если bash вызывается в качестве shell-интерпретатора. Потенциально может быть атаковано любое приложение которые запускает bash или скрипты на bash с установкой переменных окружения на основе внешних данных (манипуляция с подобными suid-программами может привести к повышению привилегий в системе). В том числе могут быть атакованы CGI-скрипты (написанные на bash или в которых вызывается bash), bash-прослойка для FastCGI, dhclient, CUPS и конфигурации OpenSSH.
Текущие версии bash используют переменные окружения для экспорта функций, при этом если в переменной содержится «() {«, то её содержимое воспринимается как функция. Из-за ошибки, после завершения тела функции, обработка продолжается и после символа «}». Если после функции указана команда, то bash выполнит и её (например, «VAR=() { ignored; }; /bin/id»). Уязвимость проявляется для любых переменных окружения, имя не имеет значение.
В случае с OpenSSH атака может быть проведена через подстановку переменной окружения SSH_ORIGINAL_COMMAND:
ssh -o 'rsaauthentication yes' 0 '() { ignored; }; /usr/bin/id'
После выполнения указанной команды в переменную окружения будет скопирована в том числе строка ‘() { ignored; }; /usr/bin/id’, которая инициирует выполнение пустой функции и запуск команды /usr/bin/id на стороне удалённой системы. Аналогичные атаки могут быть проведены через переменную окружения TERM или при запуске CGI-скриптов через переменные REMOTE_USER, HTTP_CUSTOM, QUERY_STRING и т.п. (например, можно передать значение «() {» вместо имени пользователя или в теле HTTP-заголовка «Custom:»).
Для устранения проблемы подготовлена серия патчей. Обновления пакетов с bash уже выпущены для Debian, Ubuntu, RHEL, CentOS. Оценить появление обновлений для других систем можно на следующих страницах: Fedora, openSUSE, SLES, Slackware, Gentoo, OpenBSD, NetBSD, FreeBSD.
Для проверки системы на наличие уязвимости можно выполнить команду:
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
В качестве обходного временного пути защиты может быть применена блокировка по маске через iptables:
iptables using -m string --hex-string '|28 29 20 7B|'