Skip to main content

重要/漏洞:NGINX Rift / NGINX ngx_

  1. 重要/漏洞:NGINX Rift / NGINX ngx_http_rewrite_module 堆缓冲区存在溢出漏洞

    漏洞编号:CVE-2026-42945
    重要等级:重要[需要关注的]
    CVSS 分数:CVSS v4.0:9.2 Critical;CVSS v3.1:8.1 High
    注:NGINX 官方安全页将该项标注为 medium,但 F5/CNA 与 NVD 记录显示其在特定条件下可导致高危影响。

    影响范围:
    NGINX Open Source 0.6.27 至 1.30.0 受影响,1.30.1 与 1.31.0 及以上版本不受影响。

    NGINX Plus R32 至 R36 也在公开影响范围内;部分基于 NGINX 的 F5/NGINX 产品,如 NGINX Instance Manager、F5 WAF for NGINX、NGINX App Protect、NGINX Gateway Fabric、NGINX Ingress Controller 等也被列入影响范围。


    触发条件:
    受影响版本的 NGINX 配置中同时存在以下模式时风险较高:
    1. 使用 rewrite 指令;
    2. rewrite 的替换字符串中包含问号 ?;
    3. 后续同一作用域内跟随 rewrite、if 或 set 指令;
    4. 使用未命名 PCRE 捕获组变量,如 $1、$2。


    漏洞原理:
    该漏洞源于 NGINX ngx_http_rewrite_module 中脚本引擎的状态传递不一致。当 rewrite 的 replacement 中包含 ? 时,主脚本引擎会进入 query string 参数处理状态,即设置 is_args = 1。随后如果 set 等复杂值处理逻辑引用 $1、$2 这类捕获组,NGINX 会先进行长度计算,再进行实际拷贝。问题在于长度计算阶段使用的是一个重新初始化的子引擎,该子引擎没有继承 is_args 状态,因此按原始长度分配缓冲区;而实际拷贝阶段仍在主引擎上执行,会按 query args 转义规则写入数据,导致部分字符被扩展为 %XX 形式,最终写入长度大于分配长度,形成堆缓冲区溢出。


    漏洞概述:
    攻击者在无需认证的情况下,只要能够向满足触发条件的 NGINX 服务发送特制 HTTP 请求,就可能触发 NGINX worker 进程中的堆内存破坏。根据 NVD/F5 描述,该漏洞可导致 worker 进程堆缓冲区溢出和重启;在 ASLR 关闭的系统上,存在代码执行可能。

    DepthFirst 的技术分析进一步说明,在特定实验环境中,该堆溢出可被构造成对 NGINX 内存池 cleanup 链表的劫持,从而证明其具备 RCE 可利用性;但在真实环境中,稳定 RCE 还依赖地址随机化绕过、堆布局控制等额外条件。


    风险描述:
    1. 攻击者可通过构造恶意 URI 触发 NGINX worker 进程堆溢出,造成 worker 崩溃或反复重启,影响业务可用性。
    2. 在 ASLR 关闭或被绕过的环境中,漏洞存在进一步发展为远程代码执行的风险。
    3. 暴露在公网的反向代理、API 网关、Ingress Controller、边缘代理服务风险更高,因为攻击面位于 HTTP 请求处理路径,不依赖控制台或管理面暴露。
    4. 使用复杂 rewrite/set 配置、历史遗留 API 路由迁移配置、Ingress 自动生成 rewrite 规则的环境,需要重点排查。


    影响组件:
    NGINX ngx_http_rewrite_module,以及依赖该模块并满足触发配置条件的 NGINX Open Source、NGINX Plus 和相关 F5/NGINX 产品。


    处置建议:
    1. 优先升级至 NGINX Open Source 1.30.1 stable 或 1.31.0 mainline 及以上版本,并在升级后重启或 reload NGINX worker,确保新二进制生效。
    2. 如暂时无法升级,建议将未命名捕获组 $1、$2 改为命名捕获组,并避免在同一 rewrite 作用域中让包含 ? 的 replacement 影响后续 complex value 处理。
    3. 保持 ASLR 启用,ASLR 虽然不能修复漏洞本身,但可显著提高从 worker 崩溃进一步发展为稳定代码执行的难度。


    参考来源: CVE-2026-42945