
Minha pesquisa sobre CVE-2025-55182
Este repositório é minha pesquisa sobre CVE-2025-55182, também conhecida como vulnerabilidade React2Shell. O repositório consiste em duas partes principais: stand e exploit.
Algumas informações sobre esta falha de segurança:
A vulnerabilidade é basicamente a falta de validação de entrada do usuário. Mas não é tão simples assim =)
A parte React Client e a parte React Server usam o React Flight Protocol para trocar dados. Aqui está uma boa palestra sobre ele, para você se familiarizar rapidamente.
Exemplo de chunks de mensagem do React Flight Protocol:
{
"0": (None, '["$1"]'),
"1": (None, '{"object":"fruit","name":"$2:fruitName"}'),
"2": (None, '{"fruitName":"cherry"}'),
}
Chunks do RFP podem referir-se uns aos outros usando o operador $. Quando os chunks são desserializados no servidor, esses links são resolvidos. Um ponto chave aqui é que podemos acessar o protótipo do objeto a partir dele.
Ao manipular o protótipo, podemos forçar o V8 a aguardar nosso .then(). O payload resultante pode se parecer com isto:
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": '{"then": "$B0"}',
"_response": {
"_prefix": f"return foo; ",
"_formData": {
"get": "$1:constructor:constructor",
},
},
}
Não vou me aprofundar em detalhes de como essa cadeia de gadgets realmente funciona; se quiser saber mais, leia uma ótima análise aqui por Moritz Sanft.
Você também pode ver a comparação de versão no GitHub, antes e depois do patch, se quiser se aprofundar nessa falha.
Criei um aplicativo simples react/next.js, que usa (veja o stand/package.json):
"dependencies": {
"next": "16.0.6",
"react": "19.2.0",
"react-dom": "19.2.0"
},
Apenas uma página simples com conteúdo de texto, criada com create-next-app:
Para iniciar, execute isto no diretório stand:
docker compose up --build -d
Em seguida, navegue para http://localhost:3000 no seu navegador.
A exploração é direta. Basta enviar chunks RFP especialmente construídos com nosso payload para o servidor via requisição POST. Veja o exploit/src/main.py. Ele também inclui uma verificação simples se o servidor é vulnerável ou não; ele tenta executar um comando whoami; se o tempo limite for excedido, o servidor provavelmente usa uma versão corrigida.
Você pode ver o payload RFP em exploit/resource/chunk.json.
Antes de executar o exploit, não se esqueça de configurar um listener netcat e atualizar o exploit/resource/config.toml com seu host e porta, para obter um reverse shell.
Feliz pwning!
Grande respeito a Lachlan Davidson, que descobriu a vulnerabilidade, maple, que encontrou um bom gadget, e também Moritz Sanft, que compartilhou seu PoC e escreveu uma ótima análise.
produzido por I3r1h0n.