Kit de herramientas de explotación RCE para CVE-2025-55182 y CVE-2025-66478 en React Server Components. Incluye múltiples variantes de exploit, scripts de detección, un servidor de pruebas vulnerable y un análisis técnico profundo de la vulnerabilidad de deserialización del protocolo Flight.
CVE-2025-55182 (React) y CVE-2025-66478 (Next.js)
Este repositorio contiene código de exploit únicamente para pruebas de seguridad autorizadas y fines educativos.
Ver también: Múltiples investigadores han publicado análisis de esta vulnerabilidad. Consulta la sección Referencias para obtener perspectivas adicionales, técnicas de explotación y métodos de detección.
El miércoles 3 de diciembre de 2025 se reveló públicamente una vulnerabilidad crítica de ejecución remota de código en React Server Components. El fallo, bautizado como «React2Shell», permite a un atacante no autenticado ejecutar código arbitrario en cualquier servidor que ejecute versiones vulnerables de React RSC o Next.js App Router mediante el envío de una única petición HTTP.
Dado lo omnipresente que se ha vuelto Next.js - impulsa una parte significativa de la web moderna - el impacto de esta vulnerabilidad es grave. Cualquier aplicación Next.js que use App Router (el valor predeterminado para proyectos nuevos desde Next.js 13) con RSC habilitado es vulnerable. Sin configuración especial. Sin endpoints específicos. Solo una petición POST a cualquier ruta.
La vulnerabilidad reside en el protocolo «Flight» de React, el formato de serialización utilizado para transferir datos entre servidor y cliente en React Server Components. La ausencia de una comprobación de hasOwnProperty durante la deserialización permite recorrer la cadena de prototipos, llegando en última instancia al constructor Function de JavaScript para ejecutar código controlado por el atacante.
El fallo existe en los paquetes react-server-dom-webpack, react-server-dom-turbopack y react-server-dom-parcel de React. Next.js, como principal consumidor de RSC, hereda la vulnerabilidad a través de su App Router.
Muchos servicios son potencialmente vulnerables. Next.js es uno de los frameworks de React más populares, utilizado por empresas de todos los tamaños - desde startups hasta grandes corporaciones. App Router con React Server Components ha sido la arquitectura predeterminada para proyectos nuevos de Next.js desde la versión 13, lo que significa que la mayoría de los despliegues modernos de Next.js están afectados.
Cualquier aplicación que use:
react-server-dom-* vulnerables (19.0.0 - 19.2.0)Esto incluye despliegues en producción en Vercel, AWS, infraestructura autoalojada y cualquier otro lugar donde se ejecuten aplicaciones Next.js App Router.
No afectados:
process.mainModule disponible)| Paquete | Vulnerable | Parcheada |
|---|---|---|
react-server-dom-webpack | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
react-server-dom-turbopack | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
react-server-dom-parcel | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
| Línea de versión | Vulnerable | Parcheada |
|---|---|---|
| 15.0.x | < 15.0.5 | 15.0.5+ |
| 15.1.x | < 15.1.9 | 15.1.9+ |
| 15.2.x | < 15.2.6 | 15.2.6+ |
| 15.3.x | < 15.3.6 | 15.3.6+ |
| 15.4.x | < 15.4.8 | 15.4.8+ |
| 15.5.x | < 15.5.7 | 15.5.7+ |
| 16.0.x | < 16.0.7 | 16.0.7+ |
Actualiza de inmediato. No hay soluciones alternativas.
Para aplicaciones Next.js:
npm install next@latest
# or
pnpm update next
Para uso directo de React RSC:
npm install react-server-dom-webpack@latest
Verifica tus versiones instaladas:
npm ls next react-server-dom-webpack react-server-dom-turbopack
Se han descubierto múltiples vectores de ataque para esta vulnerabilidad. El más común - y el que funciona sin ningún requisito previo - utiliza la contaminación de prototipos a través del sistema de referencias del protocolo Flight de React.
El exploit envía una petición POST multipart manipulada con una cabecera Next-Action. El payload abusa del sistema de referencias para:
$1:__proto__:thenFunction de JavaScriptPOST / HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----Boundary
Next-Action: x
------Boundary
Content-Disposition: form-data; name="0"
{"then":"$1:__proto__:then","status":"resolved_model","value":"{...}","_response":{...}}
------Boundary
Content-Disposition: form-data; name="1"
"$@0"
------Boundary--
El código se ejecuta durante la deserialización, antes de que se realice cualquier validación del ID de acción. Esto significa que cualquier valor de la cabecera Next-Action activa la ruta de código vulnerable - no se requiere un ID de acción válido.
Existen otros vectores de ataque, incluidas las referencias a funciones
$Fy los gadgets de módulo directos. Estos suelen requerir un ID de acción válido. Consulta Vectores de ataque alternativos para más detalles.
El protocolo Flight de React resuelve referencias como $1:path:to:value dividiendo por dos puntos y recorriendo el objeto:
// ReactFlightReplyServer.js - getOutlinedModel()
for (let i = 1; i < path.length; i++) {
value = value[path[i]]; // No hasOwnProperty check!
}
La ironía: En la parte superior de este mismo archivo, línea 35:
import hasOwnProperty from 'shared/hasOwnProperty';La protección se importó. Estaba disponible. Simplemente no se usó en el único bucle donde más importaba.
Esta única comprobación ausente permite que $1:__proto__:then recorra desde un objeto chunk, a través de la cadena de prototipos, hasta Chunk.prototype.then - una función que procesa objetos similares a Promise. Al crear un chunk falso con las propiedades adecuadas, controlamos qué código se ejecuta.
Clona el servidor de pruebas vulnerable:
git clone https://github.com/freeqaz/react2shell
cd react2shell/vulnerable-next-server
pnpm install
pnpm dev
En otra terminal:
./detect.sh http://localhost:3443
Un servidor vulnerable devuelve HTTP 500 con E{"digest" en el cuerpo de la respuesta. Para demostrar RCE:
./exploit-redirect.sh http://localhost:3443 "id"
La salida del comando aparece en la respuesta. Para exploración interactiva:
./shell.sh http://localhost:3443
El directorio vulnerable-next-server/ contiene una aplicación Next.js 16.0.6 + React 19.2.0 preconfigurada para pruebas locales seguras. Se ejecuta en el puerto 3443 por defecto. Es una configuración mínima de App Router que demuestra que las configuraciones predeterminadas son vulnerables.
Desarrollamos múltiples variantes de exploit para manejar diferentes escenarios: