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 验证。

技术细节

  1. 中间件递归机制

    • 当中间件重写请求路径时,Next.js 服务器会重新触发新的请求
    • 如果没有 x-middleware-subrequest 标识,新的请求会再次触发相同的中间件,导致无限递归
    • 正常情况下,Next.js 会在新请求上自动添加 x-middleware-subrequest
  2. 漏洞触发条件

    • 攻击者手动添加 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

漏洞复现

  1. 正常访问需要登录的页面,会被重定向到登录页
  2. 添加以下请求头:
    x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware
    
  3. 观察是否绕过权限检查,直接访问到受保护页面

漏洞分析

老版本实现(Next.js 12.2 以下)

next-server.ts 文件中:

  1. 解析 x-middleware-subrequest 头的值,按 : 分割
  2. 如果分割后的数组包含当前中间件名称,则跳过执行
  3. 攻击者可伪造包含中间件名称的请求头绕过检查

高版本实现(受影响版本)

  1. 解析 x-middleware-subrequest 头的值,计算中间件名称出现次数
  2. 如果递归深度超过 MAX_RECURSION_DEPTH(5),中间件停止执行
  3. 攻击者需要伪造包含5个中间件名称的请求头

中间件名称确定

  • 老版本:中间件文件必须命名为 _middleware.ts 并位于 pages/ 目录下
  • 新版本:中间件文件更名为 middleware.ts,可能位于:
    • src/middleware.ts
    • src/app/middleware.ts
    • src/pages/middleware.ts

漏洞修复

官方修复方案(commit 52a078d):

  1. 移除了递归深度检查机制
  2. 不再允许通过请求头绕过中间件执行

防御建议

  1. 升级到安全版本:

    • Next.js 15.2.3+
    • Next.js 14.2.25+
    • Next.js 13.5.9+
  2. 对于无法立即升级的应用:

    • 在应用程序层面增加额外的权限验证
    • 使用反向代理过滤可疑的 x-middleware-subrequest
  3. 安全开发实践:

    • 不要仅依赖中间件进行权限控制
    • 在API路由和页面组件中增加二次验证
    • 使用Next.js提供的其他安全机制如getServerSideProps进行验证

参考资源

  1. 官方修复提交:https://github.com/vercel/next.js/commit/52a078da3884efe6501613c7834a3d02a91676d2
  2. 漏洞复现环境:
    • 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
  3. 技术分析:
    • https://zhero-web-sec.github.io/research-and-things/nextjs-and-the-corrupt-middleware
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 环境 方法二:手动搭建 漏洞复现 正常访问需要登录的页面,会被重定向到登录页 添加以下请求头: 观察是否绕过权限检查,直接访问到受保护页面 漏洞分析 老版本实现(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.ts src/app/middleware.ts src/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