
Exploit proof-of-concept per CVE-2026-23918, una vulnerabilità double-free in Apache mod_http2 che consente l'esecuzione di codice remoto non autenticata. Include ricognizione, raffiche threaded di HEADERS+RST_STREAM e punteggio di rischio RCE.
Versione affetta: Apache HTTP Server 2.4.66 con mod_http2 + Event MPM
Corretto in: Apache 2.4.67 (mod_h2 v2.0.37)
CVSS 3.1: 8.8 ALTO — Possibile esecuzione di codice remoto non autenticata
CWE: CWE-415 (Double Free)
mod_http2 in Apache 2.4.66 ha un bug di double free all'interno di h2_mplx.c:m_stream_cleanup(). Il problema si verifica quando un client invia un frame HEADERS immediatamente seguito da un RST_STREAM sullo stesso stream. Se il tempismo è giusto, lo stream viene inserito due volte nell'array di purge m->spurge. Quando l'mplx viene distrutto, il pool APR viene liberato due volte, corrompendo l'heap e provocando un SIGABRT o SIGSEGV.
Apache ha corretto questo in mod_h2 v2.0.37 introducendo add_for_purge(), un semplice controllo di deduplicazione che impedisce che lo stesso stream venga aggiunto due volte.
// Vulnerable (< v2.0.37)
APR_ARRAY_PUSH(m->spurge, h2_stream *) = stream; // can happen twice
// Fixed (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;
}
Per impostazione predefinita, lo script esegue una pipeline a 3 fasi sul target:
| Fase | Cosa fa |
|---|---|
| 1 — Recon | Rileva la versione di Apache, il supporto HTTP/2 tramite ALPN, il tipo di MPM |
| 2 — Exploit | Invia raffiche di HEADERS+RST_STREAM thread, prova la modalità inline poi staged |
| 3 — RCE Assessment | Misura la consistenza del crash e assegna un punteggio al livello di rischio |
Il punteggio RCE viene calcolato da tre segnali rilevabili da remoto. Primo, se Apache 2.4.66 è in esecuzione. Secondo, se è in uso il MPM Event o Worker (mod_http2 si rifiuta di avviarsi con Prefork, quindi se HTTP/2 funziona, è un MPM thread-based). Terzo, quanto è deterministico il crash — un crash al primo round significa che la corruzione dell'heap è controllata e riproducibile, ciò che serve per RCE.
pip install hpack requests
# Full PoC on a single target (default behavior)
python poc.py -t 192.168.1.100
# Increase pressure with more rounds, bigger bursts and more threads
python poc.py -t 192.168.1.100 -n 20 -b 500 -w 5
# Passive check only, nothing is sent to the target
python poc.py -t example.com --check-only
# Scan a whole list of targets
python poc.py -l sites.txt -o results.json
# Passive check on a list
python poc.py -l sites.txt --check-only
# Generate a Markdown report after the run
python poc.py -t target.com --report report.md
# one target per line, comments are ignored
192.168.1.100
example.com
example.com:8443
https://example.com
http://example.com:8080
La correzione appropriata è aggiornare Apache alla versione 2.4.67 o successiva. Se non puoi aggiornare immediatamente, disabilitare HTTP/2 rimuove completamente la superficie di attacco:
# Before
Protocols h2 http/1.1
# After (disables HTTP/2)
Protocols http/1.1
Questo strumento è pensato esclusivamente per test di sicurezza autorizzati e ricerca. Assicurati di avere un permesso scritto esplicito prima di eseguirlo contro qualsiasi target. L'autore non si assume alcuna responsabilità per un uso improprio.
| Opzione | Predefinito | Descrizione |
|---|
-t | — | Singolo target (hostname o IP) |
-l | — | File con target, uno per riga |
-p | 443 | Porta |
-n | 10 | Numero di round di exploit |
-b | 200 | Coppie HEADERS+RST per round |
-w | 3 | Connessioni parallele per round |
-d | 0.1 | Ritardo tra i round in secondi |
-m | inline | Modalità di attacco: inline o staged |
--no-tls | — | Usa h2c invece di TLS |
--check-only | — | Solo ricognizione passiva, nessun exploit |
-o | — | Salva i risultati in un file JSON |
--report | — | Genera un report Markdown |
-v | — | Output verbose |
| Livello | Cosa significa |
|---|
| CRITICO | 2.4.66 confermato, HTTP/2 attivo, Event MPM rilevato, crash deterministico — applicare la patch immediatamente |
| ALTO | 2.4.66 confermato, HTTP/2 attivo, MPM thread-based in uso |
| MEDIO | 2.4.66 rilevato ma HTTP/2 o crash non ancora confermati |
| BASSO | Versione non corrispondente o HTTP/2 non rilevato |
| NESSUNO | Già aggiornato a 2.4.67+ o non interessato |