Критическая уязвимость в декодировщике Brotli, затрагивающая Node.JS, Bun, браузеры, HTTP-клиенты и другие проекты

В библиотеке с эталонной реализацией декодировщика формата сжатия данных Brotli выявлена уязвимость (CVE-2026-111497, кодовые имена Broccoli2Shell и HTTP2Shell), приводящая к переполнению буфера при обработке специально оформленных сжатых данных. По данным Google уязвимость может использоваться для удалённого выполнения кода при атаке на проекты, использующие официальную реализацию декодировщика Brotli. Среди затрагиваемых уязвимостью проектов: Node.js, Bun, Envoy, Istio, web-браузеры, прокси-серверы, HTTP-клиенты, HTTP-серверы, архиваторы, прокси-серверы, UEFI-прошивки, просмотрщики JPEG XL, декодирующие контент библиотеки для Python, Ruby, Java, PHP и .NET и связанные с ними зависимости.

Проблема была выявлена компанией OpenAI в феврале этого года и блокирована в кодовой базе Brotli через отбрасывание некорректных потоков при декодировании. 22 октября были опубликованы корректирующие выпуски Brotli 1.0.10, 1.1.1 и 1.2.1 в которых явно было заявлено об устранении уязвимости и исправлена суть проблемы. В этот же день был создан прототип эксплоита, позволивший удалённо выполнить код в лабораторных условиях, при использовании нестандартных сборок (в стандартных сборках происходило аварийное завершение). Позднее компания Imperva зафиксировала атаку на штатные сборки Node.js 24.22.0 в Linux-окружении на системе ARM64.

Уязвимость приводит к записи за пределы буфера из-за некорректной обработки ошибок в процессе разбора блоков в сжатом потоке. Функция DecodeBlockTypeAndLength() вместо кода ошибки возвращала только значения true и false, что не позволяло вызывающему коду отличить повреждение потока от состояния, требующего передачи в функцию дополнительных данных. В случае указания в потоке некорректного типа блока сжатых данных, декодировщик воспринимал его не как ошибку, а как состояние нехватки данных, требующее дополнительного чтения из потока. Но так как выделенный буфер не был рассчитан на дополнительно прочитанные данные, они записывались в область за его пределами, в которой хранилось внутреннее состояние декодировщика.

Подверженные уязвимости проекты:

  • Эталонная библиотека brotli, проблема проявляется начиная с выпуска 1.0.3 и устранена в обновления 1.0.10, 1.1.1 и 1.2.1. Уязвимость затрагивает приложения и библиотеки, использующие библиотеку libbrotlidec.
  • JavaScript платформа Node.js, проблема устранена в обновлениях 26.12.1, 24.22.1 и 22.23.4. Атакованы могут быть приложения, использующие для запроса стороннего контента метод fetch(), который автоматически декодирует HTTP-ответы с заголовком «Content-Encoding: br». Также уязвимость проявляется при прямом вызове методов zlib.brotliDecompress*(), createBrotliDecompress() и brotli.decompress() для распаковки стороннего содержимого или при приёме HTTP-запросов с разбором через библиотеки Express 5 и body-parser 2.x.
  • Python-пакеты brotli и brotlicffi (исправление предложено в версии 1.2.1) и использующие их проекты, среди которые популярные библиотеки urllib3, aiohttp, httpx и Scrapy, которые декодируют ответы с заголовком «Content-Encoding: br» при обращении к внешним web-ресурсам.
  • HTTP-серверы, HTTP-прокси, HTTP-клиенты и web-браузеры, поддерживающие сжатие Brotli («Accept-Encoding: br»). В Apache httpd поставляется mod_brotli (отключён по умолчанию). Для nginx доступен сторонний модуль ngx_brotli (уязвимость уже устранена). В Chrome/Chromium и Firefox проблема уже устранена в одном из прошлых обновлений. В прокси-сервере Envoy уязвимость устранена в выпусках 1.40.0, 1.39.3, 1.38.6, 1.37.8, 1.36.12.
  • .NET runtime при использовании в приложении методов BrotliDecoder, BrotliStream и HttpClient. Уязвимость пока не устранена.
  • PHP-расширение brotli при использовании функции brotli_uncompress(). Исправление в процессе подготовки.
  • Ruby-пакет brotli при использовании метода Brotli.inflate. Уязвимость пока не устранена.
  • СУБД DuckDB при импорте сжатых Parquet-файлов. Исправление в процессе подготовки.
  • СУБД ClickHouse. Исправление в процессе подготовки.
  • СУБД YDB. Уязвимость пока не устранена.
  • Apache Arrow при импорте сжатых Parquet-файлов. Исправление в процессе подготовки.
  • libjxl (при сжатии метаданных в JPEG XL используется Brotli).
    Исправление в процессе подготовки.
  • Архиваторы NanaZip, 7-Zip-zstd и p7zip при распаковке br-файлов. Уязвимость не устранена.
  • MuPDF. Уязвимость не устранена.
  • UEFI-прошивки на базе EDK II и UEFITool, сжатые при помощи Brotli. Исправление в процессе подготовки — EDK II и UEFITool.
  • JavaScript-платформа Bun. Уязвимость устранена в версии 1.4.4.
  • Платформа для управления микросервисами Istio. Уязвимость устранена в версиях 1.29.9, 1.30.6 и 1.31.2.
  • curl и libcurl, уязвимость проявляется при наличии в зависимостях уязвимой версии libbrotlidec.
  • Парсеры формата шрифтов Web Open Font (WOFF), в котором используется
    Brotli.

  • Brotli4j, SumatraPDF, Ghostscript, CatBoost и YTsaurus. Уязвимость устранена в одном из обновлений.

Источник: http://www.opennet.ru/opennews/art.shtml?num=66537