Bash без im: как используют и закрывают крупнейшую уязвимость

Технологии
автор: Андрей Васильков  30 сентября 2014

В сентябре были найдены несколько ошибок в командном процессоре 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 и его аналогах ещё неопределённо долго, поскольку нет единого механизма выявления проблемных систем и их оперативного обновления.

Поделиться
Поделиться
Tweet
Google
 
Читайте также
Shellshock? Переживём
Shellshock? Переживём
Red Hat согласно санкциям отключает поддержку промышленного дистрибутива Linux российским компаниям
Red Hat согласно санкциям отключает поддержку промышленного дистрибутива Linux российским компаниям
Tails — сверхзащищённая сборка Linux, которой пользуется Эдвард Сноуден
Tails — сверхзащищённая сборка Linux, которой пользуется Эдвард Сноуден
  • Злой

    Уже зевоту вызывает…

  • рашкойоп

    роисся впердe!

  • Asho

    Ну не надо вот столько паники. Во-первых многие сервера молотят в DMZ огороженные файерволами, т. е. на прямую сервера мало кто в здравом уме в интернет отдаёт, во-вторых есть встроенные средства контроля типа SELinux.
    А так:
    $ echo $BASH_VERSION
    4.1.2(1)-release

    env a=’() { :;}; echo vulnerable’ bash
    bash: syntax error near unexpected token `(‘

    И это на машине где паранойя не разгулялись.

    • Крицкий Юрий

      Вот правильная строка команды:
      env a='() { :;}; echo vulnerable’ bash

  • Крицкий Юрий

    Напишите яснее, а то ничего из указанного не воспроизводится:

    $ echo $BASH_VERSION
    3.2.51(1)-release

    $ VAR=() { fucnt; }; echo: «test»
    -bash: syntax error near unexpected token `}’

    $ env a=’() { :;}; echo vulnerable’ bash
    -bash: syntax error near unexpected token `(‘

    $ http-header = Cookie:() { :; }; ping -c 3 209.126.230.74
    -bash: syntax error near unexpected token `(‘

  • John Doe

    Не работай под рутом.

  • Maxim Akristiniy

    Не все команды можно выполнить таким способом, например vi не запустить.
    И привилегии в системе не поднять.

Хостинг "ИТ-ГРАД"
© ООО "Компьютерра-Онлайн", 1997-2017
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.
«Партнер Рамблера» Почта защищена сервером "СПАМОРЕЗ" Хостинг "Fornex"