
Scanner de détection uniquement pour CVE-2026-42945 (NGINX Rift), un débordement de tas dans ngx_http_rewrite_module. Détection de version + analyse de motifs nginx.conf. Python 3 stdlib-only, aucun appel réseau.
| Vérification | Méthode |
|---|
| Version | nginx -V, dpkg/rpm/apk, tags d'images Dockerfile/compose |
| Pattern de configuration | Analyse sensible aux accolades de nginx.conf + tous les fichiers include |
| Édition | Vulnérable | Corrigée |
|---|---|---|
| NGINX OSS | 0.6.27 – 1.30.1 | 1.31.0+ (ou 1.30.1 patché) |
| NGINX Plus | R32 avant R32P6 | R32P6+ |
| NGINX Plus | R36 avant R36P4 | R36P4+ |
| NGINX Plus | R37+ | Non affecté |
Note sur 1.30.1 : la version stable patchée 1.30.1 rapporte la même chaîne de version que la version vulnérable, donc le scanner classe toute version 1.30.1 comme
POTENTIELLEMENT_VULNÉRABLE(code de sortie 1, conservatif). Vérifiez le changelog du paquet / l'avis de rétroportage pour confirmer que le patch est appliqué.
Un bloc de portée est signalé lorsque les trois conditions suivantes sont réunies :
rewrite, if ou set utilise une référence de capture PCRE non nommée ($1–$9, y compris la forme avec accolades ${1}–${9}).? (pour rewrite/set, l'argument du motif regex est exclu — un ? là est un quantificateur PCRE ; les conditions if sont analysées de manière conservative).rewrite/if/set suit dans la même portée (les includes sont insérés dans la portée incluse, donc les paires chevauchant une limite include sont détectées).# Cloner et exécuter
git clone https://github.com/simota/nginx-rift-scanner.git
cd nginx-rift-scanner
# Analyser le nginx local (binaire dans PATH, config dans /etc/nginx/nginx.conf)
python3 scripts/scan_nginx_rift.py
# Chemins personnalisés
python3 scripts/scan_nginx_rift.py \
--nginx-binary /usr/sbin/nginx \
--config /etc/nginx/nginx.conf \
--prefix /etc/nginx \
--scan-dir /app
# Sortie JSON (CI / SIEM)
python3 scripts/scan_nginx_rift.py --json
# Valider avec les fixtures incluses
python3 scripts/scan_nginx_rift.py --config fixtures/vulnerable.nginx.conf
python3 scripts/scan_nginx_rift.py --config fixtures/safe.nginx.conf
Codes de sortie : 0 = propre, 1 = version VULNÉRABLE / POTENTIELLEMENT_VULNÉRABLE
ou pattern de configuration signalé.
| Option | Défaut | Description |
|---|---|---|
--nginx-binary PATH | nginx | Chemin vers l'exécutable nginx |
--config PATH | /etc/nginx/nginx.conf | Fichier de configuration racine nginx à analyser |
--prefix PATH | répertoire de --config | Préfixe de configuration nginx utilisé pour résoudre les chemins include relatifs (nginx résout les chemins relatifs par rapport au préfixe, pas au répertoire du fichier incluant) |
--scan-dir PATH | . | Répertoire dans lequel chercher les fichiers Dockerfile/compose |
--json | — | Émettre un rapport JSON sur la sortie standard |
Mise à niveau (recommandée) :
Solution de contournement — remplacer les captures non nommées par des captures nommées dans chaque directive rewrite/if/set qui contient aussi ? :
# Vulnérable
rewrite ^/api/(\w+)$ /new-api?path=$1 last;
# Sûr
rewrite ^/api/(?<action>\w+)$ /new-api?path=$action last;
Les résultats de configuration sont heuristiques. Une directive signalée ne garantit pas l'exploitabilité — le ? peut ne pas se trouver dans le chemin de construction de l'URI, ou la référence de capture peut ne pas interagir avec l'allocation qui déborde. Chaque résultat doit être examiné par un humain avant de prioriser la correction.
nginx (optionnel — la vérification de version est ignorée s'il est absent)| Fichier | Résultat attendu |
|---|---|
fixtures/vulnerable.nginx.conf | 3 résultats de configuration, code de sortie 1 |
fixtures/safe.nginx.conf | 0 résultat de configuration, code de sortie 0 |
python3 -m unittest discover -s tests -v