
Statischer Konfigurationsscanner, der nginx-Konfigurationen markiert, die anfällig für den complex_value two-pass capture-clobbering Bug sind (Regex-Map + Regex-Capture → Heap-Überlauf / Informationsleck).
Ein schreibgeschützter statischer Scanner, der nginx-Konfigurationen kennzeichnet, die für die Fehlerklasse complex_value des Zwei-Pass-Capture-Clobbering anfällig sind (F5/nginx SIRT Advisory, Juli 2026). Er parst deine Konfiguration und meldet das anfällige Muster mit Begründung und Fundstelle. Er nutzt nichts aus und berührt den laufenden Server nicht.
Einzelne Datei, nur Standardbibliothek, Python 3.6+.
Vollständige Ausarbeitung der Schwachstelle: https://cyberstan.co.uk/nginx-rce/
nginx erzeugt viele Direktivenwerte in zwei Durchgängen. Ein LEN-Durchgang misst die Länge und reserviert einen Puffer, dann schreibt ein VALUE-Durchgang hinein. Regex-Captures ($1 bis $9 oder benannte (?P<name>...)) werden aus einem pro Request geteilten Zustand gelesen. Eine map, deren Match-Schlüssel ein regulärer Ausdruck ist, führt in dem Moment, in dem ihre Variable ausgewertet wird, einen frischen PCRE-Match aus, und dieser Match überschreibt den geteilten Capture-Zustand. Wenn ein Capture im LEN-Durchgang gemessen wird und dann eine Regex-map läuft, bevor der VALUE-Durchgang dieses Capture neu schreibt, stimmen die beiden Durchgänge nicht überein:
Beide Richtungen sind remote auslösbar, wenn die Map-Eingabe vom Angreifer beeinflussbar ist ($request_body, $http_*, $arg_*, $uri,
$ssl_preread_server_name und so weiter).
Der Scanner kennzeichnet eine Location oder einen Server, wenn all dies in einem einzigen Zwei-Pass-Puffer in der ausnutzbaren Reihenfolge zusammentrifft:
location ~, server_name ~, rewrite,
if (... ~ ...) oder eine Regex-map mit einer Capture-Gruppe.map (http oder stream) mit einem ~- oder ~*-Regex-Match-Schlüssel, referenziert über ihre Ausgabevariable.return, set, add_header, proxy_method,
proxy_pass, rewrite, index und andere): beide Referenzen im selben Wert.proxy_set_header, proxy_set_body,
fastcgi_param, scgi_param, uwsgi_param, grpc_set_header): diese
erzeugen einen Puffer pro Request für die gesamte Familie, sodass die beiden Referenzen
in separaten Direktiven derselben Location stehen können.# 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
| Option | Wirkung |
|---|---|
--json | Gibt einen JSON-Bericht statt Text aus. |
--no-includes | Folgt keinen include-Direktiven. |
| Code | Bedeutung |
|---|---|
0 | Keine verwundbare Konfiguration gefunden. |
1 | Mindestens eine verwundbare Konfiguration gefunden. |
2 | Verwendungsfehler (kein Pfad angegeben oder keiner gefunden). |
In CI verwendbar, da eine verwundbare Konfiguration mit einem Nicht-Null-Code beendet wird:
python3 nginx_capture_clobber_scan.py /etc/nginx/nginx.conf || echo "review needed"
Der Textmodus gibt für jeden Fund Folgendes aus: Datei und Zeile, den umschließenden Gültigkeitsbereich, die Sink-Direktive, die beteiligten Capture- und Map-Variablen, die auslösende Map sowie eine einzeilige Begründung. Ein als sicher eingestufter Abschnitt listet Koexistenzen in sicherer Reihenfolge auf. --json erzeugt:
{
"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-Variable in derselben Location oder demselben Puffer wie eine
$1- bis $9- oder Named-Capture-Referenz.(?P<name>...)-Gruppe über mehrere Regex-Maps hinweg.proxy_set_header- oder
fastcgi_param-Familie heraus.set-Variablen erzeugt werden.include-Ziele (zum Beispiel absolute Pfade, die lokal nicht existieren)
werden unter missing_includes gemeldet und nicht stillschweigend übersprungen. Führen Sie das Tool
auf dem Host aus, auf dem die Config aufgelöst wird, um vollständige Abdeckung zu erhalten.Schwachstellen-Write-up und Exploit-Kette: https://cyberstan.co.uk/nginx-rce/