
استشارة وتحليل لـ CVE-2025-55182 (React2Shell) RSC Flight deserialization RCE، مع تفصيل السبب الجذري، ومسار الهجوم، وفروق التصحيح، وقواعد كشف Sigma/Suricata/WAF.
تاريخ آخر تحقق: 2026-11-04 (KST). لم تُدرج سوى القيم التي تم التحقق منها من المصادر في قسم المراجع أدناه، وفي حال اختلاف القيم بين المصادر تم إدراجها جميعًا.
Function وتنفيذ JavaScript عشوائي.react-server-dom-webpack / -parcel / -turbopack الإصدارات 19.0.0 و19.1.0 و19.1.1 و19.2.0 والأُطر التي تستخدمها — وعلى رأسها Next.js 15.x / 16.x App Router. حتى لو لم تُعرّف Server Function مباشرةً، فإنك تتأثر بمجرد دعمك لـ RSC.| العنصر | المحتوى |
|---|---|
| معرّف CVE | CVE-2025-55182 (React) / تم رفض CVE-2025-66478 الخاص بـ Next.js باعتباره مكررًا (Rejected) |
| الاسم البديل | React2Shell |
| تاريخ الإفصاح | 2025-12-03 (توصية فريق React، وتم نشر التصحيح في اليوم نفسه) |
| المكتشف | Lachlan Davidson (تم الإبلاغ عبر Meta Bug Bounty في 2025-11-29) |
| المنتجات/الإصدارات المتأثرة | react-server-dom-webpack، react-server-dom-parcel، react-server-dom-turbopack 19.0.0، 19.1.0، 19.1.1، 19.2.0 / Next.js 14.3.0-canary.77 وما بعده من canary، 15.x، 16.x (App Router) |
| إصدارات التصحيح | إصلاح RCE: React 19.0.1 / 19.1.2 / 19.2.1، Next.js 15.0.5 / 15.1.9 / 15.2.6 / 15.3.6 / 15.4.8 / 15.5.7 / 16.0.7 الإصدار النهائي الموصى به (بما في ذلك الثغرات اللاحقة): React 19.0.3 / 19.1.4 / 19.2.3 (انظر "الثغرات اللاحقة" أدناه) |
| CVSS v3.1 | 10.0 حرج — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
| CVSS v4.0 | لم يتم التحقق منه من المصادر الأولية وقت كتابة هذا المستند |
| CWE | CWE-502 إلغاء تسلسل البيانات غير الموثوقة (Vercel GHSA-9qr9-h5gf-34mp، GitLab Advisory DB). لم يُذكر CWE في إدخال CISA KEV |
| الاستغلال الفعلي | تم تأكيد الاستغلال. أُدرج في CISA KEV بتاريخ 2025-12-05، الموعد النهائي لإجراءات الوكالات الفيدرالية 2025-12-12، الاستخدام في حملات الفدية: Known. رصدت AWS محاولات استغلال في غضون ساعات من الإفصاح |
| المكوّن | الإصدارات المتأثرة | الإصدار المُصحَّح |
|---|---|---|
react-server-dom-webpack / -parcel / -turbopack | 19.0.0 | 19.0.1 (يُوصى بـ 19.0.3) |
| 〃 | 19.1.0, 19.1.1 | 19.1.2 (يُوصى بـ 19.1.4) |
| 〃 | 19.2.0 | 19.2.1 (يُوصى بـ 19.2.3) |
| Next.js 15.x (App Router) | 15.0 ~ ما قبل تصحيحات 15.5 | 15.0.5 / 15.1.9 / 15.2.6 / 15.3.6 / 15.4.8 / 15.5.7 |
| Next.js 16.x (App Router) | أقل من 16.0.7 | 16.0.7 |
| Next.js canary | 14.3.0-canary.77 فأعلى | 15.6.0-canary.58 / 16.1.0-canary.12 (على مستخدمي 14.3 canary الرجوع إلى 14.x stable) |
| أدوات تكامل RSC الأخرى | React Router (واجهة RSC غير المستقرة)، Waku، إضافة Parcel RSC، إضافة Vite RSC (@vitejs/plugin-rsc)، RedwoodSDK، Expo وغيرها | أحدث إصدار من كل أداة + react-server-dom-* المُصحَّح |
غير متأثر: تطبيقات React العميلة البحتة التي لا تستخدم خادمًا، Next.js 13.x / 14.x stable، تطبيقات Pages Router، عمليات نشر Edge Runtime.
بعد تصحيح React2Shell، كشفت أبحاث إضافية على RSC عن ثغرات متتالية ليست من نوع RCE. تم إصلاح RCE نفسه في 19.0.1 / 19.1.2 / 19.2.1، لكن لسد الثغرات أدناه أيضًا يلزم استخدام أحدث إصدار.
| CVE | النوع | CVSS v3.1 | تاريخ الكشف | الإصدار المُصلح |
|---|---|---|---|---|
| CVE-2025-55184 | حجب الخدمة (DoS) | 7.5 | 2025-12-11 | 19.0.2 / 19.1.3 / 19.2.2 (غير مكتمل) |
| CVE-2025-55183 | كشف الشيفرة المصدرية | 5.3 | 2025-12-11 | 19.0.2 / 19.1.3 / 19.2.2 |
| CVE-2025-67779 | حجب الخدمة (DoS) بسبب تصحيح غير مكتمل لـ CVE-2025-55184 | 7.5 | 2025-12-12 | 19.0.3 / 19.1.4 / 19.2.3 |
تصف بعض مقالات شركات الأمن (مثل تحديث Zscaler) الأمر بأنه "كان التصحيح الأصلي لـ CVE-2025-55182 غير مكتمل". لكن وفقًا لاستشارات React وGitLab، فإن ما كان غير مكتمل هو تصحيح حجب الخدمة (CVE-2025-55184)، ولم نتمكن من تأكيد مصدر أولي يفيد بتجاوز تصحيح تنفيذ الشيفرة عن بُعد (RCE). في كلتا الحالتين، الإجراء الموصى به هو الترقية إلى 19.0.3 / 19.1.4 / 19.2.3 أو أحدث.
| التاريخ | الحدث |
|---|---|
| 2025-11-29 | أبلغ Lachlan Davidson عبر برنامج Meta Bug Bounty |
| 2025-11-30 | أكّد باحثو أمن Meta المشكلة، وبدأ العمل على التصحيح مع فريق React |
| 2025-12-03 | نشر استشارة React والتصحيح (19.0.1 / 19.1.2 / 19.2.1)، واستشارة Next.js (CVE-2025-66478). ونشرت شركات السحابة وWAF قواعد حماية بعد مشاركتها مسبقًا |
| 2025-12-03 ~ 04 | رصدت AWS محاولات استغلال من مجموعات مرتبطة بالصين (Earth Lamia، Jackpot Panda) خلال ساعات من الكشف. ورصدت Zscaler أكثر من 4,100 محاولة استغلال خلال أول ساعتين |
| 2025-12-05 | إدراج CVE في قائمة CISA KEV (الموعد النهائي 12-12). ورصدت Microsoft نشاط استغلال فعلي اعتبارًا من هذا اليوم |
| 2025-12-11 | الكشف عن الثغرتين التاليتين CVE-2025-55184 / 55183 |
| 2025-12-12 | الكشف عن CVE-2025-67779 (التصحيح غير المكتمل)، وإصدار 19.0.3 / 19.1.4 / 19.2.3 |
| 2025-12-15 | نشرت Microsoft تحليلًا للنشاط اللاحق للاستغلال ودليلًا للبحث والتحري |
يتبادل RSC البيانات بين العميل والخادم عبر بروتوكول تسلسل خاص يُسمى Flight. عندما يستدعي العميل Server Function، يرسل المتصفح الوسائط في طلب POST من نوع multipart/form-data، ويصبح كل حقل نموذج chunk واحدًا مرقّمًا.
$<id> مرجع إلى قيمة chunk آخر، و$@<id> مرجع إلى كائن الـ chunk نفسه، و$B<id> معالجة Blob.then(). عندما يواجه await في JavaScript كائنًا thenable فإنه يستدعي then()، وإذا كانت النتيجة thenable أخرى يستمر في الاستدعاء تعاقبيًا.getOutlinedModel()تقوم getOutlinedModel() في معالج استجابة Flight على جانب الخادم (packages/react-server/src/ReactFlightReplyServer.js) بتقسيم المراجع بصيغة $<id>:<prop1>:<prop2> على أساس :، ثم تتبع الخصائص في الـ chunk الهدف بالترتيب chunk[prop1][prop2].
في هذه الأثناء، لم يتم التحقق مما إذا كان اسم الخاصية خاصية ذاتية للكائن (own property). لذلك كان بالإمكان الوصول إلى خصائص موروثة بأسماء مثل __proto__ وconstructor وprototype.
في JavaScript، يُعد constructor.constructor لأي كائن هو المُنشئ العام Function، الذي يستقبل نصًا وينشئ دالة قابلة للتنفيذ. ووفقًا لتحليلات منشورة (OPSWAT، Zscaler)، يجمع المهاجم بين أمرين.
| العنصر | طريقة الاستغلال (مفاهيميًا) |
|---|---|
| استكشاف سلسلة النموذج الأولي | الوصول إلى الدوال الداخلية (Chunk.prototype.then) ومُنشئ Function عبر مسار المرجع |
التحليل التعاقبي لـ then() | يُعامَل الـ chunk المزيف الذي يبنيه المهاجم ككائن thenable، فيثق محرك إلغاء التسلسل بحالته كما هي |
معالج $B (Blob) | اعتراض مسار استدعاء الدوال في كائن الاستجابة الداخلي لدفع شيفرة المهاجم إلى مُنشئ Function |
في Next.js، تمر طلبات Server Function عبر handleAction() إلى إلغاء تسلسل Flight في React. يُنفَّذ إلغاء التسلسل قبل التحقق من أي Server Function سيُستدعى. لذلك تتم معالجة الحمولة حتى لو كانت قيمة ترويسة Next-Action لا تشير إلى إجراء موجود فعليًا، أو كانت تشير إلى نقطة نهاية تقع خلف تسجيل الدخول (OPSWAT). كما تتأثر بنية create-next-app الإنتاجية الافتراضية دون أي إعداد إضافي.