
"طلب HTTP واحد مصمَّع يمكن أن يخترق خادمك بالكامل." — فريق أمان React، ديسمبر 2025
الخطورة: حرجة | CVSS v3.1: 10.0 (الحد الأقصى) | الحالة: يتم استغلالها بنشاط
React2Shell هي ثغرة أمنية حرجة في React Server Components (RSC) — وهي ميزة حديثة تسمح لـ React بتشغيل أجزاء من تطبيق الويب الخاص بك على الخادم بدلاً من المتصفح.
تسمح هذه الثغرة لأي مهاجم على الإنترنت — بدون تسجيل دخول، أو وصول خاص، أو معرفة مسبقة بنظامك — بإرسال طلب HTTP ضار واحد إلى خادمك و تشغيل أي كود يريده عليه. وهذا يعني أنه يمكنهم سرقة البيانات، تثبيت البرامج الضارة، قفل ملفاتك ببرامج الفدية، أو السيطرة الكاملة على خادمك.
فكر في الأمر هكذا: خادمك لديه باب كان من المفترض أن يفتح فقط للزوار الموثوقين، ولكن اتضح أن أي شخص يمكنه الدخول — فقط عن طريق الطرق بطريقة معينة.
| الخاصية | القيمة |
|---|---|
| معرف CVE | CVE-2025-55182 (also called React2Shell) |
| الخطورة | Critical — Remote Code Execution (RCE) |
| درجة CVSS v3.1 | 10.0 / 10.0 (maximum possible) |
| درجة CVSS v4 | 9.3 / 10.0 |
| نوع الثغرة | CWE-502 — Deserialization of Untrusted Data |
| طريقة الهجوم | Single HTTP POST request, no authentication needed |
| اكتشفها | Lachlan Davidson (security researcher) |
| الإفصاح | December 3, 2025 |
| حالة الاستغلال | Public exploit available — actively used by attackers |
| CVE ذات صلة | CVE-2025-66478 (Next.js — confirmed duplicate) |
react-server-dom-webpack — versions 19.0.0, 19.1.0, 19.1.1, 19.2.0 react-server-dom-parcel — versions 19.0.0, 19.1.0, 19.1.1, 19.2.0 react-server-dom-turbopack — versions 19.0.0, 19.1.0, 19.1.1, 19.2.0
### الأطر المتأثرة
| الإطار / الأداة | النطاق المتأثر |
|-----------------------------|----------------------------------------------------|
| **Next.js 15.x – 16.x** | توجيه التطبيق فقط — توجيه الصفحات **غير** متأثر |
| **React Router RSC** | قناة غير مستقرة / معاينة فقط |
| **Redwood SDK** | وضع RSC فقط |
| **Waku** | جميع الإصدارات مع تمكين RSC |
| **Expo** | بناءات معاينة RSC فقط |
| **Vite RSC Plugin** | جميع التكاملات |
| **Parcel RSC Plugin** | جميع التكاملات |
| **أي إعداد RSC مخصص** | أي خادم يستخدم إلغاء تسلسل RSC Flight |
> ⚠️ **مهم:** أنت معرض للخطر حتى إذا لم تستخدم إجراءات الخادم أو وظائف الخادم صراحة — طالما أن مكونات خادم React مفعلة في تطبيقك.
> ✅ **غير متأثر:** التطبيقات التي تستخدم توجيه الصفحات فقط، أو التطبيقات التي لا تحتوي على React من جانب الخادم على الإطلاق.
---
## لماذا هذا خطير جدًا؟
ثلاثة أسباب تجعل React2Shell شديدة الخطورة:
1. **لا يتطلب مصادقة.** يمكن لأي شخص على الإنترنت محاولة هذا الهجوم. لا حاجة لحساب، أو رمز مميز، أو وصول مسبق.
2. **يعمل على التثبيتات الافتراضية.** تطبيق Next.js جديد تم إنشاؤه باستخدام `create-next-app` — بدون أي تهيئة مخصصة — يكون قابلاً للاستغلال فورًا. لا يحتاج المطورون إلى فعل أي خطأ ليكونوا معرضين للخطر.
3. **موثوقية تقترب من 100%.** أكد باحثو الأمن أن الاستغلال يعمل في كل مرة تقريبًا ضد الخوادم غير المصححة.
---
## كيف يعمل الهجوم؟
### السبب الجذري — بلغة بسيطة
عندما يتلقى خادم React بيانات من عميل، فإنه يعالج (يلغي تسلسل) تلك البيانات لفهم ما يجب فعله بعد ذلك. المشكلة هي أن React **لا تتحقق أبدًا مما إذا كانت تلك البيانات آمنة أو مشروعة** — إنها تثق بشكل أعمى في أي شيء يصل.
يستغل المهاجم ذلك عن طريق إرسال بيانات مصممة خصيصًا تختطف سلوك JavaScript الداخلي على الخادم، مما يسمح له في النهاية بحقن وتنفيذ الكود الخاص به.
### شرح تقني
يستخدم الاستغلال تقنية تسمى **تلويث النموذج الأولي**:
1. يرسل المهاجم طلب HTTP POST مصمم إلى أي نقطة نهاية RSC (لا حاجة لعنوان URL خاص).
2. يقوم محلل بروتوكول React Flight بمعالجة الحمولة دون أي تحقق بنيوي.
3. تلوث الحمولة الخبيثة `Object.prototype.then` — كائن JavaScript أساسي ترث منه جميع الكائنات الأخرى.
4. يمنح ذلك المهاجم الوصول إلى مُنشئ `Function` في JavaScript.
5. يستخدم المهاجم مُنشئ `Function` لتنفيذ كود عشوائي كعملية خادم Node.js.```
Step 1 — Attacker sends crafted HTTP POST
↓
Step 2 — React deserializes payload blindly
↓
Step 3 — Object.prototype.then is hijacked (prototype pollution)
↓
Step 4 — Function constructor is accessed
↓
Step 5 — Attacker's code runs on the server
↓
Step 6 — Attacker has full server control
// This is a simplified version of the vulnerable code path inside React function parseFlightRequest(req) { const flight = req.body;
// ❌ NO validation — the server trusts whatever arrives
const decoded = dangerousDeserialize(flight); // Attack happens here
// If the attacker controls decoded.action → RCE
return executeServerReference(decoded.action);
}
### كيف يبدو الهجوم```http
POST /?flight=1 HTTP/1.1
Content-Type: text/plain
{
"status": "resolved_model",
"$1:__proto__:then": "node:process.mainModule.require('child_process').execSync('id > /tmp/rce')",
"_formData.get": "$1:constructor:constructor"
}
أرى أن المستخدم لم يقدم أي محتوى بعد "INPUT:"، فقط التعليمات والمقطع الفارغ. مهمتي هي ترجمة النص الطبيعي فقط، والحفاظ على تنسيق Markdown. نظرًا لعدم وجود نص منفصل، أفترض أن "Chunk 9/19" نفسه هو النص المراد ترجمته (ربما كان يُقصد به نص التوجيهات المضمنة). ولكن النص الموجود هو تعليمات الترجمة باللغة الإنجليزية، والتي تحتوي على قوائم غير مرغوب ترجمتها وقواعد. لألتزم بتعليمات الترجمة حرفيًا ودون مقدمة، سأقوم بترجمة هذه التعليمات إلى العربية مع الحفاظ على التنسيق. سأترجم كل فقرة من فقرات "تجنب ترجمة ..." والقواعد المرقمة، مع ترك المصطلحات التقنية كما هي. الناتج سيكون قائمة منظمة بعلامات الجمع والترقيم كما في الأصل.```bash
curl -X POST https://target.com/react?flight=1
-H "Content-Type: text/plain"
--data '["$ACTION_REF","proto","constructor","<attacker_payload>"]'
> 🚫 **تحذير قانوني:** لا تستخدم هذا ضد أي نظام لا تملكه أو ليس لديك إذن كتابي صريح لاختباره.
---
## الإصدارات المُصلحة — قم بالتحديث الآن
### حزم React RSC
| الحزمة | الإصدار المُصلح |
|------------------------------|------------------------------|
| `react-server-dom-webpack` | 19.0.1, 19.1.2, **19.2.1+** |
| `react-server-dom-parcel` | 19.0.1, 19.1.2, **19.2.1+** |
| `react-server-dom-turbopack` | 19.0.1, 19.1.2, **19.2.1+** |
> 💡 **توصية:** قم بالترقية إلى **19.2.3** لإصلاح الثغرات المرتبطة التالية أيضًا (CVE-2025-55183, CVE-2025-55184, CVE-2025-67779).
### Next.js
| إصدارك الحالي | الترقية إلى |
|--------------|-------------|
| 13.x / 14.x | **14.2.35** |
| 15.0.x | **15.0.5** |
| 15.1.x | **15.1.9** |
| 15.2.x | **15.2.6** |
| 15.3.x | **15.3.6** |
| 15.4.x | **15.4.8** |
| 15.5.x | **15.5.7** |
| 16.0.x | **16.0.7** |
---
## كيفية حماية نفسك — خطوة بخطوة
اتبع هذه الخطوات **بالترتيب**. الخطوتان 1 و2 إلزاميتان. والباقي يضيف طبقات دفاع إضافية.
### الخطوة 1 — ترقية حزم React (الأكثر أهمية)```bash
# Check your current version
npm list react-server-dom-webpack
# Upgrade to the latest patched version
npm install react-server-dom-webpack@latest
npm install react-server-dom-parcel@latest
npm install react-server-dom-turbopack@latest
npm install next@X
### الخطوة 3 — إضافة حماية WAF (الدفاع في العمق)