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-analysis — Análisis técnico detallado de CVE-2025-55182, una RCE crítica sin autenticación en Next.js + React 19.0.0. Documenta el recorrido de investigación, el análisis del parche, el recorrido de prototipos y el sumidero de deserialización Blob que permite la explotación completa sin gadgets específicos de la aplicación. | Kitploit
Herramientas/GitHubGitHub/santihabib/cve-2025-55182-analysis
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebSeguridad WebPruebas de PenetraciónAprendizaje y Educación
GitHubsantihabib/cve-2025-55182-analysis

CVE-2025-55182-analysis

Ver Repositorio
43hace 9 mesesAún no revisado

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 →

Acerca de

Análisis técnico detallado de CVE-2025-55182, una RCE crítica sin autenticación en Next.js + React 19.0.0. Documenta el recorrido de investigación, el análisis del parche, el recorrido de prototipos y el sumidero de deserialización Blob que permite la explotación completa sin gadgets específicos de la aplicación.

Compartir

Análisis Técnico de CVE-2025-55182: Mi Viaje de Investigación

⚠️ Aviso de Exención de Responsabilidad Importante

Este documento describe mi proceso de investigación personal sobre CVE-2025-55182, incluyendo hallazgos confirmados y experimentos que realicé. Esto representa un relato honesto de mi investigación, incluyendo suposiciones iniciales incorrectas y el eventual avance.


Resumen Ejecutivo

Después de una investigación exhaustiva sobre CVE-2025-55182 (CVSS 10.0), mi conclusión inicial fue que no se había demostrado públicamente una RCE automática y que la explotación requería gadgets específicos de la aplicación. Esta conclusión era incorrecta.

El 5 de diciembre de 2025, tras recibir información adicional de otro investigador independiente en X (@maple3142), reproduje con éxito RCE completa no autenticada en Next.js vanilla sin requerir ninguna vulnerabilidad de código específica de la aplicación.


Metodología de Investigación

Fase 1: Análisis del Parche (Suposición Incorrecta Inicial)

Mi enfoque inicial fue el primer cambio en el parche de React 19.0.1:

Vulnerable (19.0.0):

root@kitploit:~
return fn.bind.apply(fn, [null].concat(_ref));

Parcheado (19.0.1):

root@kitploit:~
if (Array.isArray(promiseValue)) {
  promiseValue = promiseValue.slice(0);
} else {
  promiseValue = [];
}

Supuse que el camino de ataque era a través de fn.bind.apply() con objetos maliciosos en lugar de arrays. Pude demostrar la inyección de argumentos en Server Actions usando $ACTION_REF_ con bound controlado por el atacante:

root@kitploit:~
curl -X POST http://localhost:9000/ \
  -F '$ACTION_REF_0=' \
  -F '$ACTION_0:0={"id":"<ACTION_ID>","bound":["; id #","/etc/passwd"]}'

Resultado: Los argumentos se inyectaron con éxito en la Server Action. Sin embargo, esto solo lleva a RCE si la función objetivo utiliza esos argumentos de manera insegura.


Fase 2: Comportamiento Inseguro Observado en el Parche

Un análisis más profundo del parche reveló otro cambio importante en getOutlinedModel():

Vulnerable:

root@kitploit:~
for (key = 1; key < reference.length; key++)
  parentObject = parentObject[reference[key]];

Parcheado:

root@kitploit:~
if (hasOwnProperty.call(value, name)) {
  value = value[name];
}

Este comportamiento vulnerable permitía el recorrido de la cadena de prototipos usando referencias como:

root@kitploit:~
$1:__proto__:constructor:constructor

Fase 3: Experimento con Thenable y Function.constructor (Callejón Sin Salida)

Durante la investigación, probé un objeto thenable que contenía una propiedad .then:

root@kitploit:~
{"then": "$1:__proto__:constructor:constructor"}

Cuando JavaScript procesa esto a través de await:

  1. JavaScript ve una propiedad .then y trata el objeto como una Promise
  2. Llama a obj.then(resolve, reject)
  3. Si then se resuelve en Function.constructor, JavaScript intenta ejecutar Function(resolve, reject)

Resultado observado:

root@kitploit:~
SyntaxError: Unexpected token 'function'
    at Object.Function [as then] (<anonymous>)

Fase 4: La Limitación de Vinculación de Argumentos (El Muro)

Cuando Function.constructor se invoca como:

root@kitploit:~
Function(resolve, reject)
// resolve.toString() = "function () { [native code] }"
// Function intenta analizar esto como código → SyntaxError

Los argumentos resolve y reject son siempre las funciones nativas de Promise. Function intenta interpretar el primer argumento como código fuente, lo cual no es JavaScript válido.

Aquí es donde mi investigación se estancó. Concluí que controlar los argumentos para Function.constructor era imposible sin un gadget específico de la aplicación.


Fase 5: El Avance — Deserialización de Blob (5 de diciembre de 2025)

Después de publicar mis hallazgos iniciales, otro investigador independiente me señaló una pieza crítica que había pasado por alto: el sumidero de deserialización $B (Blob).

La Pieza Faltante

En el código compilado del servidor React Flight (no visible en las fuentes TypeScript), existe:

root@kitploit:~
case "B":
  return response._formData.get(response._prefix + id);

Ubicación:

  • Paquete: [email protected]
  • Archivo: cjs/react-server-dom-webpack-server.node.unbundled.development.js
  • También en: [email protected]/dist/compiled/react-server-dom-webpack/

Este código permite a React llamar a response._formData.get() con valores derivados de la entrada controlada por el atacante, sin validación.

Por Qué Esto Lo Cambia Todo

EnfoqueArgumentos para Function.constructorResultado
Thenable (Fase 3)resolve, reject (funciones nativas)❌ SyntaxError
Blob + Response Envenenado_prefix (cadena controlada por el atacante)✅ RCE

Al combinar:

  1. Recorrido de prototipos ($1:__proto__:then → Chunk.prototype.then)
  2. Un objeto _response envenenado con:
    • _formData.get configurado como Function.constructor
    • _prefix configurado como código JavaScript arbitrario
  3. Un modelo interno que contiene una referencia $B

El manejador case "B": ejecuta:

root@kitploit:~
Function.constructor("<código del atacante>" + id)

Esto evita por completo la limitación de vinculación de argumentos.


PoCs Públicos: Análisis

PoCs populares en GitHub que afirman RCE utilizan Action IDs como:

  • "child_process#execSync"
  • "vm#runInThisContext"

Estos son falsos. Next.js solo acepta Action IDs definidos por la aplicación. IDs inválidos producen:

root@kitploit:~
TypeError: Cannot read properties of undefined (reading 'workers')

Sin embargo, el exploit real no requiere Action IDs falsos. Cualquier ID de Server Action válido funciona.


Verificación e Impacto

Probé esta cadena de explotación en una aplicación mínima de Next.js 15.0.3 + React 19.0.0 con solo:

root@kitploit:~
async function myAction(data) {
  "use server";
  console.log("Server Action called with:", data);
  return { success: true, received: data };
}

Resultado: RCE completa confirmada. La aplicación no contenía código inseguro, ni eval, ni execSync, ni gadgets.

Evaluación de Impacto

AspectoHallazgo
¿Autenticación requerida?❌ No
¿Gadget de aplicación requerido?❌ No
¿Funciona en Next.js vanilla?✅ Sí
Número de solicitudes necesarias1 POST
Versiones afectadasNext.js ≤15.0.4 + React 19.0.0
Puntuación CVSS10.0 (justificado)

Descubrimiento Crítico: Estado del Parche

Al 5 de diciembre de 2025, el sumidero $B aún existe en Next.js 15.0.5 (la versión supuestamente parcheada).

Verificación:

root@kitploit:~
$ npm pack [email protected]
$ tar -xzf next-15.0.5.tgz
$ grep -A5 'case "B":' package/dist/compiled/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js

Resultado:

root@kitploit:~
case "B":
  return response._formData.get(response._prefix + obj);

El código es idéntico al de la versión vulnerable.


Nota de Divulgación Responsable

Debido al descubrimiento de que la vulnerabilidad puede no estar completamente parcheada en las versiones "corregidas" declaradas, estoy reteniendo el payload completo de prueba de concepto pendiente de verificación con los equipos de seguridad de Vercel y Meta.

Los detalles técnicos proporcionados en este documento son suficientes para comprender el mecanismo de la vulnerabilidad, pero intencionalmente incompletos para evitar una explotación inmediata.


Conclusiones Actualizadas

Lo Que Encontré (Fases 1-4)

TécnicaEstado
Inyección de argumentos mediante bound✅ Confirmado (impacto limitado)
Recorrido de prototipos✅ Confirmado
Acceso a Function.constructor vía thenable✅ Confirmado (pero no explotable por sí solo)
Detección de versiones vulnerables✅ Confirmado

Lo Que Pasé Por Alto Inicialmente

ProblemaImpacto
El sumidero de deserialización $B (Blob)❌ Crítico - permite control de argumentos
Examinar código compilado vs. fuente❌ El sumidero solo existe en la salida compilada
Mecanismo de envenenamiento del objeto Response❌ Permite eludir todas las protecciones

Evaluación Final

CVE-2025-55182 es explotable para RCE completa no autenticada en aplicaciones Next.js vanilla.

  • ✅ No se requiere gadget específico de la aplicación
  • ✅ Funciona con un solo HTTP POST
  • ✅ El "gadget" está integrado en la lógica de deserialización de React
  • ⚠️ Puede no estar completamente parcheado en las versiones declaradas como corregidas

Cronología

  • 3 de diciembre de 2025: Análisis del recorrido de prototipos y enfoque thenable (callejón sin salida)
  • 4 de diciembre de 2025: Recibí información sobre la deserialización $B de un investigador independiente
  • 5 de diciembre de 2025: Reproducción completa de RCE confirmada
  • 5 de diciembre de 2025: Descubrí que la vulnerabilidad puede persistir en versiones "parcheadas"
  • 5 de diciembre de 2025: Este informe publicado (con detalles del PoC retenidos)

Recomendaciones

  1. Actualice inmediatamente a las últimas versiones de React y Next.js
  2. Verifique el parche probando si la deserialización $B todavía acepta objetos _response arbitrarios
  3. Monitoree intentos de explotación - busque:
    • Cabeceras Next-Action inusuales
    • Payloads multipart complejos con patrones $@, __proto__, $B
  4. Considere reglas WAF para bloquear patrones sospechosos en solicitudes de Server Action
  5. Contacte a los equipos de seguridad si está ejecutando versiones afectadas en producción

Agradecimientos

  • La información clave sobre la deserialización $B fue proporcionada por un investigador en X (@maple3142)
  • Los equipos de seguridad de React y Next.js por su trabajo en los parches (verificación en curso)
  • La comunidad de investigación en seguridad por la investigación colaborativa

Lecciones Aprendidas

  1. Examine el código compilado, no solo las fuentes - Las vulnerabilidades críticas pueden ocultarse en la salida empaquetada
  2. Reconsidere las suposiciones cuando surja nueva información
  3. La investigación colaborativa es esencial para vulnerabilidades complejas
  4. Documente el viaje - Los callejones sin salida son valiosos para comprender el panorama completo
  5. La divulgación responsable tiene prioridad sobre el reconocimiento público

Última actualización: 5 de diciembre de 2025

Descargar herramienta