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

贡献者

页面历史

Discuss

根据 CC BY-SA 4.0 许可证发布。 (9037680)