
Nur-Erkennungs-Scanner für CVE-2026-42945 (NGINX Rift), einen Heap-Überlauf in ngx_http_rewrite_module. Versionserkennung + nginx.conf-Musteranalyse. Python 3 nur mit stdlib, keine Netzwerkaufrufe.
Abhängigkeitsfreier Python 3 Scanner für CVE-2026-42945 ("NGINX Rift") —
ein CVSS v4.0 9.2 KRITISCHER heap-basierter Pufferüberlauf (CWE-122) in
ngx_http_rewrite_module.
Bei jedem Aufruf werden zwei unabhängige Prüfungen durchgeführt:
| Prüfung | Methode |
|---|---|
| Version | nginx -V, dpkg/rpm/apk, Dockerfile/compose image tags |
| Konfigurationsmuster | Klammersensitive Analyse von nginx.conf + aller include-Dateien |
| Edition | Verwundbar | Behoben |
|---|---|---|
| NGINX OSS | 0.6.27 – 1.30.1 | 1.31.0+ (oder 1.30.1 gepatcht) |
| NGINX Plus | R32 vor R32P6 | R32P6+ |
| NGINX Plus | R36 vor R36P4 | R36P4+ |
| NGINX Plus | R37+ | Nicht betroffen |
Hinweis zu 1.30.1: Der gepatchte 1.30.1-Stable-Build meldet denselben Versionsstring wie der verwundbare, daher stuft der Scanner jede 1.30.1 als
POTENTIALLY_VULNERABLEein (Exit 1, konservativ). Überprüfen Sie das Paket-Changelog / Advisory-Backport, um zu bestätigen, dass der Patch angewendet wurde.
Ein Scope-Block wird markiert, wenn alle drei Bedingungen erfüllt sind:
rewrite-, if- oder set-Direktive verwendet einen unbenannten PCRE-Capture-Verweis ($1–$9, einschließlich der Klammerform ${1}–${9}).?-Zeichen (bei rewrite/set ist das Regex-Pattern-Argument ausgeschlossen – ein ? dort ist ein PCRE-Quantifier; if-Bedingungen werden konservativ gescannt).rewrite/if/set-Direktive folgt im selben Scope (Includes werden in den einschließenden Scope eingefügt, sodass Paare, die eine include-Grenze überspannen, erkannt werden).# Clone and run
git clone https://github.com/simota/nginx-rift-scanner.git
cd nginx-rift-scanner
# Scan local nginx (binary in PATH, config at /etc/nginx/nginx.conf)
python3 scripts/scan_nginx_rift.py
# Custom paths
python3 scripts/scan_nginx_rift.py \
--nginx-binary /usr/sbin/nginx \
--config /etc/nginx/nginx.conf \
--prefix /etc/nginx \
--scan-dir /app
# JSON output (CI / SIEM)
python3 scripts/scan_nginx_rift.py --json
# Validate with included fixtures
python3 scripts/scan_nginx_rift.py --config fixtures/vulnerable.nginx.conf
python3 scripts/scan_nginx_rift.py --config fixtures/safe.nginx.conf
Exit-Codes: 0 = sauber, 1 = VERWUNDBARE / POTENTIELL VERWUNDBARE Version
oder Konfigurationsmuster erkannt.
| Flag | Standard | Beschreibung |
|---|---|---|
--nginx-binary PATH | nginx | Pfad zur nginx-Binärdatei |
--config PATH | /etc/nginx/nginx.conf | Root nginx-Konfiguration zum Scannen |
--prefix PATH | Verzeichnis von --config | nginx-Konfigurationspräfix zur Auflösung relativer include-Pfade (nginx löst sie gegen das Präfix auf, nicht gegen das Verzeichnis der includierten Datei) |
--scan-dir PATH | . | Verzeichnis für die Suche nach Dockerfiles/Compose-Dateien |
--json | — | JSON-Bericht auf stdout ausgeben |
Upgrade (bevorzugt):
Workaround — Ersetzen Sie unbenannte Captures durch benannte Captures in
jeder rewrite/if/set-Direktive, die ebenfalls ? enthält:
# Vulnerable
rewrite ^/api/(\w+)$ /new-api?path=$1 last;
# Safe
rewrite ^/api/(?<action>\w+)$ /new-api?path=$action last;
Konfigurationserkennungen sind heuristisch. Eine markierte Direktive
garantiert keine Ausnutzbarkeit – das ? befindet sich möglicherweise nicht
im URI-Konstruktionspfad, oder der Capture-Verweis interagiert nicht mit der
Allokation, die überläuft. Jeder Befund sollte von einem Menschen überprüft
werden, bevor die Behebung priorisiert wird.
nginx-Binärdatei (optional — Versionsprüfung wird übersprungen, wenn nicht vorhanden)| Datei | Erwartetes Ergebnis |
|---|---|
fixtures/vulnerable.nginx.conf | 3 Konfigurationserkennungen, Exit 1 |
fixtures/safe.nginx.conf | 0 Konfigurationserkennungen, Exit 0 |
python3 -m unittest discover -s tests -v