

从 11.1.4 到 13.5.6 的所有 Next.js 版本,以及 14.x 中 14.2.25 之前的版本、15.x 中 15.2.3 之前的版本均受此漏洞影响。对于依赖中间件实现访问控制的应用程序来说,影响尤为严重,攻击者可以在无需认证的情况下获取对受保护资源的未授权访问。
CVE-2025-29927 漏洞源于 Next.js 处理 x-middleware-subrequest 头部的设计缺陷。该头部最初是 Next.js 框架内部使用的,用于防止中间件无限执行循环。
当 Next.js 应用程序使用中间件时,会调用 runMiddleware 函数来处理传入请求。作为其功能的一部分,该函数会检查是否存在 x-middleware-subrequest 头部。如果该头部存在且包含特定值,中间件的执行将被完全跳过,请求会通过 NextResponse.next() 直接转发到其原始目的地。
漏洞在于,这个头部检查可以被外部用户利用。攻击者只需向请求中添加带有正确值的 x-middleware-subrequest 头部,即可完全绕过任何基于中间件的保护机制。
克隆仓库:
git clone <repository_url>
进入项目目录:
cd nextjs-docker-app
构建 Docker 镜像:
docker build -t nextjs-app .
运行 Docker 容器:
docker run -p 3000:3000 nextjs-app
在浏览器中访问 http://localhost:3000 打开应用程序。
根据 Next.js 版本的不同,利用方法略有差异:
在这些版本中,中间件文件必须命名为 _middleware.ts,并放置在 pages 文件夹中。middlewareInfo.name 的值由目录名和文件名组成:
x-middleware-subrequest: pages/_middleware
对于嵌套路由,可能在不同层级存在多个中间件文件,因此头部可以有多个可能的值:
x-middleware-subrequest: pages/dashboard/_middleware
或
x-middleware-subrequest: pages/dashboard/panel/_middleware
从 12.2 版本开始,Next.js 更改了中间件的约定。文件名应为 middleware.ts(不带下划线),并且不再位于 pages 文件夹中。对于这些版本,有效载荷更简单:
x-middleware-subrequest: middleware
此外,Next.js 允许使用包含 /src 目录的备选项目结构。在这种情况下,有效载荷为:
x-middleware-subrequest: src/middleware
对于 13.2.0 及以上版本,Next.js 引入了中间件执行的最大递归深度。这是为了防止无限循环,但不影响漏洞的利用。由于头部检查发生在任何递归深度检查之前,因此利用方式保持不变。
x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware
或者,对于使用 /src 目录结构的项目:
x-middleware-subrequest: src/middleware:src/middleware:src/middleware:sr
=======
# cve-2025-29927
>>>>>>> 56c7b2dcd548caf771750519107bf7c57749a864