
Proof-of-Concept-Exploit für die Apache-mod_http2-Double-Free-Schwachstelle (CVE-2026-23918) mit Phasen für Recon, Exploit und RCE-Risikobewertung.
Betroffen: Apache HTTP Server 2.4.66 mit mod_http2 + Event MPM
Behoben in: Apache 2.4.67 (mod_h2 v2.0.37)
CVSS 3.1: 8.8 HOCH — Nicht authentifizierte Remote-Codeausführung möglich
CWE: CWE-415 (Doppelte Freigabe)
mod_http2 in Apache 2.4.66 hat einen Double-Free-Bug innerhalb von h2_mplx.c:m_stream_cleanup(). Das Problem tritt auf, wenn ein Client einen HEADERS-Frame gefolgt von einem RST_STREAM auf demselben Stream sendet. Wenn das Timing stimmt, wird der Stream zweimal in das m->spurge-Array geschoben. Wenn der mplx zerstört wird, wird der APR-Pool zweimal freigegeben, was den Heap beschädigt und einen SIGABRT oder SIGSEGV auslöst.
Apache hat dies in mod_h2 v2.0.27 durch die Einführung von add_for_purge() behoben, einer einfachen Deduplizierungsprüfung, die verhindert, dass derselbe Stream zweimal hinzugefügt wird.
// Anfällig (< v2.0.37)
APR_ARRAY_PUSH(m->spurge, h2_stream *) = stream; // kann zweimal passieren
// Behoben (v2.0.37+)
static int add_for_purge(h2_mplx *m, h2_stream *stream) {
for (int i = 0; i < m->spurge->nelts; ++i)
if (APR_ARRAY_IDX(m->spurge, i, h2_stream*) == stream)
return FALSE;
APR_ARRAY_PUSH(m->spurge, h2_stream *) = stream;
return TRUE;
}
Standardmäßig führt das Skript eine 3-Phasen-Pipeline auf dem Ziel aus:
| Phase | Beschreibung |
|---|---|
| 1 — Erkundung | Erkennt Apache-Version, HTTP/2-Unterstützung über ALPN, MPM-Typ |
| 2 — Exploit | Sendet getaktete HEADERS+RST_STREAM-Bursts, versucht Inline- dann Staged-Modus |
| 3 — RCE-Bewertung | Misst die Konsistenz der Abstürze und bewertet das Risikoniveau |
Der RCE-Score wird aus drei Signalen berechnet, die aus der Ferne erkennbar sind. Erstens, ob Apache 2.4.66 läuft. Zweitens, ob Event oder Worker MPM verwendet wird (mod_http2 weigert sich, mit Prefork zu starten; wenn HTTP/2 funktioniert, handelt es sich um ein Threaded-MPM). Drittens, wie deterministisch der Absturz ist – ein Absturz in der ersten Runde bedeutet, dass die Heap-Korruption kontrolliert und reproduzierbar ist, was für RCE erforderlich ist.
pip install hpack requests
# Vollständiger PoC auf einem einzelnen Ziel (Standardverhalten)
python poc.py -t 192.168.1.100
# Erhöhter Druck mit mehr Runden, größeren Bursts und mehr Threads
python poc.py -t 192.168.1.100 -n 20 -b 500 -w 5
# Nur passiver Check, nichts wird an das Ziel gesendet
python poc.py -t example.com --check-only
# Eine ganze Liste von Zielen scannen
python poc.py -l sites.txt -o results.json
# Passiver Check auf einer Liste
python poc.py -l sites.txt --check-only
# Erstellen eines Markdown-Berichts nach dem Lauf
python poc.py -t target.com --report report.md
# ein Ziel pro Zeile, Kommentare werden ignoriert
192.168.1.100
example.com
example.com:8443
https://example.com
http://example.com:8080
Die richtige Lösung ist ein Upgrade von Apache auf 2.4.67 oder neuer. Falls ein sofortiges Upgrade nicht möglich ist, deaktiviert man HTTP/2 vollständig, um die Angriffsfläche zu beseitigen:
# Vorher
Protocols h2 http/1.1
# Nachher (deaktiviert HTTP/2)
Protocols http/1.1
Dieses Tool ist nur für autorisierte Sicherheitstests und Forschung gedacht. Stellen Sie sicher, dass Sie eine ausdrückliche schriftliche Genehmigung haben, bevor Sie es gegen ein Ziel einsetzen. Der Autor übernimmt keine Verantwortung für Missbrauch.
| Flag | Standard | Beschreibung |
|---|
-t | — | Einzelnes Ziel (Hostname oder IP) |
-l | — | Datei mit Zielen, eine pro Zeile |
-p | 443 | Port |
-n | 10 | Anzahl der Exploit-Runden |
-b | 200 | HEADERS+RST-Paare pro Runde |
-w | 3 | Parallele Verbindungen pro Runde |
-d | 0.1 | Verzögerung zwischen Runden in Sekunden |
-m | inline | Angriffsmodus: inline oder staged |
--no-tls | — | h2c anstelle von TLS verwenden |
--check-only | — | Nur passive Erkundung, kein Exploit |
-o | — | Ergebnisse in eine JSON-Datei speichern |
--report | — | Erstellen eines Markdown-Berichts |
-v | — | Ausführliche Ausgabe |
| Stufe | Bedeutung |
|---|
| KRITISCH | 2.4.66 bestätigt, HTTP/2 aktiv, Event MPM erkannt, Absturz deterministisch – sofort patchen |
| HOCH | 2.4.66 bestätigt, HTTP/2 aktiv, Threaded MPM in Verwendung |
| MITTEL | 2.4.66 erkannt, aber HTTP/2 oder Absturz noch nicht bestätigt |
| NIEDRIG | Version stimmt nicht überein oder kein HTTP/2 erkannt |
| KEINE | Bereits auf 2.4.67+ gepatcht oder nicht betroffen |