
Analysiert CVE-2026-42945, einen Heap-Overrun in der NGINX-Rewrite-Engine, und bietet einen differenziellen Detektor, einen deterministischen DoS-PoC sowie einen mit Anerkennung versehenen RCE-Port mit Verifizierung.
Sicherheitsforschung zu CVE-2026-42945 (CVSS 4.0 9.2 KRITISCH): ein
Heap-Pufferüberlauf in der Script-Engine von NGINX, bei dem ein rewrite mit
Argumenten in der Ersetzung (z. B. rewrite ^(.*) /new?c=1;) das
is_args-Flag der Engine gesetzt lässt und nie zurücksetzt — sodass jede
danach in set/if ausgewertete Erfassung ($1) mit URI-Escaping in
einen Puffer kopiert wird, der für die unescaped Länge dimensioniert
wurde. Erreichbar ohne Authentifizierung durch jeden Client, dessen
Request-URI %XX-Escapes oder + enthält.
Ergebnis (Phase 1): ein sicherer (verwundbar 1.30.0 vs. behoben 1.30.1, null Abstürze) plus ein (SIGSEGV, Core-Dump — die Antwort wird zuerst vollständig ausgeliefert). Beide reproduziert gegen Builds, die aus dem Quellcode bei Commit kompiliert wurden.
71d62c6Ergebnis (Phase 2): ein zugeschriebener Port des RCE des Reporters —
system()-Ausführung als Worker-Benutzer (nobody), reproduziert in 3/3
sauberen Läufen gegen den gepinnten Build des Reporters, repliziert unter
lab/rce/. Die Ausnutzungstechnik stammt von Leo Lin (DepthFirst);
siehe Was ist hier originell vs. frühere Arbeit und den Abschnitt
Frühere Arbeit im Writeup.
| Behauptung | Beleg |
|---|---|
| Ursache aus dem Fix-Commit abgeleitet (nicht aus Blogs) | finding-sheet |
Fix ist ein Einzeiler — e->is_args = 0; in ngx_http_script_regex_end_code() | Commit 524977e (zitiert in writeup) |
| Sicherer Detektor: verwundbar vs. behoben Oracle, null Abstürze | poc/diagnose.py — Trunkierungs-Fingerabdruck (/foo%25b vs. /foo%bar) |
| Trigger-Matrix: quotierte/Plus-URI und escapbare Zeichen in der Erfassung — beide erforderlich | poc/diagnose.py Sonden-Batterie inkl. der /a%41b-Kontrolle |
| Deterministischer Worker-DoS (SIGSEGV, Core-Dump, Antwort zuerst ausgeliefert) | poc/crash.py — X-Worker-PID-Änderung beweist Worker-Tod |
| Behobenes 1.30.1 übersteht den identischen Angriff | poc/crash.py --host 127.0.0.1:29544 — 3/3 Runden überstanden |
| RCE (Phase 2, Technik des Reporters, zugeschriebener Port) | exploit/rce.py — 3/3 Läufe, Beweisdatei + uid=65534(nobody), Worker exited on signal 11 nach Ausführung |
# Differenzielles Paar: nginx 1.30.0 (:29543) + 1.30.1 (:29544) aus dem Quellcode gebaut
cd lab && docker compose up -d --build && cd ..
python3 poc/diagnose.py # sicheres Oracle — stürzt keinen der beiden Worker ab
python3 poc/crash.py --host 127.0.0.1:29543 # 1.30.0: Worker stirbt mit Signal 11, Core-Dump
python3 poc/crash.py --host 127.0.0.1:29544 # 1.30.1: übersteht jede Runde
docker logs cve-42945-vuln 2>&1 | grep 'exited on signal' | tail -3
Phase 2 — RCE gegen den gepinnten Build des Reporters (nginx-Dev-Rev
98fc3bb7 = release-1.29.8-14, ASLR durch den gepinnten Entrypoint deaktiviert):
docker compose -f lab/rce/docker-compose.yml up -d --build # :29545, dauert Minuten zum Bauen
python3 exploit/rce.py \
--cmd 'echo pwned-by-cve-2026-42945 > /tmp/proof' --verify --expect pwned
docker compose -f lab/rce/docker-compose.yml exec nginx cat /tmp/proof
| Dokument | Was es ist |
|---|---|
| docs/finding-sheet.md | Einseitiges Datenblatt: Versionen, CVSS, Konfigurationsmuster, Trigger-Bedingungen, Erkennungssignaturen |
| docs/report-ptes.md | PTES-strukturierter Bericht (7 Phasen), begrenzt auf das tatsächlich Durchgeführte |
| docs/research-writeup.md | Die Untersuchungserzählung — Fix-Commit-Archäologie, die Trunkierungs-Überraschung, portable Lehren, zukünftige Arbeit |
Die Phase-1-Forschungskette ist originelle Arbeit: das absturzfreie
differenzielle Oracle und sein Trunkierungs-Fingerabdruck (der
ausgelieferte Body ist die neu-escapte Erfassung, auf die Roh-Länge
trunkiert — die sichtbare Signatur des Längen/Wert-Zwei-Pass-Mismatch),
die Trigger-Matrix, die beide Vorbedingungen als notwendig beweist, die
Quellcode-Ebene-Erklärung, warum der Längen-Pass is_args nicht sehen
kann, und der deterministische Worker-Kill nach der Antwort. Der Bug
selbst, das verwundbare Konfigurationsmuster und die Fix-Commit-Analyse
sind frühere Arbeit des Reporters und Upstreams — Leo Lin
(DepthFirst) hat das Problem offengelegt und Roman Arutyunyan hat es
behoben; siehe den Abschnitt Frühere Arbeit im Writeup und
DepthFirst Disclosures — Nginx-Rift,
Baum CVE-2026-42945.
Phase 2 (RCE) ist ein Port des veröffentlichten Exploits des Reporters,
keine unabhängige Kette: das Cross-Request-Heap-Feng-Shui, das den Overrun
auf den cleanup-Zeiger eines benachbarten Request-Pools landet, der
Fake-ngx_pool_cleanup_t-Spray über gehaltene POST-Bodies, die
Cleanup-Dispatch-Umleitung zu libc system(), die Overflow-Geometrie
(349 A + 969 + + 6 Ziel-Bytes), die No-ASLR-Basis/Offset-Konstanten
und der gepinnte Build in lab/rce/ (deren env/) sind allesamt das
Design von Leo Lin, mit Anerkennung in exploit/rce.py reproduziert.
Unseres in Phase 2: der Port selbst — die CLI-/Logging-/Verifikations-
Konventionen dieses Repos, Live-Heap-Scan-Kandidatenentdeckung und
Basis-Autoerkennung (deren statische Konstanten kernelabhängig sind;
siehe den Exploit-Docstring), der Stdlib-Reverse-Shell-Listener und die
Verifikationsbelege.
Dieses Repo teilt seine Methodik mit CVE-2026-42533 — NGINX Pre-Auth Heap Overflow: Analysis & RCE (Schwester-Repo): dieselbe Zwei-Pass-Längen/Wert-Bug-Klasse in der nginx-Script-Engine, dort durch eine vollständige Pre-Auth-RCE-Kette geführt. Diese Kette hat die plausible Obergrenze für diesen Bug abgesteckt; Phase 2 dieses Repos erreicht hier dieselbe Obergrenze — als zugeschriebener Port der Technik des Reporters, nicht als unabhängige Kette.
docs/ Finding-Sheet · PTES-Bericht · Forschungs-Writeup
poc/ diagnose.py (sicheres differenzielles Oracle) · crash.py (deterministischer DoS)
exploit/ rce.py — zugeschriebener Port der system()-Kette des Reporters
lab/ Dockerfile (nginx aus dem Quellcode, -g -O0) + differenzielles Compose-Paar
lab/nginx/ vulnerable.conf — die PoC-Konfiguration aus dem Fix-Commit
lab/rce/ gepinnte RCE-Umgebung des Reporters (deren env/, unser Port-Mapping)
524977e7c534
"Rewrite: fixed escaping and possible buffer overrun" (Roman Arutyunyan) — veröffentlicht in nginx 1.30.1CVE-2026-42945 (frühere Arbeit des Reporters; Leo Lin)Forschungsartefakt zu Bildungszwecken. Nur gegen Systeme ausführen, die dir gehören oder für die du ausdrücklich autorisiert bist. Die Schwachstelle ist gepatcht — aktualisiere nginx auf ≥ 1.30.1.