Ошибка Brotli затронула Node.js, Bun, Python и прокси Envoy

В декодере Google Brotli выявлена уязвимость CVE-2026-111497 с оценкой 9,2 по CVSS 4.0: она затрагивает Node.js, Bun, Python-пакеты Brotli и brotlicffi, а также Envoy и Istio при включённой распаковке Brotli. Imperva продемонстрировала выполнение кода на непропатченном Node.js 24.22.0 для Linux ARM64.
Ошибка повреждения памяти позволяет специально сформированному сжатому потоку записывать данные за пределы буфера. Возможные последствия включают аварийное завершение процесса, утечку памяти и выполнение кода, контролируемого атакующим. Сообщений об эксплуатации в реальных атаках на момент публикации не было.
Какие компоненты получили исправления
Проблема находится в C-коде, который распаковывает поток Brotli. Поэтому она распространяется на программы, поставляющие собственную копию этого декодера. Google выпустила исправленные версии библиотеки 1.0.10, 1.1.1 и 1.2.1; изменение в исходном коде появилось ещё 27 февраля, но релиз с ним вышел только 21 октября.
Для Node.js исправления доступны в версиях 22.23.4, 24.22.1 и 26.12.1. Bun устранил ошибку в 1.4.4. Пакеты Python Brotli и brotlicffi исправлены в версиях 1.2.1 и 1.2.1.0 соответственно. Envoy получил обновления 1.40.0, 1.39.3, 1.38.6, 1.37.8 и 1.36.12, а Istio — 1.31.2, 1.30.6 и 1.29.9.
Когда возникает риск
Уязвимым считается не любой сервис с установленным компонентом, а тот, который распаковывает Brotli-данные, контролируемые внешней стороной. В Node.js и Bun такой путь возможен, когда встроенный fetch() получает ответ с заголовком Content-Encoding: br, либо когда Express 5 и body-parser распаковывают сжатое тело запроса. Обычный HTTP-сервер Node.js не декодирует тела запросов самостоятельно.
Envoy и Istio подвержены риску только при включённом декодировании Brotli, например через фильтр Envoy. В Python установка Brotli или brotlicffi может быть достаточной: requests, urllib3, httpx и aiohttp способны автоматически распаковывать Brotli-ответы, даже если приложение не импортирует библиотеку напрямую.
Что проверить администраторам
OpenAI, чья команда Codex Security сообщила об ошибке, отмечает два сценария: непропатченный сервер, принимающий сжатые входные данные, может быть атакован клиентом, а непропатченный клиент, принимающий сжатые ответы, — вредоносным сервером. Imperva доставила тестовую нагрузку и в ответ на fetch-запрос, и в тело запроса Express; опубликованного надёжного proof-of-concept для выполнения кода нет.
Приоритетная мера — обновить рантаймы, библиотеки и прокси до исправленных версий, затем пересобрать контейнерные образы и перезапустить сервисы. Если обновление временно невозможно, следует отключить обработку недоверенных Brotli-данных: отклонять входящие запросы с Content-Encoding: br до прокси или парсера и отключать автоматическое декодирование ответов в HTTP-клиентах. Для Python в качестве временного шага можно удалить Brotli и brotlicffi; отказ от заголовка Accept-Encoding сам по себе не гарантирует защиту.
Бизнесу стоит вручную сверить версии в окружениях и образах: сканеры зависимостей могут пока не обнаруживать Python-пакеты, поскольку запись CVE указывает на репозиторий Google Brotli. Обновление с последующим перезапуском остаётся единственным заявленным исправлением для Node.js.

