NGINX 曝严重 RCE 漏洞:潜伏代码库 18 年,全球数亿服务器面临风险

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.01.30.1
  • NGINX Plus 用户应升级至 R36 P4R32 P6
  • 升级后需重启服务使补丁生效

临时缓解措施

对于暂时无法升级的用户,可通过以下方式规避触发条件:将配置中所有未命名捕获组($1$2 等)替换为命名捕获组(如 ?<name>pattern 语法)。

排查建议

  1. 确认已安装的 NGINX 版本是否在受影响区间(0.6.27 - 1.30.0)
  2. 在配置文件中检索同时含有未命名捕获组与问号替换字符串的 rewrite 指令
  3. 优先处理暴露在公网的 Ingress 和 API 网关节点

影响判断

一个潜伏 18 年的漏洞被披露,影响面覆盖了从 0.6.27 到 1.30.0 的几乎所有 NGINX 版本。考虑到 NGINX 在全球 Web 服务器和反向代理市场的主导地位(尤其在 Kubernetes Ingress 和微服务 API 网关场景中),这个漏洞的实际威胁等级与它的 CVSS 评分相符。

临时缓解方案(替换未命名捕获组)虽然简单,但在大型分布式部署中全面排查和修改配置文件需要时间。建议运维团队优先关注公网暴露面的 NGINX 实例,尽快完成版本升级。

来源:Depthfirst · NVD

相关推荐