Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
react2shell — RCE-Exploit-Toolkit für CVE-2025-55182 und CVE-2025-66478 in React Server Components. Enthält mehrere Exploit-Varianten, Erkennungsskripte, einen verwundbaren Testserver und eine tiefgehende technische Analyse der Flight-Protokoll-Deserialisierungsschwachstelle. | Kitploit
Tools/GitHubGitHub/freeqaz/react2shell
Dynamische Analyse (Sandboxing)SchwachstellenanalyseCode-AnalyseExploitationWebanwendungs-ExploitationPenetrationstestsPapers & ForschungLernen & BildungPayload-Entwicklung
GitHubfreeqaz/react2shell

react2shell

RCE-Exploit-Toolkit für CVE-2025-55182 und CVE-2025-66478 in React Server Components. Enthält mehrere Exploit-Varianten, Erkennungsskripte, einen verwundbaren Testserver und eine tiefgehende technische Analyse der Flight-Protokoll-Deserialisierungsschwachstelle.

68186vor 9 MonatenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Repository anzeigen
Teilen

React2Shell: RCE 0‑Day in React Server Components

CVE-2025-55182 (React) und CVE-2025-66478 (Next.js)

Dieses Repository enthält Exploit‑Code, der ausschließlich für autorisierte Sicherheitstests und zu Bildungszwecken bestimmt ist.

Siehe auch: Mehrere Forscher haben Analysen dieser Schwachstelle veröffentlicht. Im Abschnitt Referenzen finden Sie zusätzliche Perspektiven, Exploit‑Techniken und Erkennungsmethoden.

Was ist das?

Am Mittwoch, dem 3. Dezember 2025, wurde eine kritische Remote‑Code‑Ausführung‑Schwachstelle in React Server Components öffentlich bekannt gegeben. Der Fehler mit dem Namen „React2Shell“ ermöglicht es einem nicht authentifizierten Angreifer, beliebigen Code auf jedem Server auszuführen, der verwundbare Versionen von React RSC oder dem Next.js App Router verwendet – und zwar durch das Senden einer einzigen HTTP‑Anfrage.

Angesichts der weiten Verbreitung von Next.js – es betreibt einen erheblichen Teil des modernen Webs – sind die Auswirkungen dieser Schwachstelle schwerwiegend. Jede Next.js‑Anwendung, die den App Router (seit Next.js 13 der Standard für neue Projekte) mit aktiviertem RSC verwendet, ist verwundbar. Keine besondere Konfiguration. Keine spezifischen Endpunkte. Einfach eine POST‑Anfrage an eine beliebige Route.

Die Schwachstelle liegt im „Flight“‑Protokoll von React, dem Serialisierungsformat, das zum Übertragen von Daten zwischen Server und Client in React Server Components verwendet wird. Eine fehlende hasOwnProperty‑Prüfung während der Deserialisierung ermöglicht eine Traversierung der Prototypenkette, die schließlich den JavaScript-Function‑Konstruktor erreicht, um vom Angreifer kontrollierten Code auszuführen.

Der Fehler existiert in den Paketen react-server-dom-webpack, react-server-dom-turbopack und react-server-dom-parcel von React. Next.js als der dominierende RSC‑Konsument erbt die Schwachstelle durch seinen App Router.

Wer ist betroffen?

Viele Dienste sind potenziell verwundbar. Next.js ist eines der beliebtesten React‑Frameworks und wird von Unternehmen jeder Größe eingesetzt – von Startups bis zu Großunternehmen. Der App Router mit React Server Components ist seit Version 13 die Standardarchitektur für neue Next.js‑Projekte, daher sind die meisten modernen Next.js‑Bereitstellungen betroffen.

Jede Anwendung, die Folgendes verwendet:

  • React Server Components mit verwundbaren react-server-dom-*‑Paketen (19.0.0 – 19.2.0)
  • Next.js App Router der Versionen 15.x (vor 15.0.5) und 16.x (vor 16.0.7)

Dies umfasst Produktionsbereitstellungen auf Vercel, AWS, selbst gehosteter Infrastruktur und überall dort, wo Next.js App Router‑Anwendungen ausgeführt werden.

Nicht betroffen:

  • Next.js Pages Router‑Anwendungen (kein RSC)
  • Stabile Releases von Next.js 13.x und 14.x
  • Anwendungen, die nur clientseitiges React‑Rendering verwenden
  • Edge Runtime‑Bereitstellungen (kein process.mainModule verfügbar)

Betroffene Versionen

React Server Components

PaketVerwundbarBehoben
react-server-dom-webpack19.0.0, 19.1.0, 19.1.1, 19.2.019.0.1, 19.1.2, 19.2.1+
react-server-dom-turbopack19.0.0, 19.1.0, 19.1.1, 19.2.019.0.1, 19.1.2, 19.2.1+
react-server-dom-parcel19.0.0, 19.1.0, 19.1.1, 19.2.019.0.1, 19.1.2, 19.2.1+

Next.js

VersionVerwundbarBehoben
15.0.x< 15.0.515.0.5+
15.1.x< 15.1.915.1.9+
15.2.x< 15.2.615.2.6+
15.3.x< 15.3.615.3.6+
15.4.x< 15.4.815.4.8+
15.5.x< 15.5.715.5.7+
16.0.x< 16.0.716.0.7+

Abhilfe

Sofort aktualisieren. Es gibt keine Workarounds.

Für Next.js‑Anwendungen:

root@kitploit:~
npm install next@latest
# oder
pnpm update next

Für die direkte Nutzung von React RSC:

root@kitploit:~
npm install react-server-dom-webpack@latest

Überprüfen Sie Ihre installierten Versionen:

root@kitploit:~
npm ls next react-server-dom-webpack react-server-dom-turbopack

Wie der Exploit funktioniert

Voraussetzungen für den Exploit

  1. Ein Server, der verwundbare React Server Components ausführt (über Next.js App Router oder direkte RSC‑Nutzung)
  2. Netzwerkzugriff zum Senden einer HTTP‑POST‑Anfrage
  3. Das war’s. Keine Authentifizierung. Kein spezifischer Endpunkt. Jede Route funktioniert.

Der Angriff

Es wurden mehrere Angriffsvektoren für diese Schwachstelle entdeckt. Der häufigste – und derjenige, der ohne Voraussetzungen funktioniert – nutzt Prototyp‑Verschmutzung über das Flight‑Protokoll‑Referenzsystem von React.

Der Exploit sendet eine maßgeschneiderte Multipart‑POST‑Anfrage mit einem Next‑Action‑Header. Die Payload missbraucht das Referenzsystem, um:

  1. Die Prototypenkette über $1:__proto__:then zu traversieren
  2. Ein gefälschtes „Chunk“‑Objekt zu konstruieren, das Reacts interne Chunk‑Klasse nachahmt
  3. Den Deserialisierer dazu zu bringen, den JavaScript-Function‑Konstruktor aufzurufen
  4. Beliebigen Code auszuführen, wenn die resultierende Funktion als Promise‑Thenable aufgerufen wird
root@kitploit:~
POST / HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----Boundary
Next-Action: x

------Boundary
Content-Disposition: form-data; name="0"

{"then":"$1:__proto__:then","status":"resolved_model","value":"{...}","_response":{...}}
------Boundary
Content-Disposition: form-data; name="1"

"$@0"
------Boundary--

Der Code wird während der Deserialisierung ausgeführt, bevor eine Validierung der Aktions‑ID erfolgt. Das bedeutet, dass jeder Next‑Action‑Header‑Wert den verwundbaren Codepfad auslöst – es ist keine gültige Aktions‑ID erforderlich.

Andere Angriffsvektoren existieren, darunter $F‑Funktionsreferenzen und direkte Modul‑Gadgets. Diese erfordern in der Regel eine gültige Aktions‑ID. Siehe Alternative Angriffsvektoren für Details.

Die Ursache

Das Flight‑Protokoll von React löst Referenzen wie $1:path:to:value auf, indem es an Doppelpunkten trennt und das Objekt traversiert:

root@kitploit:~
// ReactFlightReplyServer.js - getOutlinedModel()
for (let i = 1; i < path.length; i++) {
  value = value[path[i]];  // No hasOwnProperty check!
}

Die Ironie: Ganz oben in derselben Datei, Zeile 35:

root@kitploit:~
import hasOwnProperty from 'shared/hasOwnProperty';

Die Absicherung wurde importiert. Sie war verfügbar. Sie wurde nur nicht in der einen Schleife verwendet, in der sie am wichtigsten gewesen wäre.

Diese einzelne fehlende Prüfung erlaubt es, mit $1:__proto__:then von einem Chunk‑Objekt aus die Prototypenkette hinauf zu Chunk.prototype.then zu gelangen – einer Funktion, die Promise‑ähnliche Objekte verarbeitet. Indem ein gefälschter Chunk mit den richtigen Eigenschaften erstellt wird, wird kontrolliert, welcher Code ausgeführt wird.

Lokale Reproduktion

Klonen Sie den verwundbaren Testserver:

root@kitploit:~
git clone https://github.com/freeqaz/react2shell
cd react2shell/vulnerable-next-server
pnpm install
pnpm dev

In einem anderen Terminal:

root@kitploit:~
./detect.sh http://localhost:3443

Ein verwundbarer Server antwortet mit HTTP 500 und E{"digest" im Antworttext. Um RCE zu demonstrieren:

root@kitploit:~
./exploit-redirect.sh http://localhost:3443 "id"

Die Befehlsausgabe erscheint in der Antwort. Für interaktive Erkundung:

root@kitploit:~
./shell.sh http://localhost:3443

Was in diesem Repository enthalten ist

Verwundbarer Testserver

Das Verzeichnis vulnerable-next-server/ enthält eine vorkonfigurierte Next.js‑16.0.6‑Anwendung mit React 19.2.0 für sicheres lokales Testen. Sie läuft standardmäßig auf Port 3443. Es handelt sich um eine minimale App‑Router‑Einrichtung, die demonstriert, dass Standardkonfigurationen verwundbar sind.

Exploit‑Skripte

Wir haben mehrere Exploit‑Varianten entwickelt, um verschiedene Szenarien abzudecken:

SkriptHTTPAusgabeProduktionAnmerkungen
exploit-redirect.sh303x-action-redirect‑HeaderJaEmpfohlen. Keine Voraussetzungen.
exploit-throw.sh500FehlerantworttextNeinNur Dev‑Modus (Fehler werden in der Produktion bereinigt).
exploit-blind.sh200Nur serverseitigJaFeuer‑und‑vergessen. Für OOB‑Exfiltration.
exploit-urlencoded.sh303x-action-redirect‑HeaderJaAndere WAF‑Signatur. Erfordert Aktions‑ID.
exploit-reflect.sh200AntworttextJaHeimlichste Variante. Erfordert Aktions‑ID.

Produktionshinweis: React entfernt Fehlermeldungen in Produktions‑Builds, was die throw‑Methode unbrauchbar macht. Nur exploit-redirect.sh erfasst zuverlässig Befehlsausgaben in der Produktion ohne Voraussetzungen. Die Weiterleitungs‑URL wird in der digest‑Eigenschaft (Metadaten) des Fehlers gespeichert, die nicht bereinigt wird – im Gegensatz zu message, das in der Produktion nur {digest: "..."} wird.

Hilfsskripte:

  • detect.sh – Zerstörungsfreie Schwachstellensonde (keine Code‑Ausführung)
  • enumerate-actions.sh – Ermittelt gültige Server‑Action‑IDs aus der Ziel‑HTML
  • exfil-file.sh – Chunkweise Dateiexfiltration (behandelt große Dateien automatisch)
  • shell.sh – Interaktive Pseudo‑Shell über RCE

Die Redirect‑Methode wird empfohlen, weil sie in der Produktion funktioniert, keine Voraussetzungen erfordert und die Befehlsausgabe direkt zurückgibt. Sie funktioniert, indem ein speziell präparierter NEXT_REDIRECT‑Fehler ausgelöst wird – die Ausgabe wird base64‑kodiert in die Weiterleitungs‑URL eingebettet und im x‑action‑redirect‑Header zurückgegeben.

Ausführliche Nutzungshinweise zu jedem Skript finden Sie in USAGE.md.

So erkennen Sie verwundbare Server

Schnellerkennung

root@kitploit:~
./detect.sh https://target.com

Dies sendet eine minimale Sonde, die den verwundbaren Codepfad auslöst, ohne beliebigen Code auszuführen.

Antwort eines verwundbaren Servers:

  • HTTP‑Status: 500
  • Content‑Type: text/x-component
  • Antworttext enthält: E{"digest"

Gepatchter Server oder Server ohne RSC: Antwortet mit 404, einem anderen Fehlerformat oder keiner Flight‑Protokoll‑Antwort.

Manuelle Erkennung

root@kitploit:~
curl -s -o /dev/null -w "%{http_code}" -X POST https://target.com \
  -H "Next-Action: x" \
  -H "Content-Type: multipart/form-data; boundary=----Boundary" \
  --data-binary $'------Boundary\r\nContent-Disposition: form-data; name="0"\r\n\r\n["$1:a:a"]\r\n------Boundary\r\nContent-Disposition: form-data; name="1"\r\n\r\n{}\r\n------Boundary--'

Diese Sonde referenziert eine nicht vorhandene Eigenschaft auf einem leeren Objekt. Verwundbare Server stürzen beim Zugriff auf {}.a.a ab und antworten mit 500. Gepatchte Server haben eine hasOwnProperty‑Absicherung, die den Absturz verhindert.

Identifizierung des Next.js App Router

Achten Sie auf diese Indikatoren:

  • RSC‑Payload in HTML: <script>‑Tags, die Flight‑Protokoll‑Daten enthalten (0:, 1:, usw.)
  • x-nextjs-cache- oder x-nextjs-matched-path‑Header
  • /_next/‑Pfade für statische Assets
  • Server‑Action‑IDs in HTML: $ACTION_ID_‑Muster in versteckten Formularfeldern

Technischer Tiefgang

Der Angriffsablauf

Das folgende Diagramm zeigt, wie eine einzelne HTTP‑Anfrage eine Remote‑Code‑Ausführung erreicht:

root@kitploit:~
sequenceDiagram
    participant A as Attacker
    participant N as Next.js
    participant F as Flight Parser
    participant JS as JS Engine

    A->>N: POST with Next-Action header + malicious payload
    N->>F: Parse multipart form data
    F->>JS: await getRoot - returns chunk as thenable

    rect rgb(80, 20, 20)
        Note over F,JS: VULNERABILITY - No hasOwnProperty check
        JS->>F: chunk.then parses $1:__proto__:then
        F-->>F: Traverses to Chunk.prototype.then
    end

    F->>JS: resolve(attackerObject)
    Note over JS: JS Promise spec: resolve(thenable)<br/>calls thenable.then()
    JS->>F: fakeChunk.then() with attacker's _response

    rect rgb(80, 20, 20)
        Note over F,JS: EXPLOITATION - Attacker controls _response
        F->>F: $B0 → _formData.get(_prefix + "0")
        Note over F: _formData.get = Function constructor<br/>_prefix = malicious code string
        F->>JS: Function(code) invoked as thenable
    end

    Note over JS: RCE - execSync() runs

    rect rgb(20, 60, 20)
        Note over A,JS: OUTPUT EXFILTRATION (redirect method)
        JS-->>F: throw NEXT_REDIRECT with base64(output)
        F-->>N: Error propagates up
        N-->>A: HTTP 303 + x-action-redirect header
    end

Das Flight‑Protokoll

React Server Components verwenden ein eigenes Serialisierungsformat namens „Flight“, um Komponentenbäume vom Server zum Client zu streamen. Es verwendet Präfixcodes für verschiedene Werttypen:

  • $1, $2, … – Referenzen auf andere Chunks per ID
  • $@0 – Roh‑Chunk‑Objekt‑Referenz (liefert den Chunk selbst zurück, nicht seinen Wert)
  • $B0 – Blob‑Referenz (löst _formData.get(_prefix + id) aus)
  • $1:path:to:prop – Durchläuft einen Pfad auf dem Wert eines referenzierten Chunks

Die Schwachstelle nutzt die Kombination aus $@ (Rohreferenz) und durch Doppelpunkte getrennten Pfaden, um auf __proto__ zuzugreifen.

Die vollständige Angriffskette

Phase 1: Anfrageverarbeitung

  1. POST mit Next-Action‑Header löst die RSC‑Aktionsverarbeitung aus
  2. Busboy parst Multipart‑Formularfelder in den Chunk‑Speicher
  3. await getRoot(response) gibt Chunk 0 als Thenable zurück

Phase 2: Prototyp‑Traversierung

  1. Chunk hat eine then‑Methode – die JS‑Promise‑Spezifikation ruft thenable.then(resolve, reject) auf
  2. Unsere Payload wird geparst; $1:__proto__:then löst zu Chunk.prototype.then auf
  3. Gefälschtes Chunk‑Objekt mit then, status: "resolved_model" und _response wird erstellt

Phase 3: Code‑Ausführung

  1. resolve(ourObject) löst einen weiteren then()‑Aufruf aus (JS‑Thenable‑Spezifikation)
  2. Chunk.prototype.then wird mit unserem kontrollierten _response‑Objekt ausgeführt
  3. $B0 löst _formData.get(_prefix + "0") aus – beides vom Angreifer kontrolliert
  4. Konstruierte Funktion wird als Thenable aufgerufen → RCE

Phase 4: Ausgabe‑Exfiltration (optional, Redirect‑Methode)

  1. Payload löst NEXT_REDIRECT‑Fehler mit base64‑kodierter Befehlsausgabe aus
  2. Next.js fängt den Redirect ab, setzt x-action-redirect‑Header vor URL‑Validierung
  3. HTTP 303 wird an den Angreifer zurückgesendet, Ausgabe im Header

Strategien zur Ausgabenerfassung

Die konstruierte Funktion wird als Thenable aufgerufen: fn(resolve, reject). Wie wir dies handhaben, bestimmt, ob wir eine Ausgabe zurückbekommen:

StrategiePayload‑SuffixFunktionsweise
BlindexecSync('CMD');0Führt aus, löst aber nie auf – Verbindung hängt, keine Ausgabe
Throwthrow execSync('CMD').toString()Lehnt Promise ab, Ausgabe im Fehlertext (nur Dev‑Modus)
Redirectthrow {digest:'NEXT_REDIRECT;...;'+b64(output)}Missbraucht Next.js‑Redirect‑Handling, Ausgabe im Header
Reflectarguments[0](https://github.com/freeqaz/react2shell/blob/master/%5BexecSync%28%27CMD%27).toString()])Löst Promise mit Ausgabe als Aktionsargument auf (erfordert gültige Aktions‑ID)

Empfohlen: Redirect. Funktioniert in Produktion, keine Voraussetzungen, Ausgabe im x‑action‑redirect‑Header.

Der Blind‑Ansatz bleibt hängen, weil das Promise nie erfüllt wird – await blockiert dauerhaft. Dies ist nützlich für Feuer‑und‑vergessen‑Szenarien (Reverse Shells, Out‑of‑Band‑Exfiltration via curl).

Alternative Angriffsvektoren

Die Kernschwachstelle wurde über drei verschiedene Angriffsklassen ausgenutzt. Dieses Repository verwendet den ersten Ansatz; andere PoCs demonstrieren die Alternativen:

AngriffsklasseMechanismusAktions‑ID erforderlichBeispiel‑PoC
Prototyp‑Verschmutzung$1:__proto__:then‑Traversierung zu Chunk.prototypeNeinreact2shell, lachlan2k, joe-desimone
$F‑Funktionsreferenz$F1 + action#constructor um Function zu erreichenJashellinteractive
Modul‑Gadgetmodule#export‑Syntax (z.B. child_process#execSync)Variiertejpir‑Forschung

Warum Prototyp‑Verschmutzung keine Aktions‑ID benötigt: Die Multipart‑Formularanalyse speist Chunks sofort in den Flight‑Deserialisierer ein. RCE tritt in getOutlinedModel() während der Chunk‑Referenzauflösung auf – bevor Next.js die Aktions‑ID validiert. URL‑kodierte Anfragen validieren die Aktions‑ID zuerst (anderer Codepfad in action-handler.ts:768).

Warum die $F‑Referenz eine Aktions‑ID benötigt: Die $F‑Referenz löst loadServerReference() aus, das eine Manifest‑Suche durchführt. Wenn die Aktion nicht existiert, schlägt die Anfrage fehl, bevor Code ausgeführt wird.

Eine detaillierte Analyse aller PoC‑Implementierungen und ihrer Vor‑/Nachteile finden Sie in external-pocs/COMPARISON.md.

Produktion vs. Entwicklung

React entfernt Fehlerdetails in Produktions‑Builds. Dies betrifft die Throw‑basierte Exfiltration:

Entwicklung:

root@kitploit:~
{"digest":"...","name":"Error","message":"uid=501(free)...","stack":[...]}

Produktion:

root@kitploit:~
{"digest":"..."}

Die Redirect‑Methode umgeht dies, da die Weiterleitungs‑URL in der digest‑Eigenschaft gespeichert wird, nicht in message. Der Header wird bedingungslos vor der URL‑Validierung gesetzt, sodass selbst ungültige URLs den Header erhalten.

Danksagungen

Die entscheidende Exploit‑Erkenntnis – die Verwendung von $@‑Roh‑Chunk‑Referenzen zur Erstellung eines selbstreferenziellen Fake‑Chunks – wird maple3142 zugeschrieben. Die hier referenzierte Erkennungsmethodik stammt von Searchlight Cyber / Assetnote.

Referenzen

Offizielle Bekanntmachungen:

  • CVE-2025-55182 – RCE in React Server Components
  • CVE-2025-66478 – Auswirkungen auf Next.js
  • React Security Advisory – Offizielle React‑Bekanntgabe

Community‑Forschung:

AutorBeitragAngriffspfadBesondere Merkmale
lachlan2kUrsprünglicher EntdeckerPrototyp‑VerschmutzungArray.map‑Verkettung, 5‑Chunk‑Struktur, Waku‑Unterstützung
ejpirGadget‑ForschungAlle PfadeModul‑Gadget‑Katalog, Persistenzangriffe, Data‑URI‑Pfad
joe-desimonePython‑WerkzeugePrototyp‑VerschmutzungReverse‑Shell‑Helfer, Callback‑Exfil, Timeout‑Erkennung
labubusDest / MrR0b0t19Interaktive Shell$F‑FunktionsreferenzPython‑REPL, Datei‑Upload/‑Download, integrierte Testsuite
Searchlight CyberErkennungsmethoden—Hochpräzise Erkennungsmethodik, WAF‑Signaturen

Einen detaillierten Vergleich aller PoC‑Implementierungen finden Sie in external-pocs/COMPARISON.md.

Hintergrund:

  • React Flight Protocol – RSC‑Serialisierung verstehen

Lizenz

Der Code ist unter der MIT‑Lizenz lizenziert. Die Dokumentation (*.md‑Dateien) ist unter CC‑BY‑SA 4.0 lizenziert.

Tool herunterladen