Уязвимость в Brotli затронула Node.js, Bun, Python и Envoy

Ошибка повреждения памяти CVE-2026-111497 в декодере Brotli при обработке специально сформированных данных может привести к выполнению кода. Исправления уже выпустили Google, Node.js, Bun и ряд других проектов, но обновлять нужно каждый продукт отдельно.

Уязвимость в Brotli затронула Node.js, Bun, Python и Envoy

В декодере сжатия Brotli обнаружена уязвимость CVE-2026-111497, которая затрагивает не только Node.js, но также Bun, Python-пакеты Brotli и brotlicffi, прокси Envoy и другие продукты, использующие этот код. При обработке специально подготовленного Brotli-потока ошибка позволяет записать данные за пределы буфера и повредить память процесса.

Последствия зависят от конкретного приложения и условий эксплуатации: возможны аварийное завершение работы, утечка данных из памяти или выполнение кода, заданного атакующим. Исследователи Imperva продемонстрировали запуск такого кода на неисправленной сборке Node.js 24.22.0 для Linux на ARM64. Эксплойт не опубликован, потребовал нескольких попыток и не проверялся на других сборках. Сообщений об атаках с использованием этой уязвимости пока нет.

Проблема становится доступной для атаки, только когда программа распаковывает Brotli-данные, контролируемые внешней стороной. В Node.js и Bun это, в частности, возможно при получении через встроенный fetch() ответа с заголовком Content-Encoding: br, а также при распаковке Brotli-сжатого тела запроса средствами Express 5 или body-parser 2. Обычный HTTP-сервер Node.js сам по себе тела запросов не декодирует.

Envoy и Istio подвержены проблеме лишь при включённой распаковке Brotli. В Python риск связан с установленными пакетами Brotli или brotlicffi: HTTP-клиенты requests, urllib3, httpx и aiohttp могут автоматически распаковывать Brotli-ответы; приложение может быть подвержено риску, даже если не импортирует Brotli напрямую в собственном коде.

Google устранила проблему в версиях библиотеки Brotli 1.0.10, 1.1.1 и 1.2.1. Для Node.js исправления вышли в версиях 22.23.4, 24.22.1 и 26.12.1; Bun обновился до 1.4.4. Для Python-пакетов выпущены Brotli 1.2.1 и brotlicffi 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 включается в продукты как собственная копия, поэтому обновление одной библиотеки не исправит все зависимые приложения. После обновления необходимо перезапустить сервисы и пересобрать контейнерные образы: работающий процесс продолжает использовать старый декодер.

Если обновление пока невозможно, рекомендуется не распаковывать недоверенные Brotli-данные. Для входящих запросов следует отклонять запросы с Content-Encoding: br до того, как прокси или обработчик начнёт декодирование тела. В Python временной мерой может быть удаление Brotli и brotlicffi, чтобы клиенты перешли на gzip и deflate. Простое исключение br из заголовка Accept-Encoding не считается достаточной защитой: сервер всё равно может отправить Brotli-ответ.