Skip to content

CVE-2025-29927: Next.js 中间件授权绕过

时间线

  • 2025-02-27T06:03Z: 通过 GitHub 私人漏洞报告向 Next.js 团队披露。
  • 2025-03-14T17:13Z: Next.js 团队开始对报告进行分类。
  • 2025-03-14T19:08Z: 为 Next.js 15.x 版本推送补丁。
  • 2025-03-14T19:26Z: 为 Next.js 14.x 版本推送补丁。
  • 2025-03-17T22:44Z: Next.js 14.2.25 版本发布。
  • 2025-03-18T00:23Z: Next.js 15.2.3 版本发布。
  • 2025-03-18T18:03Z: GitHub 发布了 CVE-2025-29927 报告。
  • 2025-03-21T10:17Z: 已发布安全公告。
  • 2025-03-22T21:21Z: Next.js 13.5.9 版本发布。
  • 2025-03-23T06:44Z: Next.js 12.3.5 版本发布。

概述

2025.3.21 披露了一个严重的安全漏洞 CVE-2025-29927,该漏洞的 CVSS(Common Vulnerability Scoring System) 综合评分为 9.1 / 10.0,被评为 严重级别。主要影响使用 middleware 进行 授权检查 的应用程序。攻击者可以通过设置 x-middleware-subrequest 头部,欺骗系统将外部请求视为内部子请求,从而绕过授权检查。

Next.js 团队在漏洞披露后迅速发布了补丁,并与云服务提供商(如 VercelCloudflare)合作,提供了网络层面的缓解措施。

影响版本

该漏洞影响几乎所有 Next.js 版本,并已在 Next.js14.2.2515.2.3 版本中得到修补。

修复版本

使用旧版本 Next.js11.1.4 ~ 13.5.6 )的用户尚未获得可用的修补程序。特别是,任何使用这些早期版本并依赖 Middleware 进行授权检查的应用程序都可能受到影响。

修复策略

  1. 升级到最新版本

    推荐升级到 Next.js14.2.2515.2.3 以上版本,这些版本包含针对 CVE-2025-29927 的补丁。

  2. 过滤 x-middleware-subrequest 头部

    若无法立即升级,可通过服务器或代理配置过滤该头部,阻止外部请求携带 x-middleware-subrequest。例如,可以使用反向代理(如 Nginx)或 WAF 规则(如 Cloudflare WAF)来实现此功能。

修复细节

ts
const randomBytes = new Uint8Array(8); 
crypto.getRandomValues(randomBytes); 
const middlewareSubrequestId = Buffer.from(randomBytes).toString('hex'); 
(globalThis as any)[Symbol.for('@next/middleware-subrequest-id')] =
  middlewareSubrequestId; 
ts
// If this request didn't origin from this session we filter
// out the "x-middleware-subrequest" header so we don't skip
// middleware incorrectly
if (
  header === 'x-middleware-subrequest' &&
  headers['x-middleware-subrequest-id'] !==
    (globalThis as any)[Symbol.for('@next/middleware-subrequest-id')] 
) {
  delete headers['x-middleware-subrequest']; 
}

Next.js 为每个会话生成唯一的中间件 子请求标识符,并将其存储在 globalThis 对象的 Symbol.for('@next/middleware-subrequest-id') 属性中,只有当前会话的子请求才能使用特殊标记跳过中间件,防止来自其他会话的请求通过 伪造标头 绕过中间件处理流程。

后续

Next.js 官方

Next.js 团队在发布补丁后,还 更新了 docs 文档,明确说明了 Next.jsmiddleware 并不适合用于 授权检查

md
Some common scenarios where Middleware is effective include:

- Quick redirects after reading parts of the incoming request
- Rewriting to different pages based on A/B tests or experiments
- Modifying headers for all pages or a subet of pages

Middleware is _not_ a good fit for:

- Slow data fetching
- Session management

社区

中间件的设计更适合简单的请求预处理,而非核心安全逻辑,CVE-2025-29927 暴露了其在头部验证上的不足。

观点类别具体内容支持来源
中间件设计局限性不适合复杂权限校验,易受头部操纵攻击Reddit Discussion, Medium Article
建议转向路由或 API 层在后端路由中实施更严格的验证,中间件仅用于简单拦截ZeroPath Blog, ProjectDiscovery Blog
多层防御必要性结合 WAF 和服务器端校验,确保安全Hacker News, ProjectDiscovery Blog
中间件正确的用途全局认证的规范性GitHub Pull Request Comment

Contributors

Changelog

Discuss

Released under the CC BY-SA 4.0 License. (2619af4)