
أبحاث أمنية متقدمة حول CVE-2025-55182 (React2Shell). تتضمن إطار استغلال مع 6 سيناريوهات تأثير وظيفية (من RCE إلى تسريب الأسرار)، وشلًا تفاعليًا عكسيًا، ومختبرًا متكاملًا. عمل معروض يبرز تحليلًا عميقًا لتلوث النموذج الأولي وإلغاء التسلسل غير الآمن في مكونات خادم React.
إلغاء تسلسل البيانات غير الموثوقة + تلوث النموذج الأولي في مكونات خادم React
تنفيذ تعليمات برمجية عن بُعد دون مصادقة عبر Server Actions في Next.js
الإصدارات المتأثرة: React 19.0.0 - 19.2.0 · التصحيح: React 19.0.1 / 19.1.2 / 19.2.1 (3 ديسمبر 2025)
عرض توضيحي للاستغلال المتقدم - أوامر RCE الأساسية، قشرة تفاعلية، ونواقل هجوم متعددة ضد تطبيق Next.js ضعيف
يحتوي هذا المستودع على بحث رسالة الماجستير الخاص بي حول CVE-2025-55182، وهي ثغرة تنفيذ تعليمات برمجية عن بُعد (RCE) حرجة (CVSS v3.1: 10.0) في مكونات خادم React (React Server Components).
يعود أصل الثغرة إلى آلية إلغاء تسلسل غير آمنة في بروتوكول React Flight. عند معالجة Server Actions، تقوم Next.js بإلغاء تسلسل الأحمال متعددة الأجزاء (multipart) الواردة دون تحقق مناسب. يمكن للمهاجم إنشاء حمولة خبيثة تلوث سلسلة النموذج الأولي (prototype chain) وتحقن JavaScript عشوائية، تُنفَّذ على الخادم عبر مُنشئ Function (ومن ثم عبر child_process.execSync()).
ملاحظة بخصوص CVE-2025-66478: أصدرت Vercel CVE موازيًا لتتبع الأثر الخاص بـ Next.js لهذه الثغرة نفسها. ونظرًا لأن Next.js تدمج React بطريقة موَرّدة (vendored)، فإن العديد من أدوات فحص التبعيات لا تكتشفها تلقائيًا كإصدار ضعيف. وقد رفضت قاعدة البيانات الوطنية الأمريكية للثغرات (NVD) رسميًا اعتبار CVE-2025-66478 نسخة مكررة من CVE-2025-55182، رغم استمرار الإشارة إليها في النشرة الأمنية الصادرة عن Vercel.
ثغرات لاحقة: كشف فريق React لاحقًا عن مشكلتين إضافيتين موجودتين في إصدارات التصحيح الأولية (19.0.1, 19.1.2, 19.2.1): CVE-2025-55184 (حجب الخدمة، CVSS 7.5) وCVE-2025-55183 (كشف الكود المصدري، CVSS 5.3). يجب على المستخدمين الترقية إلى 19.0.2 أو 19.1.3 أو 19.2.2 لمعالجة الثغرات الثلاث جميعًا.
CVE-2025-55182/
├── README.md # This file
├── LICENSE # MIT License
│
├── exploit/
│ ├── exploit-explanation.md # Exploit usage documentation
│ └── react2shell.py # Main exploit — 4 attack modules + interactive shell
│
├── vulnerable-app/ # Vulnerable Next.js application
│ ├── README.md # Original vulnapp credits
│ ├── package.json # React 19.0.0 (vulnerable)
│ ├── app/ # Application source code
│ ├── curl_id.sh # Original exploit script (by zack0x01)
│ └── scripts/
│ └── restore.sh # Restoration script (my contribution)
│
└── docs/
├── screenshots/ # Exploitation demonstrations
│ ├── 01-app-initial.png
│ ├── 02-rce-basic.png
│ ├── 03-interactive-shell.png
│ ├── 04-no-payload.png
│ ├── 05-delete-result.png
│ ├── 06-deface.png
│ ├── 07-shutdown-servers.png
│ ├── 08-restore-from-script.png
│ └── 09-restore-from-interactive-shell.png
│
└── analysis/
├── 01-root-cause.md # Vulnerability root cause analysis
├── 02-payload-breakdown.md # Payload structure and execution flow
└── 03-timeline.md # CVE timeline
vulnerable-app/)cd vulnerable-app
npm install --legacy-peer-deps
npm run dev
# App available at http://localhost:3000
cd ../exploit
# Check if target is vulnerable
python3 react2shell.py -u http://localhost:3000 --check
# Execute single command
python3 react2shell.py -u http://localhost:3000 -c "whoami"
# Interactive shell mode
python3 react2shell.py -u http://localhost:3000 -i
تستخدم مكونات خادم React آلية تسلسل/إلغاء تسلسل مخصصة (بروتوكول "Flight") لإرسال بيانات المكونات من الخادم إلى العميل. وعند معالجة إجراءات الخادم (Server Actions)، يقوم الخادم بإلغاء تسلسل الأحمال الواردة دون تحقق مناسب.
الخلل الأساسي هو الثقة السلوكية: يتحقق مُلغِي التسلسل من typeof obj.then === 'function' لتحديد كائنات Promise، دون التحقق من أن الخاصية تنتمي مباشرةً إلى الكائن. وهذا يسمح للمهاجم بتسميم Object.prototype.then، مما يجعل كل كائن عادي يظهر وكأنه كائن thenable.
يمكن للمهاجم إنشاء حمولة خبيثة تعمل على:
__proto__:thenFunction عبر $1:constructor:constructornew Function(_prefix)process.mainModule.require('child_process').execSync()X-Action-RedirectUser-mode (unauthenticated)
│
├─ POST / (Next.js Server Action endpoint)
│ ├─ Headers: Next-Action: x
│ └─ Multipart body with malicious JSON
│
└─ React Flight deserializer processes payload
└─ Prototype pollution via __proto__:then
└─ Function constructor reached via $1:constructor:constructor
└─ new Function(_prefix) executes attacker's JavaScript
└─ execSync() runs system command
└─ Output embedded in NEXT_REDIRECT error
└─ Next.js converts to X-Action-Redirect header
تؤثر الثغرة على أي تطبيق Next.js يستخدم App Router مع مكونات خادم React — وهو التكوين الافتراضي منذ Next.js 14. ليست هناك حاجة لتعريف Server Actions بشكل صريح؛ فمجرد وجود حزم RSC المتأثرة كافٍ.
تسمح هذه الثغرة لمهاجم غير مصادَق بما يلي:
1. [ANY] Send crafted multipart POST to any Server Action endpoint
2. [SERVER] React deserializer processes malicious JSON
3. [SERVER] Prototype pollution poisons Object.prototype.then
4. [SERVER] Plain object treated as thenable; Function constructor reached
5. [SERVER] new Function(_prefix) executes attacker's arbitrary JavaScript
6. [SERVER] execSync() runs system command; output captured
7. [SERVER] Output embedded in NEXT_REDIRECT error digest
8. [SERVER] Next.js returns X-Action-Redirect header with URL-encoded output
9. [ATTACKER] Extract and URL-decode command result from header
أُجريت جميع الاختبارات على جهاز افتراضي معزول (VirtualBox) يعمل بنظام Kali Linux 2026.1 مع Next.js 15.0.0 وReact 19.0.0، دون أي تعرض للشبكة.
الحتمية: على عكس الاستغلالات الاحتمالية، مثل رش الكومة (heap spray)، فإن CVE-2025-55182 حتمية تمامًا — أي طلب HTTP POST مُنسَّق بشكل صحيح يُنتج RCE باحتمال 1 على أي نظام غير مُصحَّح يعمل بـ React 19.0.0–19.2.0 مع تفعيل مكونات خادم React.
| المستند | الوصف |
|---|---|
| تحليل السبب الجذري | خلل إلغاء التسلسل وتلوث النموذج الأولي في React Flight |
| تفصيل الحمولة |
هذا البحث جزء من رسالة الماجستير في الأمن السيبراني (UCAM — Campus Internacional de Ciberseguridad)، ويحلل ثغرات N-Day عبر بيئات متعددة.
تمثل هذه الثغرة ناقل أطر عمل JavaScript الحديثة ضمن الرسالة، وتُظهر:
الكلمات المفتاحية: RCE · Prototype Pollution · Deserialization · React · Next.js · Server Actions · CVE-2025-55182
Annais Molina (devianntsec) — باحثة أمنية | ماجستير في الأمن السيبراني (UCAM)
رخصة MIT — انظر LICENSE
يُقدَّم هذا المستودع لأغراض تعليمية وبحوث أمنية فقط، كجزء من رسالة ماجستير أكاديمية. أُجريت جميع الاختبارات على أجهزة افتراضية معزولة دون تعرض للشبكة. استخدمه فقط على أنظمة تملكها أو لديك إذن كتابي صريح لاختبارها. الاستخدام غير المصرح به ضد الأنظمة غير قانوني وقد يؤدي إلى ملاحقة جنائية.
| الجانب | الوصف |
|---|
| أربع وحدات هجومية | حذف المشاريع، تشويه الموقع الإلكتروني، سرقة متغيرات البيئة، إيقاف تشغيل الخوادم |
| قشرة تفاعلية | قشرة مستمرة بأوامر خاصة وقدرات استعادة |
| استخراج مستقر للبيانات | قراءة سطرًا بسطر لتجاوز قيود حجم ترويسات HTTP |
| سكربت الاستعادة | استعادة آمنة للمختبر بعد الهجمات |
| توثيق أكاديمي | السبب الجذري، تفصيل الحمولة، والجدول الزمني للثغرة |
| الوحدة | الأمر | الوصف | الأثر |
|---|
| حذف المشاريع | --delete-projects | يحذف جميع المشاريع من لوحة التحكم | تدمير البيانات |
| تشويه الموقع | --deface "message" | يستبدل الصفحة الرئيسية | تشويه |
| سرقة متغيرات البيئة | --steal-env | يسرق متغيرات البيئة | استخراج البيانات |
| إيقاف تشغيل الخوادم | --shutdown-servers | يوقف جميع الخوادم | حجب الخدمة (DoS) |
| وحدة الهجوم | النتيجة | ملاحظات |
|---|
| تنفيذ الأوامر | ✅ تأكيد RCE | whoami, id, uname -a تعمل بشكل موثوق |
| حذف المشاريع | ✅ تعديل لوحة التحكم | حُذفت المشاريع، وحُفظت بنية React |
| تشويه الموقع | ✅ تشويه الموقع الإلكتروني | عُرضت رسالة مخصصة |
| سرقة متغيرات البيئة | ✅ استخراج متغيرات البيئة | حُفظت في stolen_env.txt |
| إيقاف تشغيل الخوادم | ✅ ظهور جميع الخوادم متوقفة | حُدّثت الواجهة، وReact تعمل |
| القشرة التفاعلية | ✅ قشرة مستمرة | أوامر خاصة متاحة |
| الاستعادة | ✅ استعادة الحالة الأصلية | عبر سكربت restore.sh |
| تحليل سطرًا بسطر لبنية JSON الخبيثة |
| الجدول الزمني للثغرة | التسلسل الزمني للاكتشاف والإفصاح والتصحيح |