
Scanner di vulnerabilità non distruttivo per NGINX HTTP/3 (ngx_http_v3_module). Esegue SOLO un probe sicuro: apre una connessione HTTP/3 (QUIC), invia una singola richiesta HEAD e ispeziona l'intestazione di risposta `Server`. NON tenta mai di riaprire un flusso encoder QPACK o di innescare il use-after-free.
Scanner di massa non distruttivo per il use-after-free di NGINX HTTP/3 (QUIC)
Fai l'inventario di quali dei tuoi host sono esposti — senza mai attivare il bug.
Questo strumento è destinato esclusivamente a test di sicurezza autorizzati — sulla tua infrastruttura o su sistemi per cui hai un esplicito permesso scritto di valutazione. Esegue una impronta digitale in sola lettura e non sfrutta la vulnerabilità. Sei responsabile di rimanere entro l'ambito e di rispettare le leggi applicabili e i principi di responsible disclosure. Gli autori non si assumono alcuna responsabilità per usi impropri.
CVE-2026-42530 è un use-after-free (CWE-416) nel modulo ngx_http_v3_module di NGINX. Quando NGINX è configurato per servire HTTP/3, un attaccante remoto non autenticato può riaprire un flusso QPACK encoder all'interno di una sessione HTTP/3 appositamente costruita, causando il riferimento a memoria deallocata in un processo worker. L'impatto immediato è l'arresto anomalo / riavvio del worker (denial of service); su host dove ASLR è disabilitato o aggirabile, può portare a esecuzione di codice remoto.
Punto chiave: la falla è raggiungibile solo quando HTTP/3 (QUIC) è abilitato — non è attivo di default. Gli host che servono solo HTTP/1.1 o HTTP/2 su TCP non sono interessati da questo vettore specifico.
| CVE | CVE-2026-42530 |
| Componente | ngx_http_v3_module (HTTP/3 / QUIC) |
| Classe | Use-After-Free (CWE-416) |
| CVSS | 9.2 (v4) · 8.1 (v3.1) |
| Impatto | Crash worker / DoS, possibile RCE senza ASLR |
| Vettore | Rete, non autenticato, nessuna interazione utente |
| Ramo | Stato |
|---|---|
| NGINX Open Source 1.31.0 – 1.31.1 | ❌ Vulnerabile |
| NGINX Open Source 1.31.2+ | ✅ Corretto |
| NGINX Plus | Applica advisory del vendor (R36 P6 / 37.0.2.1) |
Apre una connessione HTTP/3 reale, invia una singola richiesta HEAD / e legge l'header Server restituito. Da questo classifica ogni target — e, cosa importante, tratta gli host raggiungibili ma con versione nascosta come da revisionare manualmente anziché come un falso "pulito", poiché il fatto che QUIC sia raggiungibile è la precondizione per il CVE.
| Stato | Significato |
|---|---|
VULNERABLE | NGINX 1.31.0 / 1.31.1 servito su HTTP/3 |
HTTP3_VERSION_HIDDEN | HTTP/3 raggiungibile ma Server è mascherato (server_tokens off) — verifica la versione manualmente |
LIKELY_PATCHED | NGINX su HTTP/3, versione al di fuori dell'intervallo affetto |
NOT_NGINX | HTTP/3 raggiungibile, ma il server non è NGINX |
NO_HTTP3 | Nessun listener HTTP/3 / QUIC raggiungibile (non esposto tramite questo vettore) |
ERROR | Sonda fallita per altri motivi |
Richiede Python 3.11+ (usa asyncio.timeout).
git clone https://github.com/renzi25031469/CVE-2026-42530-scanner.git
cd CVE-2026-42530-scanner
pip install aioquic
Suggerimento: usa un ambiente virtuale —
python3 -m venv .venv && source .venv/bin/activate.
# Singolo host
python3 cve-2026-42530-scanner.py example.com
# Molti host da un file, 100 in parallelo, salva un CSV
python3 cve-2026-42530-scanner.py -f targets.txt -c 100 --csv results.csv
# Pipe dei target da stdin ed esporta JSON
cat hosts.txt | python3 cve-2026-42530-scanner.py -f - --json results.json
# Porta e timeout personalizzati
python3 cve-2026-42530-scanner.py target.internal -p 8443 -t 5
Un host per riga. Porte, schemi, percorsi e commenti vengono gestiti automaticamente:
# produzione edge
edge01.example.com
edge02.example.com:8443
https://api.example.com/
# staging
10.0.5.21
| Flag | Descrizione | Default |
|---|---|---|
host | Singolo target (posizionale) | — |
-f, --file | File lista target (- = stdin) | — |
-p, --port | Porta QUIC/UDP predefinita | 443 |
-t, --timeout | Timeout per host (secondi) | 10 |
-c, --concurrency | Massimo scansioni simultanee | 50 |
--csv | Scrivi risultati in CSV | — |
--json | Scrivi risultati in JSON | — |
[*] CVE-2026-42530 safe-check — 4 target(s), concurrency=100, timeout=10s
======================================================================
CVE-2026-42530 SAFE-CHECK RESULTS
======================================================================
[VULNERABLE ] edge01.example.com:443 (Server: nginx/1.31.1)
-> Vulnerable NGINX version over HTTP/3. Upgrade to nginx/1.31.2 or later.
[HTTP3_VERSION_HIDDEN ] api.example.com:443
-> HTTP/3 reachable but Server header is masked. Verify the NGINX version manually.
[LIKELY_PATCHED ] edge02.example.com:8443 (Server: nginx/1.31.2)
[NO_HTTP3 ] 10.0.5.21:443
----------------------------------------------------------------------
Summary: VULNERABLE=1 | HTTP3_VERSION_HIDDEN=1 | LIKELY_PATCHED=1 | NO_HTTP3=1
[!] 1 host(s) appear VULNERABLE. Mitigation: upgrade to nginx/1.31.2 or later,
or remove 'quic' from all 'listen' directives.
======================================================================
quic da ogni direttiva listen e togliendo http3 on;, poi ricarica NGINX. Questo rimuove completamente il percorso di codice vulnerabile./proc/sys/kernel/randomize_va_space = 2). Consideralo come uno strato di indurimento, non un sostituto della patch.aioquic è asincrono, quindi questo scanner usa un asyncio.Semaphore invece di thread del sistema operativo. Per lavori vincolati da I/O di rete — centinaia di handshake QUIC in attesa sul cavo — un singolo event loop scala ulteriormente con molto meno overhead rispetto a un pool di thread, fornendo allo stesso tempo lo stesso comportamento di "scansiona molti host contemporaneamente". Regola il limite con -c.