
Análise e advisory do CVE-2025-55182 (React2Shell), RCE por desserialização do RSC Flight, com detalhamento da causa raiz, fluxo de ataque, diff do patch e regras de detecção Sigma/Suricata/WAF.
Data da última verificação: 2026-11-04 (KST). Cada valor numérico foi registrado apenas conforme confirmado nas fontes listadas em References abaixo; quando os valores divergem entre as fontes, ambos foram indicados.
Function e executar JavaScript arbitrário.react-server-dom-webpack / -parcel / -turbopack 19.0.0, 19.1.0, 19.1.1, 19.2.0 e frameworks que os utilizam — notadamente Next.js 15.x / 16.x App Router. Mesmo sem definir Server Functions diretamente, basta suportar RSC para ser afetado.| Item | Conteúdo |
|---|---|
| CVE ID | CVE-2025-55182 (React) / CVE-2025-66478 para Next.js foi rejeitado como duplicado (Rejected) |
| Alias | React2Shell |
| Data de divulgação | 2025-12-03 (aviso da equipe React, patch distribuído no mesmo dia) |
| Descobridor | Lachlan Davidson (reportado em 2025-11-29 via Meta Bug Bounty) |
| Produtos/versões afetados | react-server-dom-webpack, react-server-dom-parcel, react-server-dom-turbopack 19.0.0, 19.1.0, 19.1.1, 19.2.0 / Next.js 14.3.0-canary.77 ou superior canary, 15.x, 16.x (App Router) |
| Versões corrigidas | Correção de RCE: 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 Versão final recomendada (incluindo vulnerabilidades subsequentes): React 19.0.3 / 19.1.4 / 19.2.3 (ver "Vulnerabilidades subsequentes" abaixo) |
| CVSS v3.1 | 10.0 Critical — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
| CVSS v4.0 | Não confirmado em fontes primárias no momento da redação deste documento |
| CWE | CWE-502 Deserialization of Untrusted Data (Vercel GHSA-9qr9-h5gf-34mp, GitLab Advisory DB). O registro no CISA KEV não indica CWE |
| Exploração real | Exploração confirmada. Incluído no CISA KEV em 2025-12-05, prazo de ação para agências federais em 2025-12-12, uso em campanhas de ransomware: Known. A AWS observou tentativas de exploração poucas horas após a divulgação pública |
| Componente | Versões afetadas | Versões corrigidas |
|---|---|---|
react-server-dom-webpack / -parcel / -turbopack | 19.0.0 | 19.0.1 (recomendado 19.0.3) |
| 〃 | 19.1.0, 19.1.1 | 19.1.2 (recomendado 19.1.4) |
| 〃 | 19.2.0 | 19.2.1 (recomendado 19.2.3) |
| Next.js 15.x (App Router) | 15.0 ~ 15.5 antes do patch | 15.0.5 / 15.1.9 / 15.2.6 / 15.3.6 / 15.4.8 / 15.5.7 |
| Next.js 16.x (App Router) | anterior a 16.0.7 | 16.0.7 |
| Next.js canary | 14.3.0-canary.77 ou superior | 15.6.0-canary.58 / 16.1.0-canary.12 (usuários do 14.3 canary devem fazer downgrade para o 14.x stable) |
| Outras ferramentas de integração RSC | React Router (unstable RSC API), Waku, plugin RSC do Parcel, plugin RSC do Vite (@vitejs/plugin-rsc), RedwoodSDK, Expo etc. | Versão mais recente de cada ferramenta + react-server-dom-* corrigido |
Não afetado: aplicações React puramente client-side que não usam servidor, Next.js 13.x / 14.x stable, aplicações com Pages Router, implantações em Edge Runtime.
Após o patch do React2Shell, pesquisas adicionais sobre RSC divulgaram em sequência vulnerabilidades que não são RCE. O RCE em si foi corrigido em 19.0.1 / 19.1.2 / 19.2.1, mas para bloquear também as vulnerabilidades abaixo é necessária a versão mais recente.
| CVE | Tipo | CVSS v3.1 | Divulgação | Versão corrigida |
|---|---|---|---|---|
| CVE-2025-55184 | Negação de serviço (DoS) | 7.5 | 2025-12-11 | 19.0.2 / 19.1.3 / 19.2.2 (incompleta) |
| CVE-2025-55183 | Exposição de código-fonte | 5.3 | 2025-12-11 | 19.0.2 / 19.1.3 / 19.2.2 |
| CVE-2025-67779 | DoS causado pelo patch incompleto do CVE-2025-55184 | 7.5 | 2025-12-12 | 19.0.3 / 19.1.4 / 19.2.3 |
Alguns artigos de empresas de segurança (por exemplo, a atualização da Zscaler) afirmam que "o patch original do CVE-2025-55182 era incompleto". No entanto, segundo os avisos do React e do GitLab, o que estava incompleto era a correção do DoS (CVE-2025-55184), e não foi possível confirmar uma fonte primária de que a correção do RCE tenha sido contornada. Em qualquer caso, a ação recomendada é atualizar para 19.0.3 / 19.1.4 / 19.2.3 ou superior.
| Data | Evento |
|---|---|
| 2025-11-29 | Reportado por Lachlan Davidson via Meta Bug Bounty |
| 2025-11-30 | Confirmado pela equipe de segurança da Meta; início da correção junto à equipe do React |
| 2025-12-03 | Publicação do aviso e patch do React (19.0.1 / 19.1.2 / 19.2.1) e do aviso do Next.js (CVE-2025-66478). Empresas de nuvem e WAF, que receberam informações prévias, implantaram regras de proteção |
| 2025-12-03 ~ 04 | A AWS observou tentativas de exploração por grupos ligados à China (Earth Lamia, Jackpot Panda) poucas horas após a divulgação. A Zscaler observou mais de 4.100 tentativas de exploração nas primeiras 2 horas |
| 2025-12-05 | Inclusão no CISA KEV (prazo 12-12). A Microsoft passou a detectar atividade de exploração real a partir desta data |
| 2025-12-11 | Divulgação das vulnerabilidades subsequentes CVE-2025-55184 / 55183 |
| 2025-12-12 | Divulgação do CVE-2025-67779 (patch incompleto) e distribuição de 19.0.3 / 19.1.4 / 19.2.3 |
| 2025-12-15 | A Microsoft publicou análise de atividades pós-exploração e guia de hunting |
O RSC troca dados entre cliente e servidor por meio de um protocolo de serialização próprio chamado Flight. Quando o cliente chama uma Server Function, o navegador envia os argumentos em uma requisição POST multipart/form-data, e cada campo do formulário se torna um chunk numerado.
$<id> é uma referência ao valor de outro chunk, $@<id> é uma referência ao próprio objeto do chunk, e $B<id> indica tratamento de Blob.then(). O await do JavaScript, ao encontrar um thenable, chama then() e, se o resultado for outro thenable, continua chamando recursivamente.getOutlinedModel()O getOutlinedModel() do manipulador de respostas Flight no lado do servidor (packages/react-server/src/ReactFlightReplyServer.js) divide referências no formato $<id>:<prop1>:<prop2> com base em : e percorre as propriedades do chunk de destino na ordem chunk[prop1][prop2].
Nesse processo, não havia validação para verificar se o nome da propriedade era uma propriedade própria (own property) do objeto. Assim, era possível acessar propriedades herdadas por meio de nomes como __proto__, constructor e prototype.