Обзор Node2Shell: Подробный анализ CVE-2026-111497

Источник: Akamai•

Обзор Node2Shell: Подробный анализ CVE-2026-111497

Узнайте о Node2Shell (CVE-2026-111497), критической уязвимости в библиотеке Brotli для Node.js, позволяющей выполнять удаленный запуск кода (RCE). Ознакомьтесь с затронутыми версиями, запросами для обнаружения и мерами по минимизации рисков.

Пострадавшие клиенты Akamai ExAR уже получили подробную карту уязвимых ресурсов с практическими рекомендациями по устранению проблем.

Основные выводы

21 октября 2026 года в Node.js были выпущены обновления безопасности, которые устраняют CVE-2026-111497, уязвимость записи за пределами буфера в декодере Brotli, поставляемом в комплекте с Node.js.

Уязвимость, получившая название Node2Shell, позволяет злоумышленнику, способному предоставить некорректно сжатые данные Brotli, повредить память процесса, что может привести к сбою, раскрытию памяти процесса или удаленному выполнению кода (RCE).

Этой уязвимости CVE был присвоен показатель CVSS 9.2 (критический). Node.js оценивает уязвимость как имеющую высокую степень серьезности.

Приложения уязвимы, когда они распаковывают ненадежные данные Brotli, включая ответы, полученные через встроенный API fetch(), и тела запросов, разбираемые Express 5.

Телеметрия Akamai показывает, что 61% сетей используют уязвимые версии Node.js.

Уязвимость Node2Shell была обнаружена вскоре после PHP2Shell, подробно описанной нами в предыдущей записи блога.

В этой записи блога мы объясняем уязвимость Node2Shell, перечисляем затронутые версии Node.js и даем рекомендации по ее устранению, включая поисковые запросы Akamai Guardicore Segmentation Insight для выявления уязвимых ресурсов.

Сведения об уязвимости

Node2Shell берет свое начало в декодере Brotli, который Node.js включает в свой состав для обеспечения декомпрессии Brotli через модуль node:zlib. Brotli — это формат сжатия, используемый, в частности, для кодирования содержимого HTTP.

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

В результате потоковый декодер продолжал добавлять входные байты во внутренний буфер размером восемь байт и выполнял запись за его пределы, как описано в .

Злоумышленник, способный предоставить данные Brotli, которые приложение распаковывает, может повредить память процесса, что может привести к сбою, раскрытию памяти процесса или RCE (на рисунке). Атака не требует аутентификации.

Приложениям не обязательно вызывать API Brotli напрямую, чтобы быть уязвимыми. Контролируемые злоумышленником данные Brotli могут попасть в декодер через:

  • Модуль node:zlib в приложениях, которые передают ненадежные входные данные в zlib.brotliDecompress() или zlib.createBrotliDecompress().

Модуль node:zlib в приложениях, которые передают ненадежные входные данные в zlib.brotliDecompress() или zlib.createBrotliDecompress().

  • Встроенный API fetch(), который автоматически распаковывает ответы, закодированные с помощью Brotli. В этом случае вредоносный или скомпрометированный сервер может нацелиться на клиентское приложение.

Встроенный API fetch(), который автоматически распаковывает ответы, закодированные с помощью Brotli. В этом случае вредоносный или скомпрометированный сервер может нацелиться на клиентское приложение.

  • Express 5 и body-parser 2, чьи парсеры json, raw, text и urlencoded по умолчанию распаковывают тела запросов, отправленные с заголовком Content-Encoding: br, поскольку для параметра `inflate` по умолчанию установлено значение `true`. Любой клиент может отправить такой запрос.

Express 5 и body-parser 2, чьи парсеры json, raw, text и urlencoded по умолчанию распаковывают тела запросов, отправленные с заголовком Content-Encoding: br, поскольку для параметра `inflate` по умолчанию установлено значение `true`. Любой клиент может отправить такой запрос.

Обычный HTTP-сервер Node.js не декодирует поступающие тела Brotli самостоятельно; декодирование содержимого HTTP возложено на приложение, как показано в Node.js zlib documentation.

Исправление вышестоящего репозитория заставляет декодер возвращать специальную ошибку формата (BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH) для недопустимого переключения блоков и передавать ее вызывающему коду. Некорректные потоки теперь отклоняются, а не обрабатываются как неполные входные данные.

Затронутые версии

Node2Shell затрагивает следующие линейки выпусков Node.js:

  • Версии 26.x до 26.12.1

Версии 26.x до 26.12.1

  • Версии 24.x до 24.22.1

Версии 24.x до 24.22.1

  • Версии 22.x до 22.23.4

Версии 22.x до 22.23.4

Для прекращенных линеек выпусков, включая 25.x, 23.x, 20.x и более ранние, исправления не выпускаются. В Node.js заявляют, что прекращенные версии всегда остаются уязвимыми при публикации обновлений безопасности.

Устранение уязвимости

Стратегии устранения включают в себя:

  • Обновление до исправленной версии

Обновление до исправленной версии

  • Сегментация для ограничения зоны поражения

Сегментация для ограничения зоны поражения

  • Отключение сжатых тел запросов

Отключение сжатых тел запросов

  • Выявление уязвимых хостов с помощью Akamai Guardicore Segmentation

Выявление уязвимых хостов с помощью Akamai Guardicore Segmentation

Обновление до исправленной версии

Node.js устранила уязвимость в версиях 22.23.4, 24.22.1 и 26.12.1. В рекомендациях Node.js не предлагается временных обходных путей, поэтому обновление является единственным полноценным способом устранения.

Организациям, использующим прекращенную линейку выпусков, следует перейти на поддерживаемую линейку.

Сегментация для ограничения зоны поражения

Используйте микросегментацию, чтобы ограничить входящий доступ к службам Node.js только теми источниками, которым это необходимо, и ограничьте исходящие соединения от ресурсов, выполняющих уязвимые экземпляры Node.js.

Это уменьшает поверхность атаки и снижает последствия компрометации ресурса.

Отключение сжатых тел запросов

Если вашему приложению не нужно принимать сжатые тела запросов, установите для параметра body-parser inflate значение false. В этом случае сжатые тела запросов будут отклоняться с ошибкой HTTP 415.

Выявление уязвимых хостов с помощью Akamai Guardicore Segmentation

Для обнаружения и сегментации уязвимых приложений можно использовать следующие запросы Akamai Guardicore Segmentation Insight:

Ресурсы под управлением Linux

Ресурсы под управлением Windows

Итог

Node2Shell (CVE-2026-111497) — это уязвимость записи за пределами буфера в декодере Brotli, поставляемом с Node.js, которая может привести к RCE в приложениях, распаковывающих ненадежные данные Brotli.

Пострадала каждая поддерживаемая линейка выпусков Node.js, а такие распространенные пути, как fetch() и Express 5, делают уязвимыми приложения, которые никогда не вызывают API Brotli напрямую. Организациям следует немедленно обновиться до версий Node.js 22.23.4, 24.22.1 или 26.12.1.

Следите за обновлениями

Группа анализа угроз безопасности Akamai (Akamai Security Intelligence Group) продолжит отслеживать подобные угрозы, сообщать о них и создавать средства защиты как для наших клиентов, так и для сообщества специалистов по безопасности в целом. Чтобы быть в курсе последних новостей от Akamai Security Intelligence Group, посетите нашу главную страницу исследований и подписывайтесь на нас в социальных сетях.

Об авторе

Akamai Security Intelligence Group

Akamai SIG — это глобальная команда исследователей, инженеров, стратегов и специалистов по работе с данными мирового уровня, обладающая широким спектром опыта в различных дисциплинах безопасности. Нашими источниками данных являются огромная облачная инфраструктура Akamai, открытые источники, сотрудничество с третьими сторонами и данные аналитики даркнета. Мы также разработали собственные алгоритмы и инструменты, которые помогают нам проводить исследования и поддерживать решения безопасности Akamai в актуальном состоянии.

О чём эта статья

Ещё в разделе «Облака и инфраструктура»

Все →

Ещё от Akamai