
Scannen Sie Ihre NGINX-Konfiguration, um festzustellen, ob sie von CVE-2026-42945 betroffen ist.
Statischer Scanner für NGINX-Konfigurationsdateien, der das rewrite/set-Muster im Zusammenhang mit CVE-2026-42945 erkennt.
Der Scanner analysiert NGINX-Konfigurationen mit crossplane, durchläuft location-Blöcke und gibt jede location aus, die in diesem Format betroffen wirkt:
/<path-to>/xxx.conf:<line-number> -> location XXXXX
Beispiel:
/path/to/nginx.conf:39 -> location ~ ^/api/(.*)$
Referenz: CVE-2026-42945-POC.
Abhängigkeiten werden mit uv in pyproject.toml verwaltet und in uv.lock gesperrt. Die einzige Laufzeitabhängigkeit ist crossplane.
Aus dem Repository-Stammverzeichnis:
uv sync
Man kann den separaten Einrichtungsschritt auch überspringen und uv run die Umgebung bei der ersten Verwendung erstellen lassen.
Eine Konfigurationsdatei scannen:
uv run ./scan.py /etc/nginx/nginx.conf
Ein Verzeichnis rekursiv scannen:
uv run ./scan.py -r /etc/nginx
Rekursiv aus dem aktuellen Verzeichnis nach *.conf-Dateien scannen:
uv run ./scan.py -r './*.conf'
Setze Glob-Muster in Anführungszeichen, wenn der Scanner sie rekursiv erweitern soll. Wenn deine Shell ./*.conf zuerst erweitert, erhält der Scanner nur die von der Shell gefundenen Dateien.
Nur die angegebenen Dateien scannen und include-Direktiven nicht verfolgen:
uv run ./scan.py --single ./site.conf
Parser-Warnungen anzeigen, einschließlich fehlender Include-Dateien:
uv run ./scan.py -v -r /etc/nginx
Eine Go-Implementierung mit demselben Ausgabeformat und denselben Exit-Codes ist in go/ verfügbar. Sie verwendet nginx-go-crossplane zum Parsen von NGINX-Konfigurationen und pflag für CLI-Flags. Sie erfordert Go 1.23 oder neuer.
Mit go run ausführen:
cd go
go run . -r ../tests/fixtures
Wenn Befunde vorhanden sind, beendet sich der Scanner mit Code 1. go run gibt in diesem Fall eine zusätzliche Zeile exit status 1 aus; baue das Binärprogramm, wenn du nur die Scanner-Ausgabe haben möchtest.
Ein eigenständiges Binärprogramm erstellen:
cd go
go build -o cve-2026-42945-scan-go .
./cve-2026-42945-scan-go -r ../tests/fixtures
Das riskante Konfigurationsmuster ist eine location, die Folgendes enthält:
rewrite-Direktive, deren Ersetzung ein nicht maskiertes ? enthältlast, break, redirect oder permanentset-Direktive, die einen Regex-Capture wie $1, ${1}, $name oder ${name} kopiertBeispiel für ein verwundbares Muster:
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true;
set $original_endpoint $1;
}
Der Scanner meldet die location-Zeile, nicht die rewrite- oder set-Zeile, da der location-Block der umsetzbare Block ist, der geprüft und behoben werden muss.
Das Verzeichnis tests/fixtures/ enthält kleine NGINX-Konfigurationen, die als Beispiele verwendet werden können:
Führe den Scanner gegen alle Beispiel-Fixtures aus:
uv run ./scan.py -r tests/fixtures
Erwartete Befunde:
/absolute/path/to/tests/fixtures/missing_include_still_scans.conf:6 -> location ~ ^/partial/(.*)$
/absolute/path/to/tests/fixtures/named_capture.conf:2 -> location /users
/absolute/path/to/tests/fixtures/vulnerable.conf:2 -> location ~ ^/api/(.*)$
Wenn betroffene locations gefunden werden, wird jeder Befund in einer eigenen Zeile ausgegeben:
/absolute/path/to/file.conf:30 -> location ~ ^/aaaa/dddd/(.*)$
/absolute/path/to/nginx.conf:39 -> location ~ ^/api/(.*)$
Keine Ausgabe bedeutet, dass in der geparsten Konfiguration keine betroffene location gefunden wurde.
Dies ist ein statischer Konfigurationsscanner. Er kann nicht:
Behandle Befunde als Stellen, die überprüft und behoben werden müssen. Ein Host ist nur dann tatsächlich betroffen, wenn sowohl der verwundbare NGINX-Versionsbereich als auch das riskante Konfigurationsmuster vorhanden sind.
Test-Suite ausführen:
uv run python -m unittest discover -s tests -v
Go-Test-Suite ausführen:
cd go
go test ./...
Syntaxprüfung ausführen:
uv run python -m py_compile scan.py
Gegen die gebündelte POC-Konfiguration ausführen:
uv run ./scan.py CVE-2026-42945-POC/env/nginx.conf
Erwartete Ausgabe:
/absolute/path/to/CVE-2026-42945-POC/env/nginx.conf:39 -> location ~ ^/api/(.*)$
| Fixture | Erwartetes Ergebnis |
|---|
tests/fixtures/vulnerable.conf | meldet einen Befund für einen nummerierten Capture |
tests/fixtures/named_capture.conf | meldet einen Befund für einen benannten Capture |
tests/fixtures/missing_include_still_scans.conf | meldet einen Befund, obwohl ein Include fehlt |
tests/fixtures/safe_break_flag.conf | kein Befund, da die rewrite-Direktive break verwendet |
tests/fixtures/safe_no_capture.conf | kein Befund, da kein Capture verfügbar ist |