24 октября 2026 года OpenNet разобрал критическую дыру в эталонном декодировщике Google Brotli: CVE-2026-111497, кодовые имена Broccoli2Shell, HTTP2Shell и Node2Shell. По данным Google чужой сжатый поток может испортить память процесса, отдать её содержимое, уронить сервис или в худшем случае запустить код. Оценка в записи CVE: CVSS 4.0 около 9.2 Critical.
Brotli это формат сжатия веб-трафика, альтернатива gzip. Его эталонная библиотека сидит внутри Node.js, Bun, HTTP-клиентов, прокси, СУБД и кучи других проектов. Если приложение само распаковывает ответ или запрос с Content-Encoding: br, дыра уже у вас в процессе, даже если «Brotli отдельно» вы не ставили.

Что сломалось в DecodeBlockTypeAndLength
Баг в c/dec/decode.c. Функция DecodeBlockTypeAndLength() возвращала только true/false, а не код ошибки. При некорректном типе блока декодировщик воспринимал это не как порчу потока, а как «нужно ещё данных». Буфер на эти байты не был рассчитан, и они уходили за его край, прямо во внутреннее состояние декодера. Отсюда переполнение, порча памяти и путь к RCE.
По данным OpenNet проблему нашла OpenAI ещё в феврале: в коде поток стали отбрасывать, но релизы с явным CVE и исправлением сути вышли 22 октября 2026. В тот же день появился лабораторный эксплойт; позже Imperva показала атаку на штатную сборку Node.js 24.22.0 под Linux ARM64.

Какие версии Brotli и рантаймов закрыты
Эталонная библиотека brotli уязвима начиная с 1.0.3. Уже пропатченные ветки: 1.0.10, 1.1.1 и 1.2.1. Google в релизах прямо пишет: out-of-bounds write permits remote code execution.

Node.js закрыл дыру в октябрьских security releases: 26.12.1, 24.22.1 и 22.23.4. Риск там, где приложение ходит наружу через fetch() (он сам принимает Content-Encoding: br), или где вызывают zlib.brotliDecompress* / createBrotliDecompress, или где входящие тела разбирают Express 5 и body-parser 2.x.

Bun закрыл в 1.4.4 (поднял brotli до 1.2.1). Затронуты fetch, API из node:zlib и DecompressionStream с форматом brotli. Собранные через bun build --compile бинарники остаются уязвимыми, пока их не пересоберёте на 1.4.4. Подробности в advisory GHSA-663w-cv8g-jj2p.

Python, прокси и то, где патча ещё нет
Пакеты brotli и brotlicffi для Python: исправление в линейке 1.2.1. Через них дыра тянется в urllib3, aiohttp, httpx и Scrapy, если они декодируют ответы с br.
По сводке OpenNet уже закрыты: Chrome/Firefox (раньше), ngx_brotli, Envoy (1.40.0, 1.39.3, 1.38.6, 1.37.8, 1.36.12), Istio (1.29.9, 1.30.6, 1.31.2). У curl/libcurl риск появляется, если в зависимостях лежит уязвимый libbrotlidec.
Пока без готового патча или ещё в работе, по тому же перечню OpenNet: .NET (BrotliDecoder, BrotliStream, HttpClient), PHP-расширение brotli, Ruby-пакет brotli, DuckDB, ClickHouse, YDB, Apache Arrow, libjxl, часть архиваторов (NanaZip, 7-Zip-zstd, p7zip), MuPDF, а также EDK II / UEFITool. Имеет смысл смотреть обновления у своих дистрибутивов и вендоров.
Если у вас на сервере Node.js, Bun, Python HTTP-клиенты с brotli или прокси на Envoy/Istio, обновите рантайм или библиотеку до закрытых версий и пересоберите то, что бандлит свой декодер. Отдельный «выключатель Brotli навсегда» в стеке обычно не нужен: достаточно свежего декодировщика.
