Next.js 增量缓存路径遍历 RCE:CVE-2026-75604 分析

一个没被转义的反斜杠,在 Windows 上把增量缓存变成任意文件读写;再用泄露的 Server Action 加密密钥伪造请求,借 React Flight 的属性链走到 Function。

概述

项目 详情
CVE 编号 CVE-2026-75604
CVSS 9.0(Critical)
CWE CWE-22 路径遍历
影响版本 13.4.0 ~ 15.5.23;16.0.0 ~ 16.3.2
修复版本 15.5.24 / 16.3.3
披露时间 2026-08
利用状态 4 个公开 EXP + Metasploit 模块

安全研究机构 Fortbridge 披露的这个漏洞带一个硬条件:只在 Windows 文件系统上成立。应用需要在 Windows 上运行,使用 Pages Router 或 App Router,且未启用 Cache Components。

被怎么发现的

审计目标是增量缓存的路径构造。Next.js 用路由工具函数 escapePathDelimiters 清洗缓存路径段,它转义了 /、# 和 ?,唯独漏掉了反斜杠。

在 Linux 或 macOS 上,反斜杠只是普通字符;在 Windows 上它与正斜杠等价,是路径分隔符。攻击者只要在路由段里放进编码后的反斜杠(%5C),path.join() 在拼接缓存文件路径时就会逃出预期的缓存根目录。

更糟的是这个遍历同时作用于缓存的读取与写入:既能读服务器上的任意文件,也能往任意路径写文件。读写两个方向叠加,漏洞的性质就从信息泄露变成了潜在的执行。

复现过程

以下内容仅用于授权安全测试,需在 Windows 环境的隔离实验机上操作。

先准备一个受影响版本,并按官方文档创建一个 Server Action 与一个缓存路由。关键点是这个 Action 会把用户输入当作可调用值来执行——它正是整条链的落点:

'use server';
export async function processUserInput(boundFn: any, input: string) {
  return boundFn(input)();
}

第一步:路径遍历读取加密密钥。 在请求路径里重复拼入 ..%5C 逃逸缓存根目录,指向 .next/server/server-reference-manifest.json。这个文件里保存着保护 Server Action 绑定参数的加密密钥:

traversal = "..%5C" * 8
url = f"{TARGET}/app-cache/{traversal}.next/server/server-reference-manifest.json"

第二步:伪造 Server Action。 拿到 encryptionKey 后,就可以离线加密并重造绑定参数。这里借用的是 React Flight 的一处属性链:constructor.constructor 能一路解析到 Function,因此伪造的绑定值可以是一个函数对象而非数据。

第三步:投递请求。 把伪造好的参数随 Next-Action 头一起 POST 到应用,服务端解密并通过 Server Action 调用闭包绑定值,代码随即执行。若目标是满配环境,Metasploit 模块已经把整条流程自动化:

msf > use windows/http/nextjs_unauth_rce_cve_2026_75604
msf exploit(...) > set APP_ROUTER app-cache
msf exploit(...) > run

它按顺序完成指纹识别、获取 Build ID、泄露 server-reference-manifest、搜索可用的 Server Action、加密绑定参数、发送伪造请求。

修复方案

修复版本在缓存路径段里正确转义反斜杠,并强制把解析结果限制在缓存根目录内:

npm install next@15.5.24   # 15.x 发布线
npm install next@16.3.3    # 16.x 发布线

升级后要立刻轮换可能被遍历暴露的密钥,尤其是那些被显式固定、跨构建复用的 Server Action 密钥——只升级不换密钥,已泄露的值依然可用。

官方没有提供仅靠配置的临时修复。无法立即升级时,应把应用放进 WAF 或反向代理之后,在网络层阻断包含 %5C 和 ..%5C 的请求路径,并限制不受信任来源的访问。把部署迁到 Linux 能消除这个平台条件,但不能替代升级。

排查时重点看 Web 日志里包含 ..%5C 的异常路径、异常的子进程创建与可疑的文件写入行为。

总结

这是一个平台特异性漏洞,根因是跨平台代码对路径分隔符处理不一致——/ 与 \ 的分歧始终是路径遍历的经典来源。它展示的链条也很典型:路径遍历 → 密钥泄露 → 伪造认证 → RCE。

真正需要尽快动作的理由是门槛:披露时已有 4 个确认有效的公开利用工具,包括 Metasploit 模块与多个 Python 利用框架。运行在 Windows 上的 Next.js 用户应当先查版本,再查密钥。

← 返回文章列表

评论

…