Investigación de tesis de maestría sobre CVE-2025-55182 (React2Shell). Marco de explotación modular con 6 escenarios de ataque (RCE, exfiltración, desfiguración), shell inversa interactiva y un laboratorio vulnerable completo para estudiar la contaminación de prototipos y la deserialización insegura en React Server Components.
Deserialización de datos no confiables + contaminación de prototipos en React Server Components
Ejecución remota de código sin autenticación a través de Next.js Server Actions
Versiones afectadas: React 19.0.0 - 19.2.0 · Parche: React 19.0.1 / 19.1.2 / 19.2.1 (3 de diciembre de 2025)
Demostración del exploit avanzado: comandos básicos de RCE, shell interactiva y múltiples vectores de ataque contra una aplicación Next.js vulnerable
Este repositorio contiene mi investigación de Tesis de Máster sobre CVE-2025-55182, una vulnerabilidad de Ejecución Remota de Código de severidad Crítica (CVSS v3.1: 10.0) en React Server Components.
La vulnerabilidad se origina en un mecanismo de deserialización inseguro dentro del protocolo React Flight. Al procesar Server Actions, Next.js deserializa los payloads multipart entrantes sin una validación adecuada. Un atacante puede crear un payload malicioso que contamina la cadena de prototipos e inyecta JavaScript arbitrario, que se ejecuta en el servidor a través del constructor Function (y posteriormente mediante child_process.execSync()).
Nota sobre CVE-2025-66478: Vercel emitió un CVE paralelo para rastrear el impacto específico de esta misma vulnerabilidad en Next.js. Debido a que Next.js incluye React como dependencia interna (vendored), muchos escáneres de dependencias no lo detectan automáticamente como vulnerable. La Base de Datos Nacional de Vulnerabilidades de EE. UU. (NVD) rechazó oficialmente CVE-2025-66478 por ser un duplicado de CVE-2025-55182, aunque continúa apareciendo en el aviso de seguridad de Vercel.
Vulnerabilidades posteriores: El equipo de React reveló posteriormente dos problemas adicionales presentes en las versiones iniciales del parche (19.0.1, 19.1.2, 19.2.1): CVE-2025-55184 (Denegación de Servicio, CVSS 7.5) y CVE-2025-55183 (Exposición de Código Fuente, CVSS 5.3). Los usuarios deben actualizar a 19.0.2, 19.1.3 o 19.2.2 para solucionar los tres.
| Aspecto | Descripción |
|---|---|
| Cuatro módulos de ataque | Eliminar proyectos, desfigurar el sitio web, robar variables de entorno, apagar servidores |
| Shell interactiva | Shell persistente con comandos especiales y capacidad de restauración |
| Exfiltración estable | Lectura línea por línea para evadir las limitaciones de tamaño de las cabeceras HTTP |
| Script de restauración | Restauración segura del laboratorio tras los ataques |
| Documentación académica | Causa raíz, desglose del payload y cronología de la vulnerabilidad |
CVE-2025-55182/
├── README.md # This file
├── LICENSE # MIT License
│
├── exploit/
│ ├── exploit-explanation.md # Exploit usage documentation
│ └── react2shell.py # Main exploit — 4 attack modules + interactive shell
│
├── vulnerable-app/ # Vulnerable Next.js application
│ ├── README.md # Original vulnapp credits
│ ├── package.json # React 19.0.0 (vulnerable)
│ ├── app/ # Application source code
│ ├── curl_id.sh # Original exploit script (by zack0x01)
│ └── scripts/
│ └── restore.sh # Restoration script (my contribution)
│
└── docs/
├── screenshots/ # Exploitation demonstrations
│ ├── 01-app-initial.png
│ ├── 02-rce-basic.png
│ ├── 03-interactive-shell.png
│ ├── 04-no-payload.png
│ ├── 05-delete-result.png
│ ├── 06-deface.png
│ ├── 07-shutdown-servers.png
│ ├── 08-restore-from-script.png
│ └── 09-restore-from-interactive-shell.png
│
└── analysis/
├── 01-root-cause.md # Vulnerability root cause analysis
├── 02-payload-breakdown.md # Payload structure and execution flow
└── 03-timeline.md # CVE timeline
vulnerable-app/)cd vulnerable-app
npm install --legacy-peer-deps
npm run dev
# App available at http://localhost:3000
cd ../exploit
# Check if target is vulnerable
python3 react2shell.py -u http://localhost:3000 --check
# Execute single command
python3 react2shell.py -u http://localhost:3000 -c "whoami"
# Interactive shell mode
python3 react2shell.py -u http://localhost:3000 -i
| Módulo | Comando | Descripción | Impacto |
|---|---|---|---|
| Eliminar Proyectos | --delete-projects | Elimina todos los proyectos del panel | Destrucción de datos |
| Desfigurar (Deface) | --deface "message" | Reemplaza la página principal | Desfiguración |
| Robar Entorno | --steal-env | Roba las variables de entorno | Exfiltración |
| Apagar Servidores | --shutdown-servers | Apaga todos los servidores | Denegación de Servicio |
React Server Components utiliza un mecanismo personalizado de serialización/deserialización (el protocolo «Flight») para enviar datos de componentes del servidor al cliente. Al procesar server actions, el servidor deserializa los payloads entrantes sin una validación adecuada.
El fallo principal es la confianza en el comportamiento: el deserializador comprueba typeof obj.then === 'function' para identificar Promises, sin verificar que la propiedad pertenezca directamente al objeto. Esto permite a un atacante envenenar Object.prototype.then, haciendo que cualquier objeto plano parezca un thenable.
Un atacante puede crear un payload malicioso que:
__proto__:thenFunction mediante $1:constructor:constructornew Function(_prefix)process.mainModule.require('child_process').execSync()X-Action-RedirectUser-mode (unauthenticated)
│
├─ POST / (Next.js Server Action endpoint)
│ ├─ Headers: Next-Action: x
│ └─ Multipart body with malicious JSON
│
└─ React Flight deserializer processes payload
└─ Prototype pollution via __proto__:then
└─ Function constructor reached via $1:constructor:constructor
└─ new Function(_prefix) executes attacker's JavaScript
└─ execSync() runs system command
└─ Output embedded in NEXT_REDIRECT error
└─ Next.js converts to X-Action-Redirect header