A vulnerabilidade 'React2Shell' (CVSS 10.0) expõe sites que usam React Server Components a execução remota de código. Entenda como ela funciona e as defesas essenciais para proteger seu ambiente online.
O que é o Protocolo Flight do React e Por Que Ele Importa Para a Segurança?
Se sua empresa utiliza React Server Components (RSC) para construir a interface do site, é fundamental entender o protocolo Flight. Ao contrário do que muitos desenvolvedores pensam, os RSCs não enviam HTML ou JSON puro para o navegador. Eles utilizam um protocolo de streaming personalizado chamado Flight, que é um formato delimitado por linha com seu próprio sistema de tipos e regras para reconstruir o comportamento executável no cliente.
A maioria dos desenvolvedores React nunca analisou um payload Flight na aba de Rede do navegador, pois o framework o gerencia automaticamente. No entanto, essa confiança implícita no protocolo é exatamente onde residem os riscos de segurança, como demonstrado pela vulnerabilidade React2Shell.
Ameaça Real: A Vulnerabilidade 'React2Shell' (CVE-2025-55182)
Em dezembro de 2025, a comunidade de segurança digital foi alertada sobre a CVE-2025-55182, apelidada de 'React2Shell'. Classificada com um CVSS de 10.0 — a pontuação máxima para vulnerabilidades — ela permitia a execução remota de código (RCE) não autenticada. Isso significa que, com uma requisição HTTP especialmente elaborada para um endpoint de Server Function, um invasor poderia obter acesso ao shell do sistema, sem a necessidade de credenciais.
A gravidade da situação foi tanta que a CISA (Agência de Cibersegurança e Infraestrutura dos EUA) adicionou a 'React2Shell' ao seu catálogo de Vulnerabilidades Conhecidas e Exploradas. Relatos da Sysdig indicaram que atores estatais norte-coreanos estavam explorando essa falha para implantar malwares sem arquivo através da blockchain Ethereum. Este é o tipo de vulnerabilidade que exige atenção imediata de qualquer empresa com sites baseados em React Server Components.
Por Que o Protocolo Flight é um 'Sink' de Desserialização?
A análise aprofundada do protocolo Flight revelou que 'React2Shell' não era um erro de parsing isolado, mas um sintoma de um problema estrutural. O Flight reconstrói referências executáveis, componentes de carregamento tardio (lazy-loaded), endpoints RPC do servidor e estados assíncronos a partir de um fluxo de texto. Isso o caracteriza como um sistema de desserialização.
- Desserialização: É o processo de converter uma sequência de dados (bytes) de volta para um objeto em memória.
- Sink de desserialização: É um ponto no código onde dados desserializados podem ser manipulados para executar ações não intencionais, como código arbitrário.
Historicamente, sistemas de desserialização em outras linguagens, como Java (ObjectInputStream), Python (pickle) e PHP (unserialize), têm sido vetores para ataques de RCE. O padrão é sempre o mesmo: desserializar uma entrada controlada pelo atacante, invocar um comportamento durante a reconstrução e perder o controle da execução.
Embora o JSON.parse() do JavaScript seja seguro por si só (produzindo apenas objetos de dados planos), o Flight envolve essa lógica com mecanismos de desserialização personalizados, introduzindo riscos significativos. Para entender melhor como a IA pode ajudar a identificar e otimizar códigos complexos, confira nosso artigo sobre Desvendando Código Legado com IA: Otimização de Sites WordPress e Redução de Riscos Empresariais.
Como o Flight Funciona: Uma Visão Prática
Para entender a superfície de ataque, é crucial saber como o Flight opera. Ao abrir a aba de Rede em uma página Next.js App Router, você verá requisições com Content-Type: text/x-component. Esse é o Flight. Ele não é um único blob JSON, mas um formato de streaming delimitado por linha, onde cada linha é uma "linha" autocontida que o runtime do React no cliente processa à medida que chega.
Um payload Flight simples pode incluir diretivas de importação (1:I[...]), que instruem o cliente a carregar componentes, árvores JSON (2:J[...]) para construir elementos HTML e referências ($1) para outros blocos. O 0:D[...] define o contexto de execução do servidor.
- Formato da Linha: Cada linha segue
<ROW_ID>:<ROW_TAG><PAYLOAD>\n. O ID é um identificador numérico, a tag é um caractere que indica o tipo de dado, e o payload é o conteúdo. - Tags Comuns:
J(JSON Tree),M(Módulo),I(Import),H/L(Hint/Preload),D(Data),E(Error).
A verdadeira complexidade e superfície de ataque surgem com o sistema de prefixos $.
O Sistema de Prefixos '$': Onde o Perigo Reside
Quando o parser no lado do cliente encontra uma string começando com $, ele não a trata como texto literal. Ele a intercepta e a roteia por um caminho de resolução específico para o tipo. A função parseModelString em ReactFlightClient.js é onde essa lógica acontece, agindo como uma grande instrução switch no caractere após o $.
$(Referência de Modelo): Resolve para outro bloco no stream (ex:$2aponta para a linha 2).$:(Acesso a Propriedade): Permite atravessar as propriedades de um bloco resolvido (ex:$1:user:name). Isso é um ponto crítico, pois pode ser explorado para Prototype Pollution, um ataque que modifica protótipos base de objetos em JavaScript.$F(Referência de Servidor): Representa uma Server Action invocável (um endpoint RPC no servidor).$L(Componente Lazy): Adia o carregamento do componente até que seja necessário.$@(Promise/Raw Chunk): Retorna o objeto wrapper internoChunk, que o React usa para rastrear o estado de resolução. Expor essa estrutura interna através do protocolo é visto como um erro de design, pois pode ser manipulado para obter um controle mutável.
Essencialmente, o Flight não desserializa apenas dados, mas também comportamento. Ele instrui o runtime do cliente sobre qual código carregar, quais funções chamar e em que confiar. Se um invasor puder influenciar o conteúdo do stream, ele controla o fluxo de execução do parser, levando a possíveis execuções de código remoto.
Defesas Essenciais Contra Riscos de Desserialização no React
Para proteger seu site e evitar que sua empresa seja vítima de vulnerabilidades como a 'React2Shell', é crucial implementar um conjunto de defesas práticas. A Smashing Magazine, em colaboração com Durgesh Pawar, lista as seguintes medidas, ranqueadas por impacto:
- Validação de Esquema em Todas as Server Actions: Implemente validação rigorosa de esquema para todas as entradas de Server Actions. Isso garante que apenas dados esperados e formatados corretamente sejam processados, impedindo a manipulação do protocolo.
- Pacote
server-only: Utilize o pacoteserver-onlypara garantir que o código sensível só seja executado no servidor, evitando que informações ou lógicas críticas vazem para o cliente. - Endurecimento de CSRF (Cross-Site Request Forgery): Vá além das configurações padrão do framework para proteger contra CSRF. Ataques de desserialização muitas vezes podem ser combinados com CSRF para maior impacto.
- Avaliação da Taint API e WAFs (Web Application Firewalls): Considere o uso da Taint API para rastrear a origem de dados e WAFs para filtrar requisições maliciosas antes que cheguem ao seu aplicativo. Embora não sejam soluções completas, eles adicionam camadas importantes de segurança.
A segurança do seu site é um processo contínuo que exige vigilância e atualização constante das melhores práticas. Garantir que sua equipe de desenvolvimento esteja ciente desses riscos e implemente as defesas adequadas é fundamental para a integridade do seu negócio online. Para mais informações sobre como otimizar seu site empresarial, explore nosso artigo sobre Princípios de Design: Guia Prático para Otimizar Seu Site Empresarial.
Perguntas frequentes
O que é a vulnerabilidade React2Shell?
React2Shell (CVE-2025-55182) é uma vulnerabilidade crítica (CVSS 10.0) que permite a execução remota de código não autenticada em sites que utilizam React Server Components, explorando falhas no protocolo Flight.
Como o protocolo Flight do React se relaciona com a segurança?
O Flight é um protocolo de desserialização personalizado do React que reconstrói componentes e comportamentos executáveis a partir de um stream de texto. Se manipulado, pode levar à execução de código arbitrário, pois o parser é instruído pelo conteúdo do stream.
Quais são as principais defesas contra ataques de desserialização no React?
As defesas incluem validação rigorosa de esquema em Server Actions, uso do pacote server-only, endurecimento contra CSRF e a avaliação de ferramentas como Taint API e Web Application Firewalls (WAFs).
Meu site está em risco se usa React?
Se seu site utiliza React Server Components, ele pode estar exposto a riscos de desserialização como o React2Shell. É crucial verificar se as atualizações de segurança foram aplicadas e se as defesas recomendadas estão implementadas.
Fonte: Smashing Magazine