Cabeçalho penumbroso

CVE-2025-55184 e o ataque de inanição de microtarefas nos componentes do React Server

O aviso de segurança de dezembro de 2025 da equipe do React marca uma mudança de paradigma na segurança de aplicativos Web. À medida que o setor adota rapidamente o Server-Side Rendering (SSR) por meio do React Server Components (RSC), a superfície de ataque migrou do DOM do cliente para o limite de serialização do servidor. CVE-2025-55184 não é um bug trivial de exaustão de recursos; é um sofisticado Complexidade algorítmica Negação de serviço visando a arquitetura fundamental do Event Loop do Node.js. Ao explorar a desserialização recursiva de Promessas dentro do Protocolo de vooum invasor não autenticado pode induzir Inércia na fila de microtarefastornando o processo do servidor inativo e mantendo as portas TCP abertas. Este guia definitivo analisa a vulnerabilidade no nível do fio, explora a mecânica de recursão "Ouroboros" e demonstra como Penligente aproveita a fuzzing diferencial orientada por IA para validar essa falha sem interromper a disponibilidade da produção.

CVE-2025-55184

A arquitetura de um acidente: RSC, voo e o loop de eventos

Para avaliar completamente a gravidade do CVE-2025-55184, precisamos primeiro desconstruir a camada de comunicação proprietária que alimenta o Next.js App Router e o React 19: o Protocolo de voo.

O formato do fio do protocolo de voo

Diferentemente do REST ou do GraphQL, que normalmente retornam JSON estático, o RSC usa um formato híbrido de streaming baseado em linhas, projetado para resolver árvores de componentes de forma incremental.

Um fluxo de resposta de voo típico tem a seguinte aparência:

HTTP

1:I{"id":134,"chunks":["app/page.js"],"name":"default"} 2:{"title":"Welcome","content":"$@1"} 3:{"$":"$@2"}

  • Linha 1: Importa um módulo (componente do cliente).
  • Linha 2: Define um objeto JSON que faz referência ao bloco 1.
  • Linha 3: Define uma referência ao bloco 2.

O recurso fatal: Serialização assíncrona

O React permite que os desenvolvedores passem Promessas do servidor para o cliente. Quando o serializador encontra uma Promessa pendente, ele emite um espaço reservado. O desserializador (na extremidade receptora, que também pode ser um servidor em arquiteturas em camadas) é programado para aguardar a resolução dessas Promessas.

Esse requisito exige um Estratégia de resolução recursiva: Se a Promessa A for resolvida para a Promessa B, o desserializador deverá assinar a Promessa B. É nessa recursão que reside a vulnerabilidade.

Informações internas do Node.js: Inércia na fila de microtarefas

Por que esse exploit é tão devastador em comparação com um exploit padrão? while(true) loop? A resposta está no agendamento de tarefas do mecanismo V8.

  1. Macrotarefas: Timers (setTimeout), retornos de chamada de E/S, setImmediate.
  2. Microtarefas: Chamadas de retorno de promessa (.então, .catch), process.nextTick.

The Starvation Mechanic (O Mecânico da Fome):

O Event Loop do Node.js opera em uma regra de prioridade rígida: A fila de microtarefas deve ser completamente esvaziada para que o Event Loop possa prosseguir para a próxima fase.

Em uma exploração CVE-2025-55184, o invasor envia uma carga útil em que uma promessa é resolvida para si mesmo (ou uma cadeia que leva de volta a si mesmo).

  • O desserializador agenda um .then() para lidar com a resolução.
  • O retorno de chamada é executado, vê a recursão e agenda outro .then().
  • Crucialmente, isso acontece de forma síncrona com relação ao processamento da fila. O comprimento da fila nunca chega a zero.
  • Impacto: Os retornos de chamada de E/S da rede (que tratam de novas solicitações), as sondas de verificação de integridade e os sinais do sistema operacional são permanentemente bloqueados. O processo está ativo (o PID existe), as portas estão abertas (o SYN-ACK funciona no nível do sistema operacional), mas o aplicativo está com morte cerebral.

Engenharia reversa da exploração

A carga útil "Ouroboros

A vulnerabilidade existe em react-server-dom-webpack (e suas variantes para Parcel/Turbopack). A versão não corrigida processValue A função não tinha limitação de profundidade ou detecção de ciclo para tipos de referência.

Um invasor pode usar isso como arma construindo um Gráfico cíclico direcionado (DCG) dentro da carga útil do voo.

Código de exploração conceitual (nível de protocolo)

Embora a codificação binária real seja complexa, a estrutura lógica do vetor de ataque é elegantemente simples:

JavaScript

`// Uma representação JSON da estrutura do voo malicioso // Target: Ponto final do roteador de aplicativos Next.js (POST /)

{ "id": "root", "chunks": [], "value": { // Definimos um objeto Promise manualmente usando a sintaxe Flight "$": "$Promise", "status": "fulfilled", "value": { // O valor dessa promessa resolvida é... a própria. "$": "$@root" } } }`

Quando o servidor analisa isso:

  1. Ele vê uma promessa cumprida.
  2. Ele desembrulha o valor.
  3. Ele vê uma referência ao objeto raiz (que é o Promise).
  4. Ele agenda uma microtarefa para desembrulhar o objeto raiz novamente.
  5. GOTO 1.

Esse loop ocorre inteiramente na memória, ignorando os WAFs tradicionais que procuram assinaturas de injeção de SQL ou corpos de solicitação grandes. A carga útil geralmente é menor que 1 KB.

A saga da "correção incompleta" (CVE-2025-67779)

É importante observar que a correção inicial para essa vulnerabilidade foi contornada em poucos dias. A primeira correção tentou rastrear a profundidade da recursão, mas não conseguiu levar em conta determinadas variações de estruturas aninhadas (por exemplo, envolver o ciclo dentro de um Mapa ou Conjunto). Isso levou a CVE-2025-67779. Portanto, simplesmente "atualizar" não é suficiente; é preciso garantir que eles estejam no definitivo versões corrigidas (React 19.0.3+ / Next.js 15.0.6+).

O parceiro silencioso: CVE-2025-55183 (exposição do código-fonte)

Enquanto o 55184 destrói a disponibilidade, CVE-2025-55183 destrói a confidencialidade. Essa vulnerabilidade complementar foi divulgada simultaneamente.

O mecanismo de vazamento:

As Server Actions são funções internas. No entanto, se um invasor solicitar uma Server Action por ID como um valor (em vez de invocá-la), o serializador vulnerável a tratará como um objeto de dados. Ao fazer isso, ele serializa o corpo da função compilada como uma string.

Impacto:

  • Extração de lógica: Os invasores podem ler sua lógica de validação de back-end (Se (!user.isAdmin) ...).
  • Raspagem secreta: Chaves de API codificadas ou pontos de extremidade internos são revelados.
  • Descoberta de APIs obscuras: Ações de servidor não utilizadas ou ocultas tornam-se alvos de ataque visíveis.

Verificação avançada: A abordagem Penligent

Em um ambiente de alto risco, "tentar derrubar o servidor" para provar uma vulnerabilidade não é profissional e é perigoso. Penligente utiliza tecnologia orientada por IA Exploração segura para verificar esses CVEs com tempo de inatividade zero.

Estratégia 1: sondagem de recursão limitada (DoS seguro)

Em vez de um loop infinito, o Penligent AI Agent constrói uma carga útil com um Profundidade de recursão finita ($N=5000$).

  • A sonda: Uma cadeia Promise recursiva que termina após 5000 iterações.
  • Análise heurística:
    • Vulnerável: O servidor processa a cadeia. A Penligent detecta um Desvio de latência (por exemplo, tempo de resposta = linha de base + 200 ms) e um pico transitório no uso do heap.
    • Patched: O novo mecanismo de segurança no React 19 gera um erro de "Referência cíclica" imediatamente. A resposta é quase instantânea (500 Internal Server Error).
  • Conclusão: Se a latência estiver correlacionada com a profundidade ($T \propto N$), a vulnerabilidade será confirmada sem suspender o processo.

Estratégia 2: Fuzzing diferencial para vazamentos de origem (CVE-2025-55183)

Para detectar a vulnerabilidade de exposição do código-fonte:

  1. Impressão digital: A Penligent identifica IDs de ações do servidor disponíveis em pacotes legítimos do lado do cliente.
  2. Injeção reflexiva: O agente envia solicitações de voo modificadas tentando "ecoar" essas IDs como propriedades de dados.
  3. IA de correspondência de padrões: O fluxo de resposta é analisado. Se a IA detectar assinaturas de funções JavaScript (por exemplo,, função assíncrona $..., var _0x...) na resposta JSON, ele sinaliza um Vazamento de informações críticas.
CVE-2025-55184 e o ataque de inanição de microtarefas nos componentes do React Server

Plano de ação e remediação do engenheiro

A janela para exploração está totalmente aberta. Os bots automatizados já estão procurando instâncias expostas do Next.js 15.0.x.

1. A matriz de atualização (aplicação rigorosa)

Você deve garantir que sua árvore de dependências seja resolvida para as versões seguras. Não confie nos carretéis do semver (^) sozinho; verifique seu pnpm-lock.yaml ou package-lock.json.

PacoteFaixa de vulnerabilidadeVersão segura (mínima)
react-server-dom-webpack< 19.0.319.0.3
Próximo.js15.0.0 – 15.0.515.0.6+ (ou 14.2.34+ para a versão 14)

2. Substituições de resolução de dependência

Porque react-server-dom-webpack é frequentemente uma dependência aninhada, você deve forçar a resolução em package.json para evitar que versões mais antigas entrem sorrateiramente:

JSON

// package.json { "pnpm": { "overrides": { "react-server-dom-webpack": "19.0.3", "react-server-dom-turbopack": "19.0.3" } } }

3. Validação contínua

A segurança não é uma correção única. Use Penligente para monitorar continuamente sua implantação. À medida que surgem novos desvios (como o visto no CVE-2025-67779), os modelos de IA da Penligent são atualizados para testar essas variações, garantindo que seu perímetro permaneça impenetrável contra ataques lógicos em evolução.

Referências e links de autoridade:

Compartilhe a postagem:
Publicações relacionadas