
Scanner solo di rilevamento per CVE-2026-42945 (NGINX Rift), un heap overflow in ngx_http_rewrite_module. Rilevamento della versione + analisi dei pattern di nginx.conf. Solo libreria standard Python 3, nessuna chiamata di rete.
Scanner Python 3 senza dipendenze per CVE-2026-42945 ("NGINX Rift") —
un overflow del buffer basato su heap (CWE-122) con punteggio CVSS v4.0 9.2 CRITICO in ngx_http_rewrite_module.
Due controlli indipendenti vengono eseguiti a ogni invocazione:
| Controllo | Come |
|---|---|
| Versione | nginx -V, dpkg/rpm/apk, Dockerfile/compose image tags |
| Pattern di configurazione | Analisi con riconoscimento delle parentesi di nginx.conf + tutti i file include |
Nota su 1.30.1: la build stabile patchata di 1.30.1 riporta la stessa stringa di versione di quella vulnerabile, quindi lo scanner classifica qualsiasi 1.30.1 come
POTENTIALLY_VULNERABLE(exit 1, conservativo). Verifica il changelog del pacchetto / il backport dell'avviso per confermare che la patch sia applicata.
Un blocco di scope viene segnalato quando tutte e tre le condizioni sono vere:
rewrite, if, o set utilizza un riferimento a cattura PCRE senza nome ($1–$9, inclusa la forma con parentesi ${1}–${9}).? (per rewrite/set l'argomento del pattern regex è escluso — un ? lì è un quantificatore PCRE; le condizioni if vengono scansionate in modo conservativo).rewrite/if/ (gli include vengono inseriti nello scope includente, quindi le coppie che attraversano un confine vengono rilevate).# Clona ed esegui
git clone https://github.com/simota/nginx-rift-scanner.git
cd nginx-rift-scanner
# Scansiona nginx locale (binario in PATH, config in /etc/nginx/nginx.conf)
python3 scripts/scan_nginx_rift.py
# Percorsi personalizzati
python3 scripts/scan_nginx_rift.py \
--nginx-binary /usr/sbin/nginx \
--config /etc/nginx/nginx.conf \
--prefix /etc/nginx \
--scan-dir /app
# Output JSON (CI / SIEM)
python3 scripts/scan_nginx_rift.py --json
# Convalida con i fixture inclusi
python3 scripts/scan_nginx_rift.py --config fixtures/vulnerable.nginx.conf
python3 scripts/scan_nginx_rift.py --config fixtures/safe.nginx.conf
Codici di uscita: 0 = pulito, 1 = versione VULNERABLE / POTENTIALLY_VULNERABLE o pattern di configurazione segnalato.
Aggiornamento (consigliato):
Soluzione alternativa — sostituire le catture senza nome con catture nominate in ogni direttiva rewrite/if/set che contiene anche ?:
# Vulnerabile
rewrite ^/api/(\w+)$ /new-api?path=$1 last;
# Sicuro
rewrite ^/api/(?<action>\w+)$ /new-api?path=$action last;
I risultati della configurazione sono euristici. Una direttiva segnalata non garantisce la sfruttabilità — il ? potrebbe non essere nel percorso di costruzione dell'URI, o il riferimento alla cattura potrebbe non interagire con l'allocazione che causa l'overflow. Ogni risultato dovrebbe essere revisionato da un essere umano prima di prioritizzare la mitigazione.
nginx (opzionale — controllo versione saltato se assente)| File | Risultato atteso |
|---|---|
fixtures/vulnerable.nginx.conf | 3 risultati di configurazione, exit 1 |
fixtures/safe.nginx.conf | 0 risultati di configurazione, exit 0 |
python3 -m unittest discover -s tests -v
| Edizione | Vulnerabile | Corretta |
|---|
| NGINX OSS | 0.6.27 – 1.30.1 | 1.31.0+ (o 1.30.1 con patch) |
| NGINX Plus | R32 prima di R32P6 | R32P6+ |
| NGINX Plus | R36 prima di R36P4 | R36P4+ |
| NGINX Plus | R37+ | Non affetto |
setinclude| Flag | Default | Descrizione |
|---|
--nginx-binary PATH | nginx | Percorso dell'eseguibile nginx |
--config PATH | /etc/nginx/nginx.conf | Configurazione nginx principale da scansionare |
--prefix PATH | directory di --config | Prefisso di configurazione nginx utilizzato per risolvere i percorsi include relativi (nginx li risolve rispetto al prefisso, non alla directory del file includente) |
--scan-dir PATH | . | Directory in cui cercare file Dockerfile/compose |
--json | — | Emette report JSON su stdout |