Переполнение буфера в декодере Brotli открывает путь к выполнению кода в Node.js, Envoy и Istio

Brotli

Декодер Brotli распаковывает данные, сжатые методом Brotli, и применяется для уменьшения объёма передаваемых данных. Запись за пределы выделенной памяти в этом декодере, получившая название Broccoli2Shell, позволяет неаутентифицированному атакующему повредить память процесса, прочитать конфиденциальные сведения, аварийно завершить процесс или выполнить собственный код с его правами. Затронуты Node.js, Bun, Envoy Proxy, Istio, а также библиотеки для Python и Go, которые включают уязвимый декодер.

Механика CVE-2026-111497 и условия эксплуатации

Сбой возникает при обработке блоков сжатого потока: декодер неверно определяет границы буфера и записывает байты за его пределами. Чтобы атака сработала, приложение или одна из его зависимостей должны распаковывать данные, которыми управляет атакующий. Источником таких данных бывает входящий HTTP-запрос, ответ внешнего сервера или загруженный файл. Часть HTTP-клиентов и прикладных фреймворков распаковывает Brotli автоматически, поэтому приложение может оставаться уязвимым, даже если в его коде Brotli не упоминается.

Атака идёт по сети, учётные данные не нужны. Числовой оценки CVSS 4.0 (общей системы оценки уязвимостей) 9.2. Сведений об эксплуатации в реальных атаках нет: исследователи показали успешную эксплуатацию на незакрытых сборках Node.js, то есть речь идёт о лабораторной демонстрации, а не о подтверждённых случаях компрометации.

Уязвимость обнаружили Khai Tran и Sylvie Mayer из OpenAI Codex Security. Исправления подготовили Matteo Collina и Antoine du Hamel в проекте Node.js. Возможность эксплуатации показал Ron Masas из Imperva Red Team, влияние на экосистему Python разобрала Aikido.

Первопричина лежит в вышестоящем декодере Brotli на языке C, поэтому затронуты проекты, которые встраивают его или компонуют статически. Исправленные версии уже опубликованы. Для libbrotli и пакета Brotli для Python исправления вышли в версиях 1.0.10, 1.1.1 и 1.2.1; для brotlicffi в версии 1.2.1.0; для Node.js в версиях 22.23.4, 24.22.1 и 26.12.1; для Bun в версии 1.4.4.

Envoy Proxy закрыт в версиях 1.36.12, 1.37.8, 1.38.6, 1.39.3 и 1.40.0, Istio в версиях 1.29.9, 1.30.6 и 1.31.2, библиотека andybalholm/brotli для Go в версии v1.2.7. Сборки Node.js веток 22.x, 24.x и 26.x без обновления остаются уязвимыми. Ветки, снятые с поддержки, нужно перевести на поддерживаемые версии.

По данным Wiz, 91% облачных сред содержит ресурсы, уязвимые перед CVE-2026-111497, а 82% имеют публично доступные экземпляры Node.js. Риск усиливают контейнеры, кластеры Kubernetes (система оркестрации контейнеров), API-шлюзы, обратные прокси и бессерверные функции, если они распаковывают чужой сжатый трафик.

Практические действия начинаются с инвентаризации виртуальных машин, кластеров, контейнеров и бессерверных функций, где используется уязвимый декодер. Приоритет отдают интернет-доступным сервисам и обработке недоверенных сжатых данных, включая косвенные зависимости. После обновления образы контейнеров, файлы фиксации зависимостей и встроенные библиотеки пересобирают, процессы перезапускают и проверяют, что загружены исправленные версии.

Там, где немедленное обновление невозможно, источник предлагает отключить распаковку Brotli или отклонять запросы с Brotli-кодированием до того, как они дойдут до уязвимого компонента. Получение недоверенных сжатых ответов можно ограничить. Эти меры снижают риск, но не заменяют установку исправления.

Дополнительно просматривают журналы WAF (межсетевого экрана для веб-приложений), приложений и сети: искать нужно необычный сжатый трафик, аварийные завершения процессов и отклонения в работе сервисов.

Значимость уязвимости определяется тем, что часть HTTP-клиентов и фреймворков распаковывает Brotli без явного указания в коде, а учётные данные для атаки не нужны. В первую очередь закрывают сервисы, которые принимают сжатые данные от внешних клиентов.

Ссылки

Комментарии: 0