
"Una solicitud HTTP especialmente manipulada puede comprometer todo tu servidor." — React Security Team, dic. 2025
Gravedad: CRÍTICA | CVSS v3.1: 10.0 (Máxima) | Estado: Explotado activamente
React2Shell es una vulnerabilidad de seguridad crítica en React Server Components (RSC) — una funcionalidad moderna que permite a React ejecutar partes de tu aplicación web en el servidor en lugar del navegador.
La falla permite que cualquier atacante en internet — sin inicio de sesión, sin acceso especial y sin conocimiento previo de tu sistema — envíe una única solicitud HTTP maliciosa a tu servidor y ejecute cualquier código que desee en él. Eso significa que puede robar datos, instalar malware, bloquear tus archivos con ransomware o tomar el control total de tu servidor.
Piénsalo así: tu servidor tiene una puerta que se suponía que solo se abría para visitantes de confianza, pero resulta que cualquiera puede entrar — solo con llamar de una manera específica.
| Propiedad | Valor |
|---|---|
| ID CVE | CVE-2025-55182 (también llamado React2Shell) |
| Gravedad | Crítica — Ejecución remota de código (RCE) |
| Puntuación CVSS v3.1 | 10.0 / 10.0 (la máxima posible) |
| Puntuación CVSS v4 | 9.3 / 10.0 |
| Tipo de debilidad | CWE-502 — Deserialización de datos no confiables |
| Método de ataque | Una única solicitud HTTP POST, sin autenticación necesaria |
| Descubierto por | Lachlan Davidson (investigador de seguridad) |
| Divulgado | 3 de diciembre de 2025 |
| Estado del exploit | Exploit público disponible — utilizado activamente por atacantes |
| CVE relacionado | CVE-2025-66478 (Next.js — duplicado confirmado) |
react-server-dom-webpack — versions 19.0.0, 19.1.0, 19.1.1, 19.2.0 react-server-dom-parcel — versions 19.0.0, 19.1.0, 19.1.1, 19.2.0 react-server-dom-turbopack — versions 19.0.0, 19.1.0, 19.1.1, 19.2.0
### Frameworks Afectados
| Framework / Herramienta | Alcance Afectado |
|---------------------------|-----------------------------------------------------|
| **Next.js 15.x – 16.x** | Solo App Router — Pages Router **NO** está afectado |
| **React Router RSC** | Solo canal inestable / vista previa |
| **Redwood SDK** | Solo modo RSC |
| **Waku** | Todas las versiones con RSC habilitado |
| **Expo** | Solo builds de vista previa RSC |
| **Vite RSC Plugin** | Todas las integraciones |
| **Parcel RSC Plugin** | Todas las integraciones |
| **Cualquier setup RSC personalizado** | Cualquier servidor que use deserialización de RSC Flight |
> ⚠️ **Importante:** Eres vulnerable incluso si no usas Server Actions o Server Functions explícitamente, siempre que React Server Components estén habilitados en tu aplicación.
> ✅ **No afectados:** Aplicaciones que usan solo el Pages Router, o aplicaciones sin React del lado del servidor en absoluto.
---
## ¿Por Qué Es Tan Peligroso?
Tres razones hacen que React2Shell sea excepcionalmente grave:
1. **No requiere autenticación.** Cualquier persona en internet puede intentar este ataque. No se necesita cuenta, token ni acceso previo.
2. **Funciona en instalaciones predeterminadas.** Una aplicación Next.js recién creada con `create-next-app` — sin configuración personalizada — es explotable de inmediato. Los desarrolladores no tienen que hacer nada mal para ser vulnerables.
3. **Fiabilidad cercana al 100%.** Los investigadores de seguridad confirmaron que el exploit funciona casi siempre contra servidores sin parchear.
---
## ¿Cómo Funciona el Ataque?
### La Causa Raíz — En Lenguaje Sencillo
Cuando tu servidor React recibe datos de un cliente, procesa (deserializa) esos datos para entender qué hacer a continuación. El problema es que React **nunca comprueba si esos datos son seguros o legítimos** — confía ciegamente en lo que llegue.
Un atacante explota esto enviando datos especialmente diseñados que secuestran el comportamiento interno de JavaScript en el servidor, lo que finalmente le permite inyectar y ejecutar su propio código.
### Explicación Técnica
El exploit utiliza una técnica llamada **contaminación de prototipos**:
1. El atacante envía una solicitud HTTP POST manipulada a cualquier endpoint RSC (no se necesita una URL especial).
2. El parser del protocolo React Flight procesa la carga útil sin ninguna validación estructural.
3. La carga útil maliciosa contamina `Object.prototype.then` — un objeto fundamental de JavaScript del que heredan todos los demás objetos.
4. Esto le otorga al atacante acceso al constructor `Function` de JavaScript.
5. El atacante usa el constructor `Function` para ejecutar código arbitrario como proceso del servidor Node.js.```
Step 1 — Attacker sends crafted HTTP POST
↓
Step 2 — React deserializes payload blindly
↓
Step 3 — Object.prototype.then is hijacked (prototype pollution)
↓
Step 4 — Function constructor is accessed
↓
Step 5 — Attacker's code runs on the server
↓
Step 6 — Attacker has full server control
// This is a simplified version of the vulnerable code path inside React function parseFlightRequest(req) { const flight = req.body;
// ❌ NO validation — the server trusts whatever arrives
const decoded = dangerousDeserialize(flight); // Attack happens here
// If the attacker controls decoded.action → RCE
return executeServerReference(decoded.action);
}
### Cómo se ve el ataque```http
POST /?flight=1 HTTP/1.1
Content-Type: text/plain
{
"status": "resolved_model",
"$1:__proto__:then": "node:process.mainModule.require('child_process').execSync('id > /tmp/rce')",
"_formData.get": "$1:constructor:constructor"
}
The input chunk appears to be empty. No content was provided for translation. Please re-send the chunk text.```bash
curl -X POST https://target.com/react?flight=1
-H "Content-Type: text/plain"
--data '["$ACTION_REF","proto","constructor","<attacker_payload>"]'
> 🚫 **Aviso legal:** No uses esto contra ningún sistema que no sea tuyo o para el que no tengas autorización escrita explícita.
---
## Versiones corregidas — Parchea ahora
### Paquetes React RSC
| Paquete | Versión parcheada |
|------------------------------|------------------------------|
| `react-server-dom-webpack` | 19.0.1, 19.1.2, **19.2.1+** |
| `react-server-dom-parcel` | 19.0.1, 19.1.2, **19.2.1+** |
| `react-server-dom-turbopack` | 19.0.1, 19.1.2, **19.2.1+** |
> 💡 **Recomendación:** Actualiza a **19.2.3** para corregir también vulnerabilidades relacionadas posteriores (CVE-2025-55183, CVE-2025-55184, CVE-2025-67779).
### Next.js
| Tu versión | Actualiza a |
|------------|-------------|
| 13.x / 14.x | **14.2.35** |
| 15.0.x | **15.0.5** |
| 15.1.x | **15.1.9** |
| 15.2.x | **15.2.6** |
| 15.3.x | **15.3.6** |
| 15.4.x | **15.4.8** |
| 15.5.x | **15.5.7** |
| 16.0.x | **16.0.7** |
---
## Cómo protegerte — Paso a paso
Sigue estos pasos **en orden**. Los pasos 1 y 2 son obligatorios. El resto añade capas adicionales de defensa.
### Paso 1 — Actualiza los paquetes de React (lo más importante)```bash
# Check your current version
npm list react-server-dom-webpack