Next.js 中间件鉴权绕过漏洞 (CVE-2025-29927)
字数 1860 2025-08-29 08:29:58
Next.js 中间件鉴权绕过漏洞分析 (CVE-2025-29927)
漏洞概述
CVE-2025-29927 是 Next.js 框架中发现的一个严重授权绕过漏洞。该漏洞允许攻击者通过伪造特定的 HTTP 请求头,绕过中间件中的授权检查,从而未经授权地访问受保护的资源。
受影响版本
- Next.js 15.x < 15.2.3
- Next.js 14.x < 14.2.25
- Next.js 13.x < 13.5.9
影响范围
- 使用中间件的自托管 Next.js 应用程序(使用
next start命令并设置output: 'standalone') - 依赖 Middleware 进行身份验证或安全检查的应用程序,且后续不在应用程序中进行验证
漏洞原理
Next.js 使用内部头字段 x-middleware-subrequest 来防止递归请求导致的无限循环。攻击者可以通过在请求中伪造该头字段,跳过中间件的执行,从而绕过关键的安全检查,如授权 Cookie 验证。
技术细节
-
中间件递归机制:
- 当中间件重写请求路径时,Next.js 服务器会重新触发新的请求
- 如果没有
x-middleware-subrequest标识,新的请求会再次触发相同的中间件,导致无限递归 - 正常情况下,Next.js 会在新请求上自动添加
x-middleware-subrequest头
-
漏洞触发条件:
- 攻击者手动添加
x-middleware-subrequest头 - 在旧版本中,如果该头包含中间件名称,中间件会被跳过
- 在新版本中,如果该头包含5个连续的中间件名称,中间件会被跳过
- 攻击者手动添加
环境搭建
可以使用以下两种方式搭建测试环境:
方法一:使用 vulhub 环境
git clone https://github.com/vulhub/vulhub.git
cd vulhub/next.js/CVE-2025-29927
docker-compose up -d
方法二:手动搭建
git clone https://github.com/aydinnyunus/CVE-2025-29927
cd CVE-2025-29927
npm install
npm run build
node .next/standalone/server.js
漏洞复现
- 正常访问需要登录的页面,会被重定向到登录页
- 添加以下请求头:
x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware - 观察是否绕过权限检查,直接访问到受保护页面
漏洞分析
老版本实现(Next.js 12.2 以下)
在 next-server.ts 文件中:
- 解析
x-middleware-subrequest头的值,按:分割 - 如果分割后的数组包含当前中间件名称,则跳过执行
- 攻击者可伪造包含中间件名称的请求头绕过检查
高版本实现(受影响版本)
- 解析
x-middleware-subrequest头的值,计算中间件名称出现次数 - 如果递归深度超过 MAX_RECURSION_DEPTH(5),中间件停止执行
- 攻击者需要伪造包含5个中间件名称的请求头
中间件名称确定
- 老版本:中间件文件必须命名为
_middleware.ts并位于pages/目录下 - 新版本:中间件文件更名为
middleware.ts,可能位于:src/middleware.tssrc/app/middleware.tssrc/pages/middleware.ts
漏洞修复
官方修复方案(commit 52a078d):
- 移除了递归深度检查机制
- 不再允许通过请求头绕过中间件执行
防御建议
-
升级到安全版本:
- Next.js 15.2.3+
- Next.js 14.2.25+
- Next.js 13.5.9+
-
对于无法立即升级的应用:
- 在应用程序层面增加额外的权限验证
- 使用反向代理过滤可疑的
x-middleware-subrequest头
-
安全开发实践:
- 不要仅依赖中间件进行权限控制
- 在API路由和页面组件中增加二次验证
- 使用Next.js提供的其他安全机制如getServerSideProps进行验证
参考资源
- 官方修复提交:https://github.com/vercel/next.js/commit/52a078da3884efe6501613c7834a3d02a91676d2
- 漏洞复现环境:
- https://github.com/vulhub/vulhub/blob/master/next.js/CVE-2025-29927
- https://github.com/aydinnyunus/CVE-2025-29927
- https://github.com/lem0n817/CVE-2025-29927
- 技术分析:
- https://zhero-web-sec.github.io/research-and-things/nextjs-and-the-corrupt-middleware