CVE-2014-6271 · CVSS 9.8 CRITICAL · опубликована 24.09.2014
24 сентября 2014 года публичное раскрытие уязвимости в GNU Bash — Shellshock с CVSS 9.8 CRITICAL — вызвало панику среди системных администраторов, и по масштабу возможного ущерба паника была оправданной. Bash — командная оболочка по умолчанию в большинстве Unix/Linux-систем на тот момент, и уязвимость затронула её механизм экспорта функций через переменные окружения. Наиболее доступный вектор атаки — устаревшие CGI-скрипты на веб-серверах, которые передавали части HTTP-запроса прямо в переменные окружения.
Как это работает
У Bash есть механизм: переменные окружения могут нести в себе не только текст, но и определения функций — сериализованные куски кода оболочки, которые интерпретатор «восстанавливает» при запуске. Это легитимная функция для передачи настроек между процессами. Уязвимость состояла в том, что при разборе такой переменной интерпретатор выполнял не только определение функции, но и любой код, который шёл после него в той же строке. То есть содержимое переменной окружения — данных, которые по замыслу являются просто текстом — начинало исполняться.
В веб-контексте это превращается в катастрофу: CGI-скрипт принимает HTTP-запрос и помещает его компоненты (User-Agent, Referer, строку запроса) в переменные окружения, чтобы передать их программе. Злоумышленник подставляет в заголовок вредоносное значение, скрипт вызывает Bash — и Bash исполняет злоумышленника, а не свою функцию. В результате любой веб-сервер с CGI и устаревшей оболочкой превращается в точку удалённого выполнения кода без аутентификации. Архитектурная суть: граница между «данными» и «кодом» оказалась размыта в самом фундаментальном месте — в механизме, которым операционная система передаёт окружение каждому новому процессу.
Реальные последствия
Shellshock был немедленно использован в реальных атаках: в дни после раскрытия были зафиксированы массовые сканирования интернета с попытками эксплуатации, а вредоносные кампании встроили уязвимость в ботнеты для захвата веб-серверов. Под удар попали не только классические веб-хостинги: сетевые устройства, NAS-серверы, встроенные системы и сетевое оборудование часто содержат CGI-интерфейсы управления поверх Bash. Отдельной болью стали устройства, которые давно не получали обновлений прошивки от вендоров. Shellshock стал уроком о том, как «наследственный» код — механизм, существовавший десятилетиями — может вдруг стать критической уязвимостью в новом контексте (интернет вещей, веб-интерфейсы).
Что делать
Ключевая мера — обновление Bash до исправленной версии через пакетный менеджер дистрибутива; все основные вендоры выпустили патчи в первые дни. Дополнительные барьеры: перевод веб-приложений с CGI на более современные модели (FastCGI, WSGI, языковые рантаймы), изоляция веб-сервера от системы (chroot, контейнеры, минимальные привилегии пользователя веб-сервера), фильтрация аномальных символов в HTTP-заголовках на уровне WAF. Для сетевых устройств — обновление прошивок или замена устройств, не получающих поддержки. Мораль: любой код, исполняющий данные извне, должен иметь жёсткую границу доверия, а legacy-механизмы — регулярно пересматриваться.