
Консультативный набор инструментов и proof-of-concept для CVE-2026-111497 (Node2Shell) — переполнения кучи Brotli в Node.js, включающий скрипты запуска, проверку версии и рекомендации по устранению.
Node2Shell
Подробное уведомление о безопасности, технический анализ и руководство по устранению CVE-2026-111497
Раскрытая в октябре 2026 года, Node2Shell (CVE-2026-111497) — это критическая уязвимость безопасности, затрагивающая нативный компонент распаковки Brotli, встроенный непосредственно в бинарный файл рантайма Node.js.
Уязвимость позволяет удалённым атакующим выполнить произвольный код или вызвать сбой приложения, отправляя специально сформированные некорректные потоки байтов, сжатые Brotli, в любое приложение Node.js, обрабатывающее сжатые входные данные (например, парсеры тела HTTP-запросов, нативные вызовы fetch() или потоки WebSocket).
⚠️ КРИТИЧЕСКОЕ ЗАМЕЧАНИЕ: Поскольку уязвимый код находится в
deps/brotli, скомпилированном в сам исполняемый файл Node.js, обновление пользовательских зависимостейnpmне устранит эту уязвимость. Необходимо обновить бинарный рантайм Node.js.
deps/brotli).Content-Encoding: br).fetch(), обрабатывающий автоматические ответы от недоверенных сторонних конечных точек, отдающих сжатое содержимое.zlib.createBrotliDecompress().| Линейка релизов Node.js | Статус | Исправленная версия | Требуемое действие |
|---|---|---|---|
| Node.js 26.x | ⚠️ Уязвима | >= 26.12.1 | Немедленно обновите |
| Node.js 24.x | ⚠️ Уязвима | >= 24.22.1 | Немедленно обновите |
| Node.js 22.x (LTS) | ⚠️ Уязвима | >= 22.23.4 | Немедленно обновите |
| Node.js 20.x и старше | ❌ EOL | Нет | Немедленно перейдите на поддерживаемую LTS |
🚨 Внимание, EOL: Node.js 20 достиг конца жизненного цикла (EOL) в апреле 2026 года. Официальные бэкпорты безопасности для версий с истёкшим сроком поддержки недоступны.
$ node node2shell-check.js
=== Node2Shell (CVE-2026-111497) Safe Checker ===
Local version + constant probe only. No network, no payloads.
Current Node.js version : v24.22.1
Brotli constant present : yes (-17) → patched decoder
───────────────────────────────────────────────────────
Verdict: PATCHED
You are running a fixed release of the 24.x line.
Additional notes:
• The constant check is the most reliable signal when Node.js ships
its own (statically linked) Brotli. On some Linux distros Node may
use the system libbrotli – then you must also check the system package.
• Updating npm packages alone does NOT fix this issue.
• After upgrading, restart every Node.js process / container.
• Official fixed versions: 22.23.4 · 24.22.1 · 26.12.1
$ node node2shell-check.js
=== Node2Shell (CVE-2026-111497) Safe Checker ===
Local version + constant probe only. No network, no payloads.
Current Node.js version : v24.22.0
Brotli constant present : no / missing → likely vulnerable decoder
───────────────────────────────────────────────────────
Verdict: VULNERABLE
Upgrade to Node.js 24.22.1 or later in the 24.x line.
Additional notes:
• The constant check is the most reliable signal when Node.js ships
its own (statically linked) Brotli. On some Linux distros Node may
use the system libbrotli – then you must also check the system package.
• Updating npm packages alone does NOT fix this issue.
• After upgrading, restart every Node.js process / container.
• Official fixed versions: 22.23.4 · 24.22.1 · 26.12.1
Current Node.js version : v20.18.0
Brotli constant present : no / missing → likely vulnerable decoder
Verdict: VULNERABLE (EOL / UNSUPPORTED)
This release line is end-of-life or never received the security fix.
Migrate to a supported LTS line (22.x, 24.x or 26.x) and use a patched version.
Вы также можете выполнить эту однострочную команду:
node -p "require('zlib').constants.BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH ?? 'missing'"
-17 → исправленоmissing → уязвимоЭто та же проверка, которую использует скрипт.
# Python dependencies
pip install requests brotli
# Node server (webhook injection + eval paths)
npm install
node server-stock.js # port 3000
# Real CVE trigger — hang a Node.js HTTP server (Content-Encoding: br)
python3 Node2Shell.py -u http://TARGET:3000 --hang --path /api/data --timeout 10