В декодере Brotli нашли уязвимость с риском удалённого выполнения кода
В C-декодере Brotli обнаружили уязвимость, которая может привести к удалённому выполнению кода. Разработчикам стоит проверить версии Node.js, Python-библиотек и встроенные копии декодера.
В эталонном C-декодере Brotli обнаружили уязвимость: специально подготовленные сжатые данные могут привести к удалённому выполнению кода. Как пишет Broccoli2Shell, исправленные версии Brotli 1.0.10, 1.1.1 и 1.2.1 вышли 21 октября 2026 года. Проверять нужно не только прямое использование декодера: Node.js, Python-библиотеки и другие программы могут распаковывать Brotli без явного вызова в коде приложения.
Как работает ошибка и где возникает риск
Ошибка связана с переключением между блоками потока Brotli. Прежде декодер не всегда различал некорректный поток и ситуацию, когда ему просто не хватало входных данных. На быстром пути результат одной из проверок вообще игнорировался. Подготовленный поток мог заставить декодер записывать данные за пределами внутреннего буфера размером восемь байт и повредить соседнее состояние. Возможные последствия — утечка памяти или выполнение кода.
Уязвим C-декодер Brotli версий с 1.0.3 по 1.2.0, в том числе его копии внутри других проектов. Переписанные на других языках декодеры не позволяют выполнить код через эту ошибку. Исправление прекращает обработку повреждённого потока с ошибкой формата.
Один из путей к уязвимости — HTTP-ответы. Встроенный fetch() в Node.js автоматически распаковывает ответы с Content-Encoding: br. В Python это могут делать requests через urllib3, aiohttp и httpx с дополнением для Brotli, если нужный пакет установлен. Поэтому риск появляется, например, у приложения, которое получает данные по внешнему URL. Другой путь — сжатые тела запросов: их распаковывают определённые обработчики в Express 5.0.0–5.3.0 и body-parser 2.0.0–2.3.0. Сам по себе сервер на node:http этого не делает.
Express и body-parser не содержат ошибку: обновление только этих пакетов её не устранит. Node.js поставляет собственную копию Brotli, так что для него важна версия Node.js, а не системной библиотеки. Приложения также могут обращаться к декодеру напрямую — например, при работе с архивами, кешами и сообщениями очередей.
Какие версии и копии проверить
Для Node.js исправления доступны в версиях 22.23.4, 24.22.1 и 26.12.1; ветки с завершённой поддержкой тоже затронуты. В Python нужны Brotli не ниже 1.2.1 и brotlicffi не ниже 1.2.1.0. Даже если приложение не импортирует эти пакеты напрямую, они могут включить поддержку Brotli в HTTP-клиенте. На момент раскрытия уязвимости pip-audit, Dependabot и Safety не всегда отмечали затронутые версии PyPI. Поэтому одной автоматической проверки зависимостей недостаточно.
Отдельно нужно выяснить, откуда программа получает C-декодер. Для динамически подключаемой системной библиотеки важно установить исправление из обновлений дистрибутива и перезапустить процесс. Встроенные и статически собранные копии требуют обновления самого проекта и новой сборки. Среди проектов с такими копиями перечислены DuckDB, Apache Arrow и p7zip. Для некоторых других проектов исправления уже внесены в ветки разработки, но ещё не попали в релизы. Обновление системного libbrotli встроенные копии не защитит.
Что это значит для сайтов и приложений
В первую очередь разработчикам стоит проверить сервисы, которые загружают чужие URL или принимают тела запросов с Content-Encoding: br. Это касается не только рабочего сервера: в материале отдельно названы тестовые среды, контейнерные образы, CI и бессерверные среды. После обновления нужно пересобрать образы, перезапустить процессы и поправить зафиксированные версии зависимостей, иначе следующая сборка может вернуть уязвимый пакет. Риск при загрузке внешних адресов связан и с автоматической распаковкой в HTTP-клиентах, а не только с обработкой входящих запросов.
Если обновиться сразу нельзя, для Python указан временный вариант — удалить Brotli и brotlicffi вместе с дополнениями, которые установят их заново. Для входящих запросов можно отклонять тела с Content-Encoding: br на прокси или WAF. Но удаление br из исходящего Accept-Encoding не даёт полной защиты: сервер, к которому обращается приложение, всё равно может прислать такой ответ. Для Node.js полноценный способ устранить проблему — обновить среду выполнения.
Исследователи Imperva получили выполнение кода на стандартном образе Node.js 24.22.0 для Linux arm64, передав данные и через загружаемый ответ, и через тело запроса Express. Опубликованный 22 октября пример эксплуатации, по описанию материала, достигает выполнения кода только на специально ослабленной сборке. На 22 октября сообщений об атаках в реальных системах не было.
Моё мнение
Я бы начала с проверки версий среды и зависимостей в том образе, который действительно запущен, а не только в файлах проекта. Здесь легко пропустить автоматическую распаковку ответа: в коде виден обычный запрос по URL, а путь к декодеру появляется из установленного пакета.
Для меня это ещё и напоминание, что обновление библиотеки на машине и обновление приложения — разные задачи. Если декодер встроен в сборку, исправление должно попасть именно в неё.
Источники
Откуда новость. Текст — пересказ своими словами, факты — из источника, мнение — автора.
- Broccoli2Shell: Brotli decoder RCE in Node.js, Python and more broccoli2shell.com
начинающий frontend-разработчик
Изучаю HTML, CSS и JavaScript на вечерних курсах. Для тренировки пересобираю небольшие страницы и записываю, где теряюсь в документации.
Все публикации автораПохожие статьи
Уязвимость HTTP2Shell в Brotli затрагивает не только Node.js, но и HTTP-клиенты
Уязвимость декодера Brotli затрагивает не только Node.js, но и Python-библиотеки, HTTP-клиенты и другие приложения. После обновления зависимостей нужно пересобрать и развернуть приложения.
В ядре PHP исправили уязвимости, позволяющие удалённо выполнить код
В ядре PHP исправили уязвимости, которые могли привести к удалённому выполнению кода и чтению памяти процесса. Владельцам сайтов важно проверить версию PHP и установить обновление безопасности.
PHP выпустил четыре обновления для устранения двух критических уязвимостей
PHP выпустил четыре обновления для устранения двух критических уязвимостей: при определённых условиях атакующий мог выполнить код на сервере. Владельцам сайтов и разработчикам рекомендуется обновить PHP.
Обсуждение 3
Сардор Каримов
Похоже, Brotli решил распаковать не только данные, но и границы дозволенного: восемь байт буфера — и уже почти сюжет для триллера. Пойду проверю, не притаился ли декодер где-нибудь в зависимостях 🙂
Арман Садыков
Тут важная оговорка: риск не ограничен приложениями, которые явно вызывают Brotli — декодер может быть встроен в Node.js, Python-библиотеку или другую зависимость. Проверять стоит и транзитивные копии, а не только прямые зависимости.
Рауль Мартин
Но проверять вообще все транзитивные копии — слишком широкая рекомендация без границ: сначала стоит выяснить, какие версии реально включены в сборку и какие пути обработки принимают недоверенные данные. Само наличие Brotli в зависимости ещё не означает достижимую уязвимость.