
Scanner statico di configurazione che segnala le configurazioni nginx vulnerabili al bug complex_value di capture-clobbering a due passaggi (regex map + cattura regex → heap overflow / info leak).
Uno scanner statico in sola lettura che segnala configurazioni nginx vulnerabili alla classe di bug di capture-clobbering a due passate complex_value (avviso F5/nginx SIRT, luglio 2026). Analizza la tua configurazione e segnala il pattern vulnerabile con il motivo e la posizione. Non sfrutta nulla e non tocca il server in esecuzione.
File singolo, solo libreria standard, Python 3.6+.
Analisi completa della vulnerabilità: https://cyberstan.co.uk/nginx-rce/
nginx costruisce molti valori di direttiva in due passate. Una passata LEN misura la lunghezza e alloca un buffer, poi una passata VALUE vi scrive dentro. Le catture regex ($1 a $9, o quelle con nome (?P<name>...)) vengono lette da uno stato condiviso per-richiesta. Una map la cui chiave di corrispondenza è un'espressione regolare esegue una nuova corrispondenza PCRE nel momento in cui la sua variabile viene valutata, e quella corrispondenza sovrascrive lo stato condiviso delle catture. Se una cattura viene misurata nella passata LEN e poi una map regex viene eseguita prima che la passata VALUE riscriva quella cattura, le due passate non concordano:
Entrambe le direzioni sono attivabili da remoto quando l'input della map è
influenzato dall'attaccante ($request_body, $http_*, $arg_*, $uri,
$ssl_preread_server_name, e così via).
Lo scanner segnala una location o un server quando tutti questi elementi finiscono in un unico buffer a due passate, nell'ordine sfruttabile:
location ~ regex, server_name ~, rewrite,
if (... ~ ...), o una map regex con un gruppo di cattura.map (http o stream) con una chiave di corrispondenza regex ~ o ~*,
referenziata dalla sua variabile di output.return, set, add_header, proxy_method,
proxy_pass, rewrite, index, e altre): entrambi i riferimenti nello stesso valore.proxy_set_header, proxy_set_body,
fastcgi_param, scgi_param, uwsgi_param, grpc_set_header): queste
costruiscono un buffer per richiesta per l'intera famiglia, quindi i due riferimenti possono
trovarsi in direttive separate nella stessa location.# scan a single config (follows include directives by default)
python3 nginx_capture_clobber_scan.py /etc/nginx/nginx.conf
# scan a directory (uses nginx.conf if present, else all *.conf)
python3 nginx_capture_clobber_scan.py /etc/nginx/
# scan several roots
python3 nginx_capture_clobber_scan.py site-a.conf site-b.conf
# machine-readable output
python3 nginx_capture_clobber_scan.py /etc/nginx/nginx.conf --json
# do not expand include directives
python3 nginx_capture_clobber_scan.py /etc/nginx/nginx.conf --no-includes
| Opzione | Effetto |
|---|---|
--json | Emette un report JSON invece del testo. |
--no-includes | Non segue le direttive include. |
| Codice | Significato |
|---|---|
0 | Nessuna configurazione vulnerabile trovata. |
1 | Almeno una configurazione vulnerabile trovata. |
2 | Errore di utilizzo (nessun percorso fornito o nessuno trovato). |
Utilizzabile in CI, poiché una configurazione vulnerabile esce con codice diverso da zero:
python3 nginx_capture_clobber_scan.py /etc/nginx/nginx.conf || echo "review needed"
La modalità testo stampa, per ogni rilevamento: file e riga, l'ambito contenitore, la direttiva sink, le variabili di capture e map coinvolte, la map che ha attivato il rilevamento e un motivo su una riga. Una sezione "cleared" elenca le coesistenze in ordine sicuro. --json produce:
{
"vulnerable": true,
"findings": [
{
"file": "/etc/nginx/conf.d/api.conf",
"line": 12,
"scope": "location ~ ^/api/(.+)$",
"directive": "proxy (family buffer)",
"captures": ["$1"],
"map_vars": ["$is_bot"],
"triggers": ["$is_bot <- regex-map on $http_user_agent [nginx.conf:30]"],
"reason": "..."
}
],
"cleared_safe_order": [],
"regex_maps": [],
"missing_includes": []
}
map regex nella stessa location o nello stesso buffer di un
riferimento $1-$9 o a un riferimento con nome di cattura.(?P<name>...) attraverso più map regex.proxy_set_header o
fastcgi_param.set.include non leggibili (ad esempio percorsi assoluti che non esistono
localmente) vengono segnalati in missing_includes, non saltati silenziosamente. Eseguirlo
sull'host in cui la configurazione viene risolta per una copertura completa.Analisi della vulnerabilità e catena di exploit: https://cyberstan.co.uk/nginx-rce/