главное в кибербезопасности Читать в канале
Уязвимости 25 октября 2026 4 мин

Уязвимость Brotli в Node.js, Bun и Python позволяет выполнять код

Уязвимость в декодере Brotli позволяет выполнять код

Уязвимость CVE-2026-111497 в декодере Brotli от Google затрагивает множество программ, распаковывающих данные, сжатые с помощью Brotli. Среди них Bun, пакеты Python Brotli и brotlicffi, а также прокси Envoy, настроенные на распаковку Brotli. Уязвимость позволяет специально сформированным сжатым данным перезаписать буфер и повредить память программы. Это может привести к сбою, утечке памяти или выполнению кода, контролируемого злоумышленником. Исследователи Imperva продемонстрировали выполнение кода на одной из версий Node.js без исправлений. Аналогичные демонстрации на другом ПО не проводились, а реальные атаки не зафиксированы. Уязвимость была впервые раскрыта 21 октября. Node.js и Google выпустили исправления, за ними последовали другие продукты. Поскольку ошибка находится в декодере Google, каждая программа должна обновлять его самостоятельно.

Brotli сжимает веб-трафик, уязвимость затрагивает его обработку

Brotli — это формат сжатия от Google, используемый в интернете для уменьшения размера веб-страниц и другого трафика. Ошибка находится в коде на C, который распаковывает поток Brotli. Она распространяется на всё, что повторно использует этот код: от языковых сред до прокси и пакетов Python. Программа подвергается риску, только если она декодирует данные Brotli, контролируемые другим лицом. В Node.js и Bun это происходит при чтении ответа с заголовком Content-Encoding: br через встроенную функцию fetch(), или при распаковке загружаемых данных с помощью кода обработки тел запросов, такого как Express 5 и body-parser 2. Обычный HTTP-сервер Node.js не декодирует тела запросов автоматически. Envoy и Istio уязвимы только при включенной распаковке Brotli, например, через фильтр Envoy. Если она отключена, ошибка недоступна. В Python риск возникает при установке пакета Brotli или brotlicffi. После установки HTTP-клиенты, такие как requests, urllib3, httpx и aiohttp, автоматически декодируют ответы Brotli. Приложение может быть подвержено риску, даже если оно не импортирует Brotli напрямую. Межсетевые экраны веб-приложений (WAF) обеспечивают лишь частичную защиту. Vercel добавила правила WAF в день раскрытия, но они не покрывают ответы, которые функции получают от других серверов. Для этого пути решения проблемы является обновление среды выполнения или библиотеки. Успешность эксплуатации зависит от ПО. Команда Red Team компании Imperva продемонстрировала выполнение кода, предоставленного злоумышленником, на неизмененной сборке Node.js 24.22.0 для Linux на ARM64. Эксплойт потребовал нескольких попыток, не был опубликован и не тестировался на других сборках. OpenAI, чья команда Codex Security сообщила об уязвимости, описывает её как возможность удаленного выполнения кода без аутентификации в Brotli. Они относят к затронутому ПО Node.js, Bun и Envoy. Уязвимость работает в обе стороны: непривитый сервер, принимающий сжатые входные данные, может быть скомпрометирован вредоносным клиентом, а непривитый клиент, принимающий сжатые входные данные (например, curl --compressed), может быть скомпрометирован вредоносным сервером. Вредоносная эксплуатация в реальных условиях не зафиксирована. Оценка CISA от 23 октября классифицировала эксплуатацию как "отсутствует", а автоматизацию как "нет". Red Hat не предоставила надежных публичных доказательств возможности выполнения кода. Рейтинги серьезности различаются: Google оценивает уязвимость в 9.2 (критическую) по шкале CVSS 4.0, Node.js — в "высокую", Red Hat — в 8.1 (важную).

Обновиться до исправленной версии или прекратить декодирование Brotli

Исправление было добавлено в исходный код Brotli 27 февраля, но новый релиз Brotli появился только 21 октября. Node.js приписывает заслуги в сообщении об уязвимости Хай Тран и Сильви Майер из OpenAI Codex Security, а в исправлении — мейнтейнерам Маттео Коллине и Антуану дю Амелю. Для устранения уязвимости необходимо обновиться до исправленной версии и перезапустить службу или пересобрать образ контейнера, поскольку работающий процесс сохраняет старый декодер до перезапуска. Там, где обновление невозможно, следует прекратить декодирование непроверенных данных Brotli. Рекомендуется отклонять входящие запросы с заголовком Content-Encoding: br до того, как прокси или парсер декодируют тело. Следует отключить автоматическое декодирование Brotli в HTTP-клиентах и отклонять ответы Brotli до их декодирования. В Python рекомендуется удалить пакеты Brotli и brotlicffi, чтобы клиенты использовали gzip и deflate. Отказ от br в заголовке Accept-Encoding сам по себе не помогает, так как сервер может отправить Brotli независимо от запроса клиента. Для Node.js обходных путей не опубликовано, поэтому обновление среды выполнения является единственным решением. Системные пакеты исправляются в разное время. Debian исправил свой пакет brotli для Debian 13 (trixie) 23 октября до версии 1.1.0-2+deb13u1. Amazon Linux 2023 по состоянию на 22 октября все еще ожидал исправления для пакетов brotli и Node.js 24. Сканеры зависимостей могут еще не отмечать пакеты Python. Запись CVE ссылается на репозиторий Brotli от Google, а не на пакеты PyPI. Консультативный совет GitHub все еще не содержит информации о затронутых пакетах, которую читает Dependabot. Консультативные записи для двух пакетов Python, PYSEC-2026-4322 и PYSEC-2026-4323, были добавлены 23 октября, поэтому следует вручную проверять установленные версии.

Источник