Node2Shell: критическая уязвимость Node.js, которую уже эксплуатируют
CVE-2026-111497 в декодере Brotli внутри Node.js позволяет повредить память процесса и потенциально выполнить код. Кого касается, как проверить сервер и до какой версии обновиться.
21 октября 2026 года проект Node.js выпустил обновления безопасности для веток 22, 24 и 26. Самая громкая из закрытых проблем — CVE-2026-111497 в декодере Brotli, встроенном в Node.js. В сообществе у неё сразу несколько имён: Node2Shell, HTTP2Shell, Broccoli2Shell, Brotli2Shell. 27 октября американское агентство CISA внесло её в каталог уязвимостей, которые эксплуатируются на практике.
Node.js — это среда, на которой работают сайты на Next.js, многие Telegram-боты, API и админки. Поэтому новость касается не только разработчиков, но и владельцев сайтов. Разбираем, что случилось и что делать.
Что произошло
Brotli — популярный формат сжатия данных, его используют браузеры и серверы, чтобы передавать страницы быстрее. В декодере Brotli нашли ошибку записи за границы буфера: если приложение распаковывает специально подготовленные сжатые данные, злоумышленник может повредить память процесса. По данным Node.js, последствия — от падения процесса и утечки содержимого памяти до удалённого выполнения кода.
Google как владелец библиотеки оценил уязвимость в 9,2 балла по CVSS v4.0 — это критический уровень. Исправленные версии Node.js: 22.23.4, 24.22.1 и 26.12.1.
Насколько реальна угроза
- Публичные proof-of-concept эксплойты опубликованы на GitHub (данные Tenable).
- 26 октября компания ELLIO зафиксировала попытку эксплуатации против Node.js 24.22.0, а 27 октября CISA добавила CVE-2026-111497 в каталог KEV.
- Эксплуатация пока нестабильна: по данным ELLIO, эксплойт нужно подгонять под конкретную сборку Node.js, и чаще он просто роняет рабочий процесс. Но если процесс автоматически перезапускается (а в продакшене обычно так и настроено), у атакующего появляются повторные попытки.
- По данным Akamai, которые приводит Tenable, уязвимые версии Node.js работают в 61% сетей.
Вывод простой: паниковать не нужно, откладывать обновление — тоже.
Кого это касается
- Серверы на Node.js версий ниже 22.23.4, 24.22.1 и 26.12.1.
- Все, кто работает на устаревших ветках Node.js — 20, 23, 25 и старше. По данным Tenable, ветки, у которых закончилась поддержка, исправления не получат вообще. Node.js отдельно напоминает: версии с истёкшей поддержкой затронуты при каждом выпуске безопасности.
- Риск реален там, где приложение распаковывает Brotli-данные, которые может контролировать атакующий: сжатое тело входящего запроса или ответ от внешнего сервера, если HTTP-клиент автоматически распаковывает Brotli.
- Не только Node.js: по данным Tenable, тот же декодер используют Bun, .NET, Envoy, Istio, Python-клиенты с пакетом brotli, а также PHP для Windows.
Как проверить свой сервер
- Узнайте версию Node.js: на сервере выполните node -v. Нужна 22.23.4, 24.22.1, 26.12.1 или новее в своей ветке.
- Если сайт работает в Docker, смотрите не на сервер, а на образ: строку FROM в Dockerfile (например, node:20-alpine) и версию внутри запущенного контейнера: docker exec <контейнер> node -v.
- Проверьте всё, что работает на Node.js: сайт, Telegram-бота, CRM, фоновые задачи. Часто бот или старая админка крутятся на отдельной, давно не обновлявшейся версии.
- Если сайт делал подрядчик, задайте ему прямой вопрос: «Какая версия Node.js у нас в продакшене и закрыта ли CVE-2026-111497?»
Что делать
- Обновите Node.js до исправленной версии своей ветки: 22.23.4, 24.22.1 или 26.12.1 (или новее).
- Если вы на Node.js 20 или другой ветке без поддержки — переходите на актуальную LTS-ветку (22 или 24). Это может потребовать проверки совместимости зависимостей, но патча для старых веток не будет.
- В Docker пересоберите образ и перезапустите контейнеры. Tenable подчёркивает: исправление не действует на уже запущенные процессы, а контейнер получает его только после пересборки образа и повторного деплоя.
- Обновите и другие компоненты с Brotli: Bun до 1.4.4, Python-пакет brotli до 1.2.1 и т. д. — полный список версий есть у Tenable.
- Если обновиться прямо сейчас нельзя, временная мера из рекомендаций, которые собрал Tenable, — блокировать на прокси или балансировщике входящие запросы с заголовком Content-Encoding: br. Но это не защищает приложение, которое само скачивает Brotli-ответы с чужих серверов, и не заменяет обновление.
- Посмотрите логи на необъяснимые падения и перезапуски процессов Node.js, особенно рядом с запросами со сжатием br.
Как это связано с сайтами WeCre8
Это наш стек: собственная CMS WeCre8 построена на Next.js и работает на Node.js, поэтому скажем прямо — эта уязвимость нас касается. Версия Next.js в CMS (16.4.3) тут ни при чём: ошибка находится в самой среде Node.js, а не во фреймворке.
Мы проверили конфигурацию: наша CMS работает на самой актуальной на данный момент версии Node.js — 26.13.0, в которой уязвимость Node2Shell уже исправлена. Клиентам с сайтами на нашей CMS и хостинге ничего делать не нужно — это часть сопровождения.
PHP, WordPress и «1С-Битрикс» в наших проектах не используются, но это не важно: Node2Shell — уязвимость именно в Node.js.
FAQ
- У меня сайт на WordPress. Это меня касается?
- Сам WordPress работает на PHP, не на Node.js. Но если рядом на сервере есть Node.js-сервисы (бот, сборщик фронтенда, API), проверьте их. И отдельно — PHP для Windows, сборки которого тоже содержали уязвимый Brotli.
- Я обновил Node.js на сервере, а сайт в Docker. Этого достаточно?
- Нет. В контейнере своя версия Node.js из образа. Нужно обновить базовый образ, пересобрать и перезапустить контейнер.
- Можно просто отключить сжатие Brotli на сайте?
- Нет. Отключение сжатия ответов на сервере или CDN не влияет на распаковку — опасна именно распаковка чужих данных.
- Клиентам WeCre8 нужно что-то делать?
- Нет. Сайты на нашей CMS и хостинге обновляем мы сами.
Нужна помощь?
Если у вас сайт, бот или сервис на Node.js и вы не уверены, что он обновлён, — напишите нам. Проверим версии, обновим среду и возьмём проект на сопровождение. Подробнее — на странице /services/support.