
استغلال إثبات المفهوم لثغرة التحرير المزدوج في Apache mod_http2 (CVE-2026-23918) مع مراحل الاستطلاع والاستغلال وتقييم مخاطر RCE.
المتأثر: خادم Apache HTTP 2.4.66 مع mod_http2 + Event MPM
تم الإصلاح في: Apache 2.4.67 (mod_h2 v2.0.37)
CVSS 3.1: 8.8 عالي — تنفيذ تعليمات برمجية عن بُعد غير مصادق عليه ممكن
CWE: CWE-415 (تحرير مزدوج)
يحتوي mod_http2 في Apache 2.4.66 على خطأ تحرير مزدوج داخل h2_mplx.c:m_stream_cleanup(). تحدث المشكلة عندما يرسل العميل إطار HEADERS يتبعه مباشرة إطار RST_STREAM على نفس التدفق. إذا كان التوقيت مناسبًا، ينتهي الأمر بدفع التدفق مرتين إلى مصفوفة التطهير m->spurge. عند إتلاف mplx، يتم تحرير تجمع APR مرتين، مما يؤدي إلى إتلاف الكومة والتسبب في SIGABRT أو SIGSEGV.
قامت Apache بتصحيح هذا في mod_h2 v2.0.37 عن طريق إدخال add_for_purge()، وهو فحص بسيط لإزالة الازدواجية يمنع إضافة نفس التدفق مرتين.
// الضعيف (< v2.0.37)
APR_ARRAY_PUSH(m->spurge, h2_stream *) = stream; // يمكن أن يحدث مرتين
// المُصحَّح (v2.0.37+)
static int add_for_purge(h2_mplx *m, h2_stream *stream) {
for (int i = 0; i < m->spurge->nelts; ++i)
if (APR_ARRAY_IDX(m->spurge, i, h2_stream*) == stream)
return FALSE;
APR_ARRAY_PUSH(m->spurge, h2_stream *) = stream;
return TRUE;
}
افتراضيًا، يشغل البرنامج النصي خط أنابيب من 3 مراحل على الهدف:
| المرحلة | ما يفعله |
|---|---|
| 1 — الاستطلاع | يكتشف إصدار Apache، ودعم HTTP/2 عبر ALPN، ونوع MPM |
| 2 — الاستغلال | يرسل دفقات مترابطة من HEADERS+RST_STREAM، ويحاول الوضع المضمن ثم المرحلي |
| 3 — تقييم RCE | يقيس اتساق التعطل ويسجل مستوى الخطر |
يتم حساب درجة RCE من ثلاث إشارات يمكن اكتشافها عن بُعد. أولاً، ما إذا كان Apache 2.4.66 قيد التشغيل. ثانيًا، ما إذا كان MPM من نوع Event أو Worker قيد الاستخدام (يرفض mod_http2 البدء مع Prefork، لذا إذا كان HTTP/2 يعمل، فهذا يعني أن MPM مترابط). ثالثًا، مدى حتمية التعطل — فالتعطل في الجولة الأولى يعني أن إتلاف الكومة مُتحكم فيه وقابل للتكرار، وهو ما تحتاجه من أجل RCE.
pip install hpack requests
# إثبات مفهوم كامل على هدف واحد (السلوك الافتراضي)
python poc.py -t 192.168.1.100
# زيادة الضغط بمزيد من الجولات، دفعات أكبر، وخيوط أكثر
python poc.py -t 192.168.1.100 -n 20 -b 500 -w 5
# فحص سلبي فقط، لا شيء يُرسل إلى الهدف
python poc.py -t example.com --check-only
# فحص قائمة كاملة من الأهداف
python poc.py -l sites.txt -o results.json
# فحص سلبي على قائمة
python poc.py -l sites.txt --check-only
# إنشاء تقرير Markdown بعد التشغيل
python poc.py -t target.com --report report.md
| العلم | الافتراضي | الوصف |
|---|---|---|
-t | — | هدف واحد (اسم مضيف أو IP) |
-l | — | ملف يحتوي على أهداف، سطر واحد لكل هدف |
-p | 443 | المنفذ |
-n | 10 | عدد جولات الاستغلال |
-b | 200 | عدد أزواج HEADERS+RST لكل جولة |
-w | 3 | اتصالات متوازية لكل جولة |
-d | 0.1 | تأخير بين الجولات بالثواني |
-m | inline | وضع الهجوم: inline أو staged |
--no-tls | — | استخدام h2c بدلاً من TLS |
--check-only | — | استطلاع سلبي فقط، لا استغلال |
-o | — | حفظ النتائج في ملف JSON |
--report | — | إنشاء تقرير Markdown |
-v | — | إخراج مفصّل |
# هدف واحد لكل سطر، يتم تجاهل التعليقات
192.168.1.100
example.com
example.com:8443
https://example.com
http://example.com:8080
| المستوى | المعنى |
|---|---|
| حرج | تم تأكيد 2.4.66، HTTP/2 نشط، MPM Event مكتشف، التعطل حتمي — قم بالتصحيح فورًا |
| عالي | تم تأكيد 2.4.66، HTTP/2 نشط، MPM مترابط قيد الاستخدام |
| متوسط | تم اكتشاف 2.4.66 ولكن لم يتم تأكيد HTTP/2 أو التعطل بعد |
| منخفض | الإصدار غير متطابق أو لم يتم اكتشاف HTTP/2 |
| لا يوجد | تم التصحيح بالفعل إلى 2.4.67+ أو غير متأثر |
الإصلاح المناسب هو ترقية Apache إلى 2.4.67 أو أحدث. إذا لم تستطع الترقية فورًا، فإن تعطيل HTTP/2 يزيل سطح الهجوم تمامًا:
# قبل
Protocols h2 http/1.1
# بعد (تعطيل HTTP/2)
Protocols http/1.1
هذه الأداة مخصصة لاختبار الأمان المصرح به والبحث فقط. تأكد من حصولك على إذن كتابي صريح قبل تشغيلها ضد أي هدف. لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام.