El aviso de seguridad de diciembre de 2025 del equipo de React marca un cambio de paradigma en la seguridad de las aplicaciones web. A medida que la industria adopta rápidamente el renderizado del lado del servidor (SSR) a través de React Server Components (RSC), la superficie de ataque ha migrado del DOM del cliente al límite de serialización del servidor. CVE-2025-55184 no es un fallo trivial de agotamiento de recursos; es un sofisticado Complejidad algorítmica Denegación de servicio apuntando a la arquitectura fundamental del bucle de eventos de Node.js. Aprovechando la deserialización recursiva de promesas dentro del bucle de eventos de Protocolo de vuelo...un atacante no autenticado puede inducir... Cola de espera de microtareas, dejando el proceso del servidor en coma mientras mantiene abiertos los puertos TCP. Esta guía definitiva disecciona la vulnerabilidad a nivel de cable, explora la mecánica de recursión "Ouroboros" y demuestra cómo... Penligente aprovecha el fuzzing diferencial basado en IA para validar este fallo sin interrumpir la disponibilidad de la producción.

La arquitectura de un accidente: RSC, el vuelo y el bucle de eventos
Para apreciar plenamente la gravedad de CVE-2025-55184, primero debemos deconstruir la capa de comunicación propietaria que impulsa Next.js App Router y React 19: el Protocolo de vuelo.
Formato de los cables del protocolo de vuelo
A diferencia de REST o GraphQL, que suelen devolver JSON estático, RSC utiliza un formato de flujo híbrido basado en filas diseñado para resolver árboles de componentes de forma incremental.
Un flujo de respuesta de vuelo típico tiene este aspecto:
HTTP
1:I{"id":134,"chunks":["app/page.js"],"name":"default"} 2:{"title":"Welcome","content":"$@1"} 3:{"$":"$@2"}
- Línea 1: Importa un módulo (Componente Cliente).
- Línea 2: Define un objeto JSON que hace referencia al chunk 1.
- Línea 3: Define una referencia al chunk 2.
La característica fatal: Serialización asíncrona
React permite a los desarrolladores pasar promesas del servidor al cliente. Cuando el serializador encuentra una Promise pendiente, emite un marcador de posición. El deserializador (en el extremo receptor, que también puede ser un servidor en arquitecturas por niveles) está programado para esperar a que estas promesas se resuelvan.
Este requisito requiere una Estrategia de resolución recursiva: Si Promise A resuelve a Promise B, el deserializador debe suscribirse a Promise B. Esta recursividad es donde radica la vulnerabilidad.
Node.js Internos: Microtask Queue Starvation
¿Por qué este exploit es tan devastador comparado con un while(true) bucle? La respuesta está en la programación de tareas del motor V8.
- Macrotareas: Temporizadores (
setTimeout), devoluciones de llamada de E/S,setImmediate. - Microtareas: Promesa de devolución de llamada (
.entonces,.atrapar),process.nextTick.
El Mecánico del Hambre:
El Bucle de Eventos de Node.js opera bajo una estricta regla de prioridad: La cola de microtareas debe estar completamente vacía antes de que el bucle de eventos pueda pasar a la siguiente fase.
En un exploit CVE-2025-55184, el atacante envía una carga útil en la que una promesa se resuelve a sí misma (o una cadena que conduce a sí misma).
- El deserializador programa un
.then()para gestionar la resolución. - La llamada de retorno se ejecuta, ve la recursión y programa otro
.then(). - Esto es crucial de forma sincrónica en relación con el procesamiento de la cola. La longitud de la cola nunca llega a cero.
- Impacto: Las retrollamadas de E/S de red (manejo de nuevas peticiones), las sondas de Health Check y las señales del SO están permanentemente bloqueadas. El proceso está vivo (el PID existe), los puertos están abiertos (SYN-ACK funciona a nivel del SO), pero la aplicación está en muerte cerebral.
Ingeniería inversa del exploit
La carga útil "Ouroboros
La vulnerabilidad existe en react-server-dom-webpack (y sus variantes para Parcel/Turbopack). La versión sin parchear processValue carecía de limitación de profundidad o detección de ciclos para los tipos de referencia.
Un atacante puede convertir esto en un arma construyendo un Gráfico cíclico dirigido (DCG) dentro de la carga útil de vuelo.
Código de explotación conceptual (nivel de protocolo)
Aunque la codificación binaria real es compleja, la estructura lógica del vector de ataque es elegantemente simple:
JavaScript
`// Una representación JSON de la estructura de vuelo malicioso // Objetivo: Next.js App Router Endpoint (POST /)
{ "id": "root", "chunks": [], "value": { // Definimos un objeto Promise manualmente usando la sintaxis Flight "$": "$Promise", "status": "fulfilled", "value": { // El valor de esta promesa resuelta es... EL MISMO. "$": "$@root" } } }`
Cuando el servidor analiza esto:
- Ve una Promesa cumplida.
- Desenvuelve el valor.
- Ve una referencia al objeto raíz (que es la Promesa).
- Programa una microtarea para desenvolver de nuevo el objeto raíz.
- GOTO 1.
Este bucle se produce íntegramente en memoria, eludiendo los WAF tradicionales que buscan firmas de inyección SQL o cuerpos de solicitud grandes. La carga útil suele ser inferior a 1 KB.
La saga de la "solución incompleta" (CVE-2025-67779)
Es de vital importancia señalar que el parche inicial para esta vulnerabilidad fue eludido en cuestión de días. El primer parche intentaba controlar la profundidad de la recursión, pero no tenía en cuenta ciertas variaciones de las estructuras anidadas (por ejemplo, envolver el ciclo dentro de un ciclo de Mapa o Establecer). Esto condujo a CVE-2025-67779. Por lo tanto, no basta con "actualizarse", sino que hay que asegurarse de que se está a la última. definitivo versiones parcheadas (React 19.0.3+ / Next.js 15.0.6+).
El socio silencioso: CVE-2025-55183 (Exposición del código fuente)
Mientras que el 55184 destruye la disponibilidad, CVE-2025-55183 destruye la confidencialidad. Esta vulnerabilidad complementaria fue revelada simultáneamente.
El mecanismo de la fuga:
Las Server Actions son funciones internas. Sin embargo, si un atacante solicita una Server Action por ID como valor (en lugar de invocarla), el serializador vulnerable la trata como un objeto de datos. Al hacerlo, serializa el cuerpo de la función compilada como una cadena.
Impacto:
- Extracción lógica: Los atacantes pueden leer tu lógica de validación de backend (
if (!user.isAdmin) ...). - Raspado secreto: Se revelan claves de API codificadas o puntos finales internos.
- Descubrimiento de API en la sombra: Las Acciones del Servidor no utilizadas u ocultas se convierten en objetivos de ataque visibles.
Verificación avanzada: El enfoque Penligent
En un entorno en el que hay mucho en juego, "intentar colapsar el servidor" para demostrar una vulnerabilidad es poco profesional y peligroso. Penligente utiliza IA Explotación segura para verificar estos CVE sin tiempo de inactividad.
Estrategia 1: sondeo de recursión limitada (DoS seguro)
En lugar de un bucle infinito, el Agente Penligent AI construye una carga útil con un Profundidad de recursión finita ($N=5000$).
- La Sonda: Una cadena Promise recursiva que termina después de 5000 iteraciones.
- Análisis heurístico:
- Vulnerable: El servidor procesa la cadena. Penligent detecta un Deriva de latencia (por ejemplo, tiempo de respuesta = línea de base + 200 ms) y un pico transitorio en el uso del montón.
- Parcheado: El nuevo mecanismo de seguridad en React 19 lanza un error de "Referencia Cíclica" inmediatamente. La respuesta es casi instantánea (500 Internal Server Error).
- Conclusión: Si la latencia se correlaciona con la profundidad ($T \propto N$), se confirma la vulnerabilidad sin colgar el proceso.
Estrategia 2: Fuzzing diferencial para fugas de código fuente (CVE-2025-55183)
Detectar la vulnerabilidad de exposición del código fuente:
- Huellas dactilares: Penligent identifica los ID de acción de servidor disponibles de los paquetes legítimos del lado del cliente.
- Inyección reflectante: El agente envía solicitudes de Vuelo modificadas intentando "hacer eco" de estos IDs como propiedades de datos.
- IA de concordancia de patrones: Se analiza el flujo de respuesta. Si la IA detecta firmas de funciones JavaScript (por ejemplo,
función asíncrona $...,var _0x...) dentro de la respuesta JSON, marca un Fuga de información crítica.

Plan de acción y reparación del ingeniero
La ventana para la explotación está abierta de par en par. Los bots automatizados ya están buscando instancias expuestas de Next.js 15.0.x.
1. La matriz de actualización (aplicación estricta)
Debe asegurarse de que su árbol de dependencias resuelve las versiones seguras. No confíe en las caretas semver (^) solo; compruebe su pnpm-lock.yaml o paquete-lock.json.
| Paquete | Gama Vulnerable | Versión segura (mínima) |
|---|---|---|
| react-server-dom-webpack | < 19.0.3 | 19.0.3 |
| Siguiente.js | 15.0.0 – 15.0.5 | 15.0.6+ (o 14.2.34+ para v14) |
2. Anulaciones de resolución de dependencia
Porque react-server-dom-webpack suele ser una dependencia anidada, debe forzar la resolución en paquete.json para evitar que se cuelen versiones anteriores:
JSON
// package.json { "pnpm": { "overrides": { "react-server-dom-webpack": "19.0.3", "react-server-dom-turbopack": "19.0.3" } } }
3. Validación continua
La seguridad no es un parche que se pone una sola vez. Utilice Penligente para supervisar continuamente su despliegue. A medida que surgen nuevas desviaciones (como la observada en CVE-2025-67779), los modelos de IA de Penligent se actualizan para probar estas variaciones, lo que garantiza que su perímetro siga siendo impenetrable frente a los ataques lógicos en evolución.
Referencias y enlaces de autoridad:
- Aviso de seguridad de React: Denegación de servicio y exposición del código fuente
- Actualización de seguridad oficial de Next.js (diciembre de 2025)
- Documentos de Node.js: El bucle de eventos, temporizadores y process.nextTick()
- NIST NVD - CVE-2025-55184 Detalle


