Дыра в Brotli позволяет вредоносному серверу захватить приложения на Node.js и Python

24.10.2026 4 мин 7

Ошибка в декодере Brotli от Google позволяет специально собранному сжатому потоку записать данные за пределы буфера в памяти. Уязвимость получила номер CVE-2026-111497 и 9,2 балла из 10 в бюллетене GitHub, затронуты версии Brotli с 1.0.3 по 1.2.0. На Brotli держится сжатие значительной части веб-трафика, поэтому проблема выходит далеко за пределы одной библиотеки: уязвимый код встроен или подгружается в Node.js, Bun, Envoy, Istio и в Python-пакеты, которые requests и aiohttp подключают сами. Исправления вышли 21-23 октября.

В чём ошибка

Поток Brotli разбит на блоки, и декодер по ходу чтения переключается между их типами. Как объясняет бюллетень Node.js, недопустимое переключение блока декодер принимал не за ошибку формата, а за временную нехватку входных данных. Он продолжал дописывать байты атакующего во внутренний буфер размером восемь байт и выходил за его границу. В зависимости от того, что окажется перезаписано, итогом становится сбой, утечка памяти процесса или выполнение чужого кода.

О проблеме сообщили в Node.js Кхай Тран и Сильви Майер из OpenAI Codex Security. Google выпустила исправленные Brotli 1.0.10, 1.1.1 и 1.2.1, а Node.js 21 октября выпустил версии 22.23.4, 24.22.1 и 26.12.1. Для Node.js 20 и других снятых с поддержки веток исправления не будет.

Атака работает в обе стороны

Декодер срабатывает везде, где приходят сжатые данные, поэтому мишенью может стать любая сторона соединения. Вредоносный сервер может атаковать клиента: встроенный в Node fetch() автоматически распаковывает ответы в Brotli, как и Python-библиотеки requests, urllib3 и aiohttp, если установлен пакет Brotli. Импортировать его в своём коде для этого не нужно. Вебхуки, превью ссылок, краулеры и функции «импорт по ссылке» постоянно забирают данные с чужих серверов.

В обратную сторону клиент может атаковать сервер, который распаковывает тела запросов. Express версий 5.0.0-5.3.0 и body-parser 2.0.0-2.3.0 распаковывают Brotli в парсерах raw() и json(). Команда Imperva Red Team выполнила свой код на официальной сборке Node.js 24.22.0 обоими путями: через полученный ответ и через тело запроса в Express. Это удалось не с первой попытки, сам эксплойт Imperva не публикует.

Насколько широко

Ошибка сидит в эталонном декодере на C от Google, а многие проекты носят с собой его собственную копию. Сводка затронутого ПО на сайте broccoli2shell.com отмечает исправления в Bun 1.4.4, Envoy, Istio, Chromium, Firefox, ngx_brotli и Python-пакетах Brotli 1.2.1 и brotlicffi 1.2.1.0. На 24 октября без исправления там числились копии в .NET, расширениях brotli для PHP и Ruby, DuckDB, ClickHouse, Apache Arrow, библиотеке JPEG XL, форках 7-Zip и MuPDF.

Общую библиотеку libbrotli дистрибутивы Linux обновляют отдельно. Debian, например, уже закрыл уязвимость обновлениями безопасности для bookworm и trixie. 22 октября на GitHub появился публичный эксплойт-прототип, но, по имеющимся данным, код он выполняет только на специально ослабленной сборке. Атак в реальных условиях к тому моменту не фиксировали.

Что проверить

  • Браузер: Chrome, Edge и Firefox распаковывают Brotli почти на каждой странице. Установите последнее обновление и перезапустите браузер.
  • Node.js и Bun: выполните node --version. Всё ниже 22.23.4, 24.22.1 или 26.12.1, а также ветки без поддержки вроде 20 нужно обновить. Bun нужен версии 1.4.4 или новее.
  • Python: выполните pip show Brotli brotlicffi. Если версия ниже 1.2.1, обновите пакет или удалите его, тогда requests перейдёт на gzip.
  • Сервер: поставьте обновление libbrotli из дистрибутива и перезапустите все службы, которые её используют. Запущенный процесс держит старый декодер в памяти до перезапуска.

Последний пункт легко упустить. Пакетный менеджер может поставить исправление ночью, а PHP, Python и другие долгоживущие процессы будут неделями работать со старой копией. Для тех, кто держит свой сервер, это уже вторая за месяц история «обнови и перезапусти» после уязвимостей в NGINX.

brotlinode.jspythongoogleуязвимостьbunopenaiimpervalinuxсерверыбраузерыоткрытый код

Читайте также