В сентябре были найдены несколько ошибок в командном процессоре Bash, использующемся в большинстве дистрибутивов Linux и некоторых UNIX-подобных системах, включая Mac OS X. Различные версии этого интерпретатора и основанные на нём модификации командной оболочки распространены крайне широко. Они встречаются не только в персональных компьютерах, но и на серверах, маршрутизаторах, точках доступа, камерах наблюдения и мобильных устройствах. Все они оказались под ударом, и на этот раз проблема не решится простым написанием патчей.

Как и большинство командных процессоров, Bash поддерживает работу с функциями и переменными, включая переменные окружения. Суть проблемы в том, что если записать переменную среды как функцию и внедрить в её определение какие-либо команды, то они будут выполнены без проверки. Например, если написать команду «echo: test» сразу после объявления функции «funct», то на экране отобразится «test», хотя эта часть указана неверно и должна игнорироваться.

VAR=() { fucnt; }; echo: “test”

Иными словами, любые команды можно передать при указании значения переменной, и Bash их выполнит. Эксперт компании Errata Security Роберт Грэм (Robert Graham) приводит пример, в котором заставляет удалённую машину пинговать его компьютер. Это стало возможным из-за некорректной обработки её интерпретатором Bash изменённого запроса на сохранение Cookie.

http-header = Cookie:() { :; }; ping -c 3 209.126.230.74

Обратите внимание: удалённая команда выполнить пинг указанного IP-адреса тоже передаётся после объявления функции. «Серьезность найденной уязвимости состоит в том, что командная оболочка Bash используется огромным количеством программ», – писал Роберт Грэм. В список потенциально уязвимого оборудования попадают также рутированные смартфоны и планшеты с ОС Android, гаджеты с iOS, для которых был выполнен jailbreak, и многие камеры наблюдения. Как это будет выглядеть на практике? Примерно вот так.

Удалённый доступ к одной из камер службы безопасности в Ванкувере (фото: А.В.).
Удалённый доступ к одной из камер службы безопасности в Ванкувере (фото: А.В.).

Прошивка большинства IP-камер представляет собой один из вариантов Linux, адаптированный для встраиваемых систем. У них и так полно специфических проблем с ограничением доступа, но уязвимость в bash открывает новые возможности. Она позволяет ещё легче атаковать их, а в отдельных случаях даже получать удалённый доступ к управляющим системам.

Впрочем, основной целью явно станут серверы. На веб-серверах (особенно Apache с модулем mod_cgi) Bash часто используется для выполнения CGI-скриптов. Поэтому они и рассматриваются как главное направление атаки, выполняемой за счёт отправки изменённых HTTP-запросов. Процесс поиска уязвимых серверов уже автоматизирован. Сегодня функционируют ботнеты, определяющих и поражающих уязвимые системы.

Среди других возможных вариантов использования уязвимостей в Bash рассматривают атаку на OpenSSH, PHP и Pyton, а также получение имени пользователя, встраиваемого в заголовок авторизации, с помощью переменной REMOTE_USER. Представляют опасность и атаки по типу «отказ в обслуживании». На уязвимых системах легко устроить флуд обычным пингом или загрузить сервер бесконечной обработкой циклического запроса GET.

Уязвимость, получившая название Shellshock или Bashdoor – это следствие не единичной ошибки в Bash, а нарушения принципов обработки экспортированных функций и переменных. Из-за некорректной интерпретации синтаксиса на уязвимых системах становится возможным удалённо запустить произвольные команды – загрузить любой файл или получить доступ к файлам конфигурации. В первом случае удалённый компьютер будет заражён, а во втором – атакующая сторона получит пароли и возьмёт сервер под свой полный контроль.

Shellshock - Tux отделается лёгкой контузией, если Bash вовремя уведут из-под обстрела (изображение: Stanley Q Woodvine).
Shellshock – Tux отделается лёгкой контузией, если Bash вовремя уведут из-под обстрела (изображение: Stanley Q Woodvine).

О первой ошибке стало известно ещё 12 сентября. Её нашёл Стефан Чазелас (Stéphane Chazelas) – сотрудник компании Akamai, активно участвующий во многих проектах с открытым исходным кодом. Соответствующий бюллетень CVE-2014-6271 в базе MITRE был скрыт от посторонних глаз почти на две недели. Это было сделано для того, чтобы дать разработчикам время устранить уязвимость раньше, чем ей смогут воспользуются злоумышленники. Однако к моменту истечения срока ожидания выяснилось, что ошибка не единичная, а написанные патчи лишь частично решают проблему.

Как показывает анализ плохо сохранившейся истории изменений, первая ошибка такого рода вкралась в Bash примерно в 1992 году – спустя четырнадцать лет после появления его первой версии. Как раз в это время Брайан Фокс (Brian J. Fox) прекратил работу над усовершенствованиями интерпретатора, и дальше его продолжили развивать силами сообщества. Уязвимость появилась в ходе расширения функциональности командной оболочки “всем миром” и двадцать два года оставалась без внимания.

Для Red Hat, Debian, CentOS и их форков уже вышли патчи, доступные через официальные репозитории. Apple выпустила обновления для Mac OS X Mavericks Lion и Mountain Lion Для OS X Yosemite исправления пока нет. Ссылки на исправления для Bash версий 3.0 – 4.3 были добавлены в бюллетень разработчиком GNU bash Четом Рэми (Chet Ramey).

Как известно, беда не приходит одна. В минувшие выходные при анализе кода Bash сотрудник Google Михаил Залевский обнаружил уязвимости другого рода, также допускающие удалённое выполнение кода. Их описанию посвящены другие бюллетени: CVE-2014-6277 и CVE-2014-6278. Они не касаются пользователей FreeBSD, NetBSD и OpenBSD, поскольку используемые в этих ОС версии bash сильно модифицированы.

Инженер по информационной безопасности Google Тави Орманди (Tavis Ormandy) нашёл другую ошибку, являющуюся следствием неполного устранения первой из найденных в сентябре уязвимостей Bash. Подробности будут опубликованы в следующем бюллетене после проверки исправлений.

На этом список уязвимостей Bash, основанных на ошибках в обработке команд, не заканчивается. За время написания статьи появились сообщения о трёх новых баг-репортах, находящихся на рассмотрении. Выполнить первичную проверку своей системы на присутствие уязвимости Bashdoor можно разными способами. Простейший из них – набрать в Bash следующий код:

env a='() { :;}; echo vulnerable’ bash

Здесь команда echo, отображающая на экране слово «vulnerable» указана как часть присваиваемого значения переменной «а». Исправленная версия bash выводит на экран сообщение об ошибке в синтаксисе. Потенциально уязвимыми считаются все версии Bash до 4.3 включительно. Проверить установленную версию можно следующей командой.

echo $BASH_VERSION

Эксперты считают, что уязвимости такого рода продолжат существовать в командном интерпретаторе Bash и его аналогах ещё неопределённо долго, поскольку нет единого механизма выявления проблемных систем и их оперативного обновления.