Node2Shell: вредоносные данные Brotli позволяют выполнить код на официальной сборке Node.js

· Безопасность
Исследователи Imperva показали, что приложение на официальном образе Node.js можно заставить выполнить чужой код, скормив ему специально составленный поток Brotli (CVE-2026-111497). Node.js выпустил исправления 21 октября.

cover.svg

Специалисты компании Imperva продемонстрировали атаку Node2Shell: вредоносные данные Brotli способны заставить приложение на официальной сборке Node.js выполнить код, подготовленный злоумышленником. Уязвимость получила идентификатор CVE-2026-111497, а разработчики Node.js раскрыли её и выпустили исправления 21 октября. Приложениям, которые распаковывают недоверенные данные Brotli, рекомендовано обновиться.

Их proof-of-concept выполнил код на официальном образе Node.js 24.22.0 для Linux arm64 — без отладчика и без самостоятельной пересборки, лишь передав декодеру Brotli специально составленные данные. При этом атака срабатывала не всегда: в их конфигурации на Linux arm64 выполнение кода потребовало нескольких попыток. Результат относится к одной конкретной сборке и одной конфигурации приложения; другие архитектуры, а также ветки 22.x и 26.x авторы не проверяли. На исправленном выпуске 24.22.1 те же данные были отвергнуты, и код не выполнился.

Демонстрация идёт дальше первого публичного proof-of-concept, который добивался выполнения кода только на нарочно ослабленной тестовой сборке. На обычной сборке его автор сообщал лишь о падении и ограниченном чтении памяти процесса, но не о выполнении кода, и отмечал, что рабочей атаки на нормальную сборку добиться не удалось. По состоянию на 22 октября случаев эксплуатации уязвимости в реальных атаках не зафиксировано.

Кто под угрозой

Уязвимость находится во встроенном в Node.js декодере Brotli, поэтому затрагивает ветки 22.x, 24.x и 26.x. Сервис доходит до декодера с любой стороны HTTP-обмена: когда читает ответ, сжатый Brotli, через встроенный fetch(), или когда промежуточный слой распаковывает тело запроса в Brotli. Парсеры тел в Express 5 — express.json(), express.urlencoded(), express.text(), express.raw() — теперь распаковывают тела запросов в Brotli наряду с gzip и deflate. Обычный HTTP-сервер Node.js сам по себе тело в Brotli не распаковывает — нужен такой слой или явный вызов. Imperva воспроизвела выполнение кода и через путь тела запроса, и через путь ответа, проверив Express с 5.0.0 по 5.3.0 и body-parser с 2.0.0 по 2.3.0.

Как устроена ошибка

Причина — в том, как декодер обрабатывает невозможную точку в потоке Brotli. Поток по ходу декодирования объявляет типы блоков, которые будет использовать, а тестовый вход доходил до смены блока, исключённой самой структурой потока. Уязвимый декодер воспринимал это как запрос новых данных и продолжал работу в недопустимом состоянии; при проверке с санитайзером памяти продолжение из этого состояния приводило к записи за пределы отведённого буфера. Node.js устранил проблему, импортировав патч из апстрима Brotli, который заставляет декодер остановиться с ошибкой формата.

Что делать

Единственное решение — перейти на исправленный выпуск. Обновление должно дойти и до образов контейнеров и прочих артефактов, в которые встроен бинарник Node, — инвентаризация пакетов такое нередко упускает. Ветки 20.x и старше достигли конца поддержки и исправления не получат. Обходного пути внутри Node.js не предусмотрено. Imperva советует там, где возможно, ограничивать недоверенный трафик Brotli, и добавила правила в собственный веб-экран. Vercel сообщила, что 21 октября добавила правила, блокирующие атаку во входящих запросах, но они не покрывают ответы Brotli, которые приложение само запрашивает у других серверов.


Источник: The Hacker News

Комментарии

Войдите, чтобы комментировать.

  • Пока нет комментариев.