2026 年 5 月 13 日,安全研究机构 depthfirst 与 F5 联合披露了 NGINX 中一个编号为 CVE-2026-42945 的严重漏洞,CVSS v4.0 评分达 9.2。该漏洞属于堆缓冲区溢出类型,存在于 ngx_http_rewrite_module 模块中,最早可追溯至 2008 年引入的代码逻辑,在代码库中潜伏长达 18 年。Depthfirst 将该漏洞命名为 "NGINX Rift"。
漏洞技术原理
该漏洞的根源在于 NGINX rewrite 指令的脚本引擎两遍执行流程中的状态不一致。rewrite 引擎在处理替换字符串时,分两遍执行:第一遍用于计算输出长度并分配缓冲区,第二遍执行实际的数据拷贝。
当 rewrite 指令的替换字符串中含有问号(?)时,引擎内部的 is_args 标志位会被置为 1 且不会在后续处理中重置。这个未传播的标志位导致了关键的不一致:
- 第一遍(长度计算):使用全零初始化的子引擎执行,
is_args为 0,按未转义的 URI 长度分配内存缓冲区。 - 第二遍(数据拷贝):在主引擎上执行,
is_args为 1,引擎会对 URI 中的特殊字符进行转义扩展处理,每个字符可由 1 字节膨胀至 3 字节(如空格 →%20)。
实际写入量超出已分配的缓冲区大小,造成堆缓冲区溢出。

攻击链分析
该漏洞的利用条件相对宽松:
- 无需身份认证:攻击者只需向含有特定 rewrite 配置模式的服务器发送精心构造的 HTTP 请求即可触发。
- 堆布局操纵:攻击者通过控制连接时序实施堆内存布局操纵(heap feng shui),提高利用可靠性。
- 载荷注入:借助 POST 请求体注入任意二进制载荷。
- 代码执行:最终实现对 NGINX Worker 进程的远程代码执行。
触发条件需要目标服务器的 NGINX 配置中同时满足:使用未命名捕获组($1、$2 等)的 rewrite 指令,且替换字符串中包含问号。在常见的 K8s Ingress 和 API 网关配置中,这类模式并不少见。
受影响范围
受影响版本覆盖范围极广:
- NGINX Open Source 0.6.27 至 1.30.0 全系
- NGINX Plus R32 至 R36
- NGINX Instance Manager 2.16.0 至 2.21.1
- F5 WAF for NGINX 5.9.0 至 5.12.1
- NGINX App Protect WAF 4.9.0 至 4.16.0 和 5.1.0 至 5.8.0
- F5 DoS for NGINX
- NGINX Gateway Fabric
- NGINX Ingress Controller
由于上述产品被大量部署于云原生 Kubernetes 集群的 Ingress 层及 API 网关场景,实际暴露面涉及全球数以亿计的生产服务器。
修复与缓解
官方修复版本
- NGINX Open Source 用户应升级至 1.31.0 或 1.30.1
- NGINX Plus 用户应升级至 R36 P4 或 R32 P6
- 升级后需重启服务使补丁生效
临时缓解措施
对于暂时无法升级的用户,可通过以下方式规避触发条件:将配置中所有未命名捕获组($1、$2 等)替换为命名捕获组(如 ?<name>pattern 语法)。
排查建议
- 确认已安装的 NGINX 版本是否在受影响区间(0.6.27 - 1.30.0)
- 在配置文件中检索同时含有未命名捕获组与问号替换字符串的 rewrite 指令
- 优先处理暴露在公网的 Ingress 和 API 网关节点
影响判断
一个潜伏 18 年的漏洞被披露,影响面覆盖了从 0.6.27 到 1.30.0 的几乎所有 NGINX 版本。考虑到 NGINX 在全球 Web 服务器和反向代理市场的主导地位(尤其在 Kubernetes Ingress 和微服务 API 网关场景中),这个漏洞的实际威胁等级与它的 CVSS 评分相符。
临时缓解方案(替换未命名捕获组)虽然简单,但在大型分布式部署中全面排查和修改配置文件需要时间。建议运维团队优先关注公网暴露面的 NGINX 实例,尽快完成版本升级。
来源:Depthfirst · NVD