Переполнение буфера в Brotli: уязвимость охватила Node.js, Bun, Envoy и десятки других проектов
В официальной библиотеке Brotli от Google вскрылась опасная уязвимость, получившая идентификатор CVE-2026-111497 и кодовые имена Broccoli2Shell и HTTP2Shell. Проблема, найденная специалистами OpenAI ещё в феврале, приводит к записи данных за пределы выделенного буфера при обработке специально искажённых сжатых потоков. Это открывает дорогу к удалённому выполнению кода на множестве устройств и платформ.
Ядро проблемы скрыто в логике внутренней функции DecodeBlockTypeAndLength. Разработчики реализовали её так, что она возвращает лишь булевы значения true или false, не давая вызывающему коду отличить реальное повреждение потока от простой нехватки входящих данных. Получив некорректный тип блока, декодировщик решал, что нужно просто дочитать недостающие байты, и продолжал запись в область памяти, не предназначенную для такого объёма информации.
В результате затертым оказывалось внутреннее состояние самого декодировщика. Сама ошибка присутствует в кодовой базе начиная с версии 1.0.3, и устранили её только 22 октября в корректирующих сборках Brotli 1.0.10, 1.1.1 и 1.2.1, где некорректные потоки теперь жёстко отбрасываются при распаковке. В тот же день, когда вышли патчи, исследователи создали прототип рабочего эксплоита.
В лабораторных условиях и на нестандартных сборках им удалось выполнить произвольный код, хотя типовые конфигурации отделывались лишь аварийным завершением. Однако позже компания Imperva зафиксировала атаку уже на штатную сборку Node.js 24.22.0 в Linux-окружении на архитектуре ARM64, что подтвердило практическую опасность уязвимости. Масштаб проблемы оказался колоссальным из-за повального распространения формата Brotli в интернете.
Под удар попала масса проектов, которые автоматически работают с HTTP-ответами с заголовком "Content-Encoding: br". Например, в Node.js уязвимость закрыли в версиях 26.12.1, 24.22.1 и 22.23.4, причём опасность представлял как стандартный метод fetch для загрузки контента, так и прямой вызов функций zlib.brotliDecompress. На стороне сервера рисковали проекты на Express 5, обрабатывающие входящие запросы.
В мире Python пострадали пакеты brotli и brotlicffi вместе с популярными HTTP-библиотеками вроде urllib3, aiohttp и Scrapy, которые автоматически декодируют сжатые ответы от внешних сервисов. Разработчики уже предложили исправление в версии 1.2.1. Платформа Bun устранила дыру в релизе 1.4.4, а в прокси-сервере Envoy патчи появились в версиях вплоть до 1.36.12 и 1.40.0.
В браузерах Chrome и Firefox проблему закрыли в одном из предыдущих обновлений, поэтому рядовые пользователи в меньшей степени подвержены риску. Однако для серверной инфраструктуры ситуация сложнее: для nginx существует популярный сторонний модуль ngx_brotli, где версию библиотеки в зависимостях необходимо поднимать до актуальной самостоятельно. В Apache httpd модуль mod_brotli хоть и отключён по умолчанию, но также требует обновления.
Длинный список затронутых проектов включает .NET runtime с его BrotliDecoder и HttpClient, PHP-расширение brotli и Ruby-пакет brotli, где уязвимость пока не закрыта. Исправления в процессе подготовки для СУБД DuckDB, ClickHouse, для Apache Arrow и UEFI-прошивок на базе EDK II, использующих сжатие. В архиваторах NanaZip, 7-Zip-zstd и p7zip проблема по-прежнему остаётся актуальной, как и в просмотрщиках MuPDF, .
Уязвимость также затронула curl и libcurl, если в собранном приложении присутствовала уязвимая версия libbrotlidec, парсеры шрифтов Web Open Font, библиотеку JPEG XL, а также платформу для микросервисов Istio, где патчи выпущены в версиях 1.29.9, 1.30.6 и 1.31.2. История HTTP2Shell — наглядное напоминание о том, как одна ошибка в фундаментальной библиотеке сжатия, встроенной в современный веб, способна поставить под угрозу целые экосистемы от браузера до корпоративных СУБД.
Источник: Оригинал