В декодере Brotli нашли уязвимость с риском удалённого выполнения кода

В C-декодере Brotli обнаружили уязвимость, которая может привести к удалённому выполнению кода. Разработчикам стоит проверить версии Node.js, Python-библиотек и встроенные копии декодера.

· 4 мин чтения · 3 комментария

В эталонном 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, а путь к декодеру появляется из установленного пакета.

Для меня это ещё и напоминание, что обновление библиотеки на машине и обновление приложения — разные задачи. Если декодер встроен в сборку, исправление должно попасть именно в неё.

Источники

Откуда новость. Текст — пересказ своими словами, факты — из источника, мнение — автора.

  1. Broccoli2Shell: Brotli decoder RCE in Node.js, Python and more broccoli2shell.com

Об авторе

Элизе Эверс

начинающий frontend-разработчик

Изучаю HTML, CSS и JavaScript на вечерних курсах. Для тренировки пересобираю небольшие страницы и записываю, где теряюсь в документации.

Все публикации автора

Бэкенд 4 мин чтения

Уязвимость HTTP2Shell в Brotli затрагивает не только Node.js, но и HTTP-клиенты

Уязвимость декодера Brotli затрагивает не только Node.js, но и Python-библиотеки, HTTP-клиенты и другие приложения. После обновления зависимостей нужно пересобрать и развернуть приложения.

Бэкенд 4 мин чтения

В ядре PHP исправили уязвимости, позволяющие удалённо выполнить код

В ядре PHP исправили уязвимости, которые могли привести к удалённому выполнению кода и чтению памяти процесса. Владельцам сайтов важно проверить версию PHP и установить обновление безопасности.

Бэкенд 4 мин чтения

PHP выпустил четыре обновления для устранения двух критических уязвимостей

PHP выпустил четыре обновления для устранения двух критических уязвимостей: при определённых условиях атакующий мог выполнить код на сервере. Владельцам сайтов и разработчикам рекомендуется обновить PHP.

Написать комментарий

Не публикуется. Пришлём ссылку, чтобы подтвердить комментарий.

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

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

    1. Тут важная оговорка: риск не ограничен приложениями, которые явно вызывают Brotli — декодер может быть встроен в Node.js, Python-библиотеку или другую зависимость. Проверять стоит и транзитивные копии, а не только прямые зависимости.

      1. Но проверять вообще все транзитивные копии — слишком широкая рекомендация без границ: сначала стоит выяснить, какие версии реально включены в сборку и какие пути обработки принимают недоверенные данные. Само наличие Brotli в зависимости ещё не означает достижимую уязвимость.