
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.
Scanner Python 3 sans dépendances pour CVE-2026-42945 ("NGINX Rift") —
un débordement de buffer sur le tas (CWE-122) classé 9.2 CRITIQUE selon
CVSS v4.0 dans ngx_http_rewrite_module.
Deux vérifications indépendantes sont effectuées à chaque exécution :
| 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 |
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/ (les includes sont insérés dans la portée incluse, donc les paires chevauchant une limite 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é.
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
| É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é |
setinclude| 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 |