检测和抵御 Next.js 中的授权绕过漏洞
内容提要
2025 年 3 月 21 日, Next.js 框架中出现一个新的严重授权绕过漏洞,其 CVSS 评分为 9.1,漏洞编号为 CVE‑2025‑29927 并且已公开。此漏洞允许攻击者利用该框架的中间件处理机制中的一项缺陷,绕过身份验证与授权检查,进而导致未经授权的访问敏感路由。
攻击者无需进行身份验证即可利用此漏洞,从而获得对受保护路由的非法访问权限。
Akamai 安全情报组 (SIG) 已发现初步的漏洞利用企图,这些企图旨在探测潜在服务器是否存在此漏洞。
在本博文中,Akamai 研究人员详细介绍了该漏洞及其利用方式和检测策略。
Akamai 自适应安全引擎快速规则自动为 Akamai App & API Protector 客户提供保护。
什么是 CVE-2025-29927?
CVE‑2025‑29927 是开源 React 框架 Next.js 中的一个授权绕过漏洞,此框架广泛用于帮助缩短网站加载时间和提高 SEO 值。该漏洞于 2025 年 3 月 21 日公开,并且被评定为极其严重的 9.1 CVSS 级漏洞。攻击者成功利用该漏洞后,可以假冒仅供内部使用的标头,绕过基于中间件的安全检查。
Next.js 使用标头来避免请求处理过程中的无限循环,但其值基于中间件文件的路径并且可以被预测到,使得攻击者很容易进行仿冒。 攻击者通过在 HTTP 请求中包含正确的标头值,在某些情况下,可以欺骗应用程序来跳过身份验证和授权检查,从而获取对受保护资源的访问权限。
漏洞详情
Next.js 采用中间件方法来处理传入的 HTTP 请求,然后再将请求传递到主应用程序逻辑。中间件通常用于执行重要任务,例如身份验证、授权和设置安全标头。此框架使用名为“x‑middleware‑subrequest”的内部标头,用来管理这些进程、管理内部请求流以及防止各种问题,例如请求处理期间的无限递归。
其核心问题在于对“x‑middleware‑subrequest”标头的不当验证。此标头旨在仅供内部使用,但标头值是可以预测的,通常基于中间件文件的位置或命名。因此, 攻击者可以构建一个仿冒此请求标头的简单请求,从而欺骗系统,使得系统将请求作为内部请求处理,以此来绕过关键的检查环节。
绕过中间件之后,应用程序不会执行其正常的安全例程,例如身份或角色验证,这就导致了有可能未经授权地访问应用程序中的敏感部分或受限制部分。满足所有条件后,此漏洞尤为危险,因为利用此漏洞无需任何前期的身份验证。
CVE-2025-29927 影响多个版本的 Next.js。虽然在不同版本上的漏洞利用方法略有不同,但核心问题保持不变。在较早的版本中,该漏洞利用包含“ _middleware ”值的特制请求标头;在较新的版本中则使用 middleware 或 src/middleware ,以便与更新后的中间件文件结构和命名约定保持一致。
该漏洞在 Next.js 版本 14.2.25 和 15.2.3 中得到了修复,但如果 服务器运行的 Next.js 版本早于 14.2.25(对于 14.x)和 15.2.3(对于 15.x),以及运行版本 11.1.4–13.5.6, 仍然容易受到攻击。
观察到的攻击流量
Akamai SIG 已经观察到了针对此漏洞的初期漏洞利用企图,攻击者意图通过此方法来探测可能存在该漏洞的服务器。在识别出的有效负载中,有一种攻击方法需要特别注意。该方法使用了“ x-middleware-request ”标头和值“ src/middleware:src/middleware:src/middleware:src/middleware:src/middleware”。
这种方法在一个请求中模拟多个内部子请求,触发 Next.js 的内部重定向逻辑,这与多个公开的 概念验证漏洞利用 非常相似(图 1)。
此外还观察到了其他的攻击变体,专门针对较早版本的 Next.js。图 2 演示的变体使用了有效负载“ pages/_middleware=”。
利用 Akamai App & API Protector 抵御漏洞
2025 年 3 月 24 日,Akamai 威胁研究团队还部署了一条自适应安全引擎快速规则,用以检测该 CVE(图 3)。
3000958 ——Next.js 中间件授权绕过 (CVE-2025-29927)
App & API Protector 客户通过这条新规则可以获得全面的防护能力(图 4)。
快速规则的版本 1 将默认操作设置为 告警。为了阻止这些攻击企图,客户可以在查看触发器后将规则操作设置为 拒绝 ,以消除任何误报。
但是,我们观察到,一些客户可能会合法地使用此标头,并将中间件名称作为其值。 因此,我们建议,在没有进行进一步的分析并应用附加条件时,不要将此规则操作更改为 拒绝 。