
Prueba de concepto del exploit para CVE-2025-29927, una omisión de autorización en el middleware de Next.js. Incluye un laboratorio objetivo vulnerable y un script en Python para verificar la omisión enviando cabeceras x-middleware-subrequest manipuladas.
Un pequeño proyecto de GitHub para verificar CVE-2025-29927 (Bypass de autorización de middleware de Next.js) en un laboratorio de autorización local (VMware: máquina objetivo Ubuntu + máquina atacante Kali).
⚠️ Aviso legal: Este proyecto es solo para fines educativos, CTF y entornos de laboratorio que poseas o para los que tengas autorización explícita. Está estrictamente prohibido su uso en sistemas no autorizados. Las consecuencias derivadas del mal uso de este proyecto son responsabilidad del usuario.
| Elemento | Contenido |
|---|---|
| CVE | CVE-2025-29927 |
| Fecha de divulgación | 2025-03-25 (Aviso de seguridad oficial de Next.js) |
| Componente afectado | Vercel Next.js (framework full-stack de Node.js) |
| Tipo de vulnerabilidad | Bypass de autorización / Autorización incorrecta (CWE-863) |
| Versiones afectadas | < 12.3.5, < 13.5.9, < 14.2.25, < 15.2.3 |
| Versiones corregidas | 12.3.5 / 13.5.9 / 14.2.25 / 15.2.3 y superiores |
| Nivel de gravedad | Crítica / Alta (la puntuación exacta según la página de NVD) |
Tras la aparición de la vulnerabilidad, numerosos paneles de administración, callbacks de pago y APIs de páginas internas en entornos de producción fueron comprometidos. Tanto Metasploit como ProjectDiscovery Nuclei han incluido módulos de detección. Es una de las vulnerabilidades de «bypass de autorización a nivel de framework» más representativas de 2025.
Next.js permite escribir la «lógica de autenticación» en el middleware, por ejemplo:
export function middleware(request) {
if (!isLogin(request)) return NextResponse.redirect("/login"); // No autenticado → bloquear
return NextResponse.next();
}
El problema es que Next.js internamente depende de una cabecera de solicitud que el cliente puede falsificar para determinar si «esta solicitud ya ha pasado por el middleware»:
x-middleware-subrequest: middleware
En las versiones afectadas, si una solicitud externa incluye esta cabecera interna, Next.js asume erróneamente que el middleware ya se ha ejecutado, por lo que se omite todo el middleware de autenticación. El atacante no necesita ninguna cuenta; basta con acceder a rutas protegidas como /admin con esta cabecera para obtener un 200 directo — y como la página normalmente confía en el middleware y no realiza una segunda verificación, el control de autorización queda anulado (error de límite de confianza).
💡 El valor más comúnmente utilizado en la explotación pública es la forma en que la ruta del middleware se concatena repetidamente, por ejemplo
middleware:middleware:middleware:middleware:middleware; un únicomiddlewareno funciona en algunas versiones/estructuras de directorios (verificado en este laboratorio con la 14.2.24). Este PoC probará múltiples valores candidatos; si alguno funciona, el bypass habrá tenido éxito.
CVE-2025-29927-PoC/
├── README.md # Este documento (explicación de la vulnerabilidad + tutorial del laboratorio VMware)
├── LICENSE # MIT
├── .gitignore
├── exploit.py # ★ PoC de verificación en Python3 solo con biblioteca estándar (se ejecuta en Kali/cualquier máquina)
├── target/ # ★ Laboratorio de vulnerabilidad autocontenido (copiar a la máquina objetivo Ubuntu)
│ ├── package.json # Bloquea [email protected] (versión afectada)
│ ├── middleware.js # Simula el «middleware de autenticación» de producción real
│ ├── pages/
│ │ ├── index.js # Página de inicio
│ │ ├── login.js # Página de inicio de sesión (demuestra la redirección aquí)
│ │ └── admin.js # ★ Panel de administración protegido, lee flag.txt en el servidor
│ ├── flag.txt # Bandera del laboratorio: FLAG{...}
│ ├── setup.sh # Instalación con un clic en la máquina objetivo: Node 20 + npm install + build
│ └── start.sh # Escucha en 0.0.0.0:3000 en modo producción
└── tests/
└── mock_target.py # Máquina objetivo simulada sin Node (solo para autocomprobación de desarrollo)
┌───────────────────────────────────────────────────────────┐
│ VMware Workstation Pro 17 (host: Windows) │
│ Red: NAT (VMnet8 por defecto), ambas VM en la misma subred, ping mutuo │
│ │
│ ┌──────────────────┐ ┌─────────────────────┐ │
│ │ Objetivo Ubuntu 24.04 │ │ Atacante Kali Linux │ │
│ │ │ http │ │ │
│ │ Node 20 + Next │◄───────│ python3 exploit.py │ │
│ │ 14.2.24 :3000 │ GET │ │ │
│ └──────────────────┘ └─────────────────────┘ │
│ IP: <TARGET_IP> IP: <ATTACKER_IP> │
└───────────────────────────────────────────────────────────┘
| Propósito | Imagen/Software | Versión recomendada |
|---|---|---|
| Software de virtualización | VMware Workstation Pro 17 (gratuito para uso personal) | 17.x |
| Imagen de la máquina objetivo | ISO de Ubuntu Server LTS | 24.04.x |
| Máquina atacante | Kali Linux (imagen oficial preconfigurada para VMware o instalación ISO) | 2025.x |
| (Opcional) | Host con 8 GB+ de RAM, 50 GB+ de disco | — |
Todos los siguientes pasos se ejecutan en la máquina objetivo Ubuntu.
# Opción A: sube el proyecto a tu propio GitHub y clónalo (recomendado; usa esto si piensas publicarlo en GitHub)
git clone https://github.com/<tu-nombre-de-usuario>/CVE-2025-29927-PoC.git
cd CVE-2025-29927-PoC
# Opción B: cópialo desde el host con scp
# scp -r CVE-2025-29927-PoC ubuntu@<TARGET_IP>:~/