
Mi investigación sobre CVE-2025-55182
Este repositorio contiene mi investigación sobre CVE-2025-55182, también conocida como la vulnerabilidad React2Shell. El repositorio consta de dos partes principales: stand y exploit.
Alguna información sobre esta falla de seguridad:
La vulnerabilidad es básicamente una falta de validación de entrada del usuario. Pero no es tan simple =)
La parte del Cliente React y la parte del Servidor React utilizan el Protocolo React Flight para intercambiar datos. Aquí hay una buena charla al respecto, para que te familiarices rápidamente.
Ejemplo de fragmentos de mensajes del Protocolo React Flight:
{
"0": (None, '["$1"]'),
"1": (None, '{"object":"fruit","name":"$2:fruitName"}'),
"2": (None, '{"fruitName":"cherry"}'),
}
Los fragmentos de RFP pueden referirse entre sí usando el operador $. Cuando los fragmentos se deserializan posteriormente en el servidor, estos enlaces se resuelven. Una cosa clave aquí es que podemos acceder al prototipo del objeto desde él.
Al manipular el prototipo, podemos forzar a V8 a esperar nuestro .then(). El payload resultante puede verse así:
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": '{"then": "$B0"}',
"_response": {
"_prefix": f"return foo; ",
"_formData": {
"get": "$1:constructor:constructor",
},
},
}
No profundizaré en los detalles de cómo funciona realmente esta cadena de gadgets; si quieres saber más al respecto, lee un gran análisis aquí por Moritz Sanft.
También puedes ver la comparación de versiones en GitHub, antes y después del parche, si quieres profundizar en esta falla.
He creado una aplicación simple de react/next.js que usa (ver el archivo stand/package.json):
"dependencies": {
"next": "16.0.6",
"react": "19.2.0",
"react-dom": "19.2.0"
},
Simplemente una página simple con contenido de texto, creada con create-next-app:
Para iniciar, ejecuta esto en el directorio stand:
docker compose up --build -d
Luego navega a http://localhost:3000 en tu navegador.
La explotación es sencilla. Solo necesitamos enviar fragmentos RFP especialmente construidos con nuestro payload al servidor mediante una solicitud POST. Consulta exploit/src/main.py. También incluye una verificación simple para saber si el servidor es vulnerable o no; intenta ejecutar un comando whoami; si se excede el tiempo de espera, lo más probable es que el servidor use una versión parcheada.
Puedes ver el payload RFP en exploit/resource/chunk.json.
Antes de ejecutar el exploit, no olvides configurar un listener de netcat y actualizar exploit/resource/config.toml con tu host y puerto, para obtener una reverse shell.
¡Feliz pwning!
Gran respeto para Lachlan Davidson, quien descubrió la vulnerabilidad, maple, quien encontró un buen gadget, y también para Moritz Sanft, quien compartió su PoC y escribió un gran análisis.
producido por I3r1h0n.