Ошибка Brotli открыла путь к RCE в Node.js, Bun и других системах

CVE-2026-111497 — ошибка повреждения памяти в декодере Google Brotli, написанном на C. Brotli сжимает веб-страницы и другой сетевой трафик. Если программа обрабатывает специально подготовленные данные Brotli, декодер может записать их за пределами буфера и повредить память. В зависимости от программы и обстоятельств результатом могут стать сбой, утечка данных из памяти или выполнение кода, выбранного атакующим. Уязвимость раскрыли 21 октября 2026 года.
Декодер Brotli встроен в разные продукты, но каждый из них может поставлять собственную копию библиотеки. Поэтому исправление в одном проекте не обновляет остальные: их сопровождающим нужно выпускать отдельные версии. Уязвимы версии Google Brotli от 1.0.3 до 1.2.0; исправления вышли в ветках 1.0.10, 1.1.1 и 1.2.1.
В Node.js уязвимы ветки 22.x, 24.x и 26.x до исправления; версии 20.x и старше уже сняты с поддержки. Обновления: 22.23.4, 24.22.1 и 26.12.1. Риск возникает, когда встроенный fetch() распаковывает ответ с Content-Encoding: br или когда приложение разбирает тело запроса с Brotli-сжатием, например через Express 5 или body-parser 2. Обычный HTTP-сервер Node.js сам по себе тела запросов не распаковывает. В Bun уязвимы версии 1.4.3 и старше, исправлена 1.4.4; опасность связана с fetch() и использованием node:zlib.
Для Envoy уязвимы версии 1.39.2, 1.38.5, 1.37.7 и 1.36.11; исправления выпущены в 1.40.0, 1.39.3, 1.38.6, 1.37.8 и 1.36.12. Ошибка достижима, только если настроен декомпрессор Brotli, например через фильтр Envoy. В Istio затронуты версии 1.31.0–1.31.1, 1.30.0–1.30.5 и 1.29.0–1.29.8; исправленные версии — 1.31.2, 1.30.6 и 1.29.9. Здесь также требуется включённая распаковка Brotli.
В Python риск может появиться после установки пакета Brotli версии 1.2.0 или старше; исправлена версия 1.2.1. Для brotlicffi уязвимы версии 1.2.0.x и старше, исправление — 1.2.1.0. HTTP-клиенты requests, urllib3, httpx и aiohttp способны автоматически распаковывать ответы Brotli, даже если приложение напрямую не импортирует библиотеку. В cdxgen уязвимы отдельные исполняемые файлы и образы версий 13.4.0 и 12.8.8 или старше; исправления — 13.5.0 и 12.8.9. Опасен запуск такого файла или образа при сканировании недоверенных данных.
Международная команда Imperva Red Team назвала свою работу Node2Shell. Ей удалось выполнить переданный атакующим код на неизменённой сборке Node.js 24.22.0 под Linux на ARM64. Вредоносные данные доставляли двумя способами: в ответе, полученном через fetch(), и в теле запроса Express. Для успеха потребовалось несколько попыток; эксплойт не опубликован и на других сборках не проверялся. Выполнение кода в остальных затронутых программах не демонстрировали. Сообщений о реальных атаках нет: в оценке CISA от 23 октября указаны «нет» для эксплуатации и «нет» для автоматизации. Red Hat заявила, что надёжного публичного подтверждения выполнения кода нет.
Уязвимость обнаружила команда Codex Security компании OpenAI. OpenAI описывает её как возможность удалённого выполнения кода без аутентификации и среди затронутого ПО называет Node.js, Bun и Envoy. Оценки серьёзности различаются: Google, присвоившая CVE, поставила 9,2 по CVSS 4.0 и назвала уязвимость критической; Node.js оценивает её как высокую, Red Hat — в 8,1 балла, уровень «важная». В Node.js за сообщение об ошибке поблагодарили Кхая Трана и Сильви Майер из OpenAI Codex Security, а за исправление — сопровождающих Маттео Коллину и Антуана дю Амеля.
Исправляющий код попал в исходники Brotli 27 февраля 2026 года, но релиз с этим изменением вышел лишь 21 октября. OpenAI объяснила задержку так: «Корневая причина была исправлена в исходном коде Brotli ещё в феврале, но тогда не знали, что она создаёт уязвимость, и более позднего выпуска Brotli не было». Пока обновление не установлено, работающий процесс продолжает использовать старый декодер. Поэтому после обновления службы её нужно перезапустить, а контейнерные образы — пересобрать.
Основной способ защиты — перейти на исправленные версии. Если сделать это сразу нельзя, OpenAI и компания Aikido рекомендуют отклонять запросы с Content-Encoding: br до того, как прокси или парсер начнёт распаковку; отключить автоматическое декодирование Brotli в HTTP-клиентах и отбрасывать такие ответы до распаковки. В Python можно удалить пакеты Brotli и brotlicffi: клиенты смогут использовать gzip и deflate. Удаление br из заголовка Accept-Encoding само по себе не защищает: сервер всё равно может прислать Brotli-данные. Для Node.js опубликованного обходного решения нет — требуется обновить среду выполнения.
Исправления в системных пакетах выходят не одновременно. Debian выпустил патч для Debian 13 (trixie) 23 октября: версия Brotli 1.1.0-2+deb13u1. По состоянию на 22 октября Amazon Linux 2023 всё ещё отмечал пакеты Brotli и Node.js 24 как ожидающие исправления. Сканеры зависимостей также могут не обнаруживать Python-пакеты: в записи CVE указана репозитория Google Brotli, но не пакеты PyPI, а в GitHub Advisory на тот момент не значился ни один затронутый пакет. На эту запись ориентируется Dependabot. Отдельные рекомендации для Python — PYSEC-2026-4322 и PYSEC-2026-4323 — добавили 23 октября; установленные версии пакетов стоит проверить вручную.


Новое на сайте

Ссылка