Декодер сжатия превратился в шелл
Декодер сжатия превратился в шелл Если ты думал, что алгоритмы сжатия данных абсолютно безобидны, то встроенный распаковщик Brotli только что передал пламенный привет всей серверной инфраструктуре. Разработчики Node.js экстренно выкатили патчи сразу для всех поддерживаемых веток - 22.x, 24.x и 26.x, закрывая десяток дыр. Вишенкой на торте стал критический баг CVE-2026-111497 с оценкой 9.2 по CVSS, получивший звучные имена Node2Shell, HTTPS2Shell и Broccoli2Shell. Под раздачу попал не только Node.js, но и Bun, прокси Envoy, service mesh Istio и популярные библиотеки Python. 🔥 Архитектурный косяк Проблема зарыта в низкоуровневом C-коде декодера Brotli от Google, который поставляется вкомпилированным прямо в ядро рантайма Node.js. Уязвимость классифицируется как out-of-bounds write - некорректная запись за пределы выделенного в памяти буфера. Вот что сразу бросилось в глаза нашей исследовательской братии: - Сбой происходит на этапе переключения блоков сжатых данных (block-switch processing), когда парсер ложно принимает битый заголовок за сигнал о нехватке входящего потока. - Декодер продолжает молотить память в невалидном состоянии и перетирает соседние системные структуры. - Для триггера не нужны учетные записи: достаточно скормить приложению вредоносный сжатый поток байтов с заголовком Content-Encoding: br. Механика эксплуатации Атака разворачивается сразу по двум типовым сценариям взаимодействия клиент-сервер. Первый вектор - входящий POST-запрос с пейлоадом в теле, который бекенд послушно распаковывает через Express или body-parser. Второй - когда сам сервер Node.js выступает клиентом и дергает внешний ресурс через fetch(), получая в ответ отравленный сжатый ответ от подконтрольного атакующему хоста. Команда Imperva Red Team уже доказала практическую реализуемость RCE: скрафченный поток байтов перезаписывает указатели и приводит к исполнению команд прямо в контексте запущенного процесса. Когда PoC-эксплойт падает в публичный доступ за считанные часы, медлить с патчами смерти подобно. 🔍💣 Мнение специалиста о хрупкости экосистем Как специалист по безопасности, подчеркну очевидное: это наглядный пример классической уязвимости в цепочке поставок низкоуровневых зависимостей. 🛡 Разработчики годами упаковывают нативный код десятилетней давности внутрь высокоуровневых сред вроде Node.js или Python, слепо надеясь на непогрешимость базовых алгоритмов. Когда дыра в одном вспомогательном парсере сжатия способна пробить изоляцию контейнеров и скомпрометировать ingress-шлюзы вроде Envoy или Istio, безопасность нельзя сводить к банальной проверке прав доступа. Если приложение слепо декомпрессирует сырой трафик из непроверенных источников, периметр уже де-факто пробит. Чеклист патчинга и защиты периметра Пока ботнеты не начали массово стучаться в ваши эндпоинты, внедряем защитный регламент: ⚙🚨 - Обновить Node.js до безопасных сборок: 22.23.4, 24.22.1 или 26.12.1. - Обновить альтернативные среды: Bun до версии 1.4.4+, а также пакеты brotli и brotlicffi в проектах на Python. - Накатить апдейты на балансировщики Envoy (1.36.12+, 1.37.8+, 1.38.6+, 1.39.3+, 1.40.0+) и Istio (1.29.9+, 1.30.6+, 1.31.2+). - Временно отключить автоматическую распаковку br на шлюзах, если оперативное обновление бинарников невозможно.