潜伏 18 年、由 AI 发现的 NGINX rewrite 模块关键漏洞,无需认证即可远程利用。


漏洞概述

项目 内容
CVE 编号 CVE-2026-42945
漏洞名称 NGINX Rift
CWE 分类 CWE-122 — 堆缓冲区溢出(Heap-based Buffer Overflow)
CVSS v4.0 9.2(Critical)
CVSS v3.1 8.1(High) AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H
发现者 DepthFirst Research(使用 AI 代码分析扫描器发现)
发现时间 2026 年 4 月
公开时间 2026 年 5 月 13 日(F5 季度安全更新)
CVE 发布 2026 年 5 月 21 日
在野利用 ✅ 确认 — 披露后 3 天内检测到攻击活动

影响范围

NGINX Open Source

状态 版本范围
受影响 v0.6.27 ~ v1.30.0(2008 年 6 月引入)
已修复 v1.30.1(稳定版)、v1.31.0+(主线版)
不受影响 v0.1.0 ~ v0.6.26(引入前)

NGINX Plus

版本线 受影响版本 修复版本
R32 R32 ~ R32 P5 R32 P6
R33 R33 ~ R33 P5 R33 P6
R34 R34 ~ R34 P4 R34 P5
R35 R35 ~ R35 P1 R35 P2
R36 R36 ~ R36 P3 R36 P4

关联产品(待发布修复)

产品 受影响版本
NGINX Instance Manager 2.16.0 ~ 2.21.1
F5 NGINX WAF 5.9.0 ~ 5.12.1
NGINX Ingress Controller 3.5.0 ~ 3.7.2 / 4.0.0 ~ 4.0.1 / 5.0.0 ~ 5.4.1
NGINX Gateway Fabric 1.3.0 ~ 1.6.2 / 2.0.0 ~ 2.5.1
NGINX Agent 2.0.0 ~ 2.35.0

漏洞原理

根因:两遍脚本引擎大小计算不匹配

NGINX rewrite 模块使用两遍脚本引擎src/http/ngx_http_script.c):

  1. Length Pass(长度计算阶段) — 计算输出缓冲区所需的总字节数(使用 e->is_args = 0
  2. Copy/Write Pass(写入阶段) — 将实际内容写入预分配的缓冲区

漏洞触发流程:

  1. rewrite 指令的替换字符串中包含 ?(查询字符串分隔符)
  2. ngx_http_script_start_args_code 在写入阶段将 e->is_args 设为 1,但在长度计算阶段未设置
  3. 导致长度计算阶段分配的缓冲区过小
  4. 写入阶段对查询参数执行 URI 编码转义(将 +&% 等字符扩展为多字节序列)时,写入超出堆边界

触发条件

漏洞利用需要同时满足三个条件

  1. rewrite 指令的替换字符串中包含 ?
  2. 后续的 rewriteifset 指令引用了未命名的 PCRE 捕获组$1$2 等)
  3. 请求 URI 中包含大量可转义字符(+&%

触发示例(有漏洞的配置)

server {
    listen 80;
    server_name example.com;

    location ~ ^/api/(.*)$ {
        # ❌ 替换字符串包含 ?,且后续引用了未命名捕获 $1
        rewrite ^/api/(.*)$ /internal?migrated=true;
        set $original_endpoint $1;  # 引用未命名捕获
    }
}

安全配置替代方案

# ✅ 使用命名捕获代替未命名捕获
location ~ ^/api/(?<endpoint>.*)$ {
    rewrite ^/api/(?<endpoint>.*)$ /internal?migrated=true;
    set $original_endpoint $endpoint;  # 使用命名捕获
}

漏洞影响

影响 说明
拒绝服务(DoS) 可靠利用 — 工作进程崩溃,无需依赖 ASLR 状态
远程代码执行(RCE) ⚠️ 早期认为仅当 ASLR 禁用时可行;但后续 PoC 已包含 ASLR 绕过链
攻击方式 单次精心构造的 HTTP 请求,无需认证,无需前置访问
影响广度 所有使用 rewrite 模块的 NGINX 实例(默认编译即包含)

ASLR 绕过

尽管早期报告指出 RCE 仅在 ASLR 禁用时可行,后续公开发布的 PoC 包含 ASLR 绕过链:将 NGINX 堆溢出与同主机本地文件包含(LFI)/ 任意文件读取原语结合,实现无需禁用 ASLR 的未认证 RCE


修复与缓解措施

方案一:升级 NGINX(强烈推荐)

# Ubuntu/Debian(使用官方源或镜像源)
sudo apt update
sudo apt install -y nginx=1.30.1-*
# 或升级到主线版 1.31.x

# CentOS/RHEL
sudo dnf update nginx

# 验证版本
nginx -v
# 应输出 ≥ 1.30.1(稳定版)或 ≥ 1.31.0(主线版)

方案二:Docker 容器升级

# 拉取最新 NGINX 镜像
docker pull nginx:1.30.1
# 或使用主线版
docker pull nginx:1.31

# 重新创建容器
docker-compose up -d --build

方案三:配置缓解(无法立即升级时)

  1. 将所有未命名捕获替换为命名捕获

    # 修改前(有漏洞)
    rewrite ^/users/(.*)$ /profile?user=$1 last;
    
    # 修改后(安全)
    rewrite ^/users/(?<username>.*)$ /profile?user=$username last;
    
  2. 移除 rewrite 指令中的 ? 查询参数

    # 将查询参数移到 proxy_pass 或其他指令中
    rewrite ^/api/(.*)$ /internal last;
    # 在代理目标中传递参数
    
  3. 确保 ASLR 已启用

    # 检查 ASLR 状态(应返回 2)
    cat /proc/sys/kernel/randomize_va_space
    # 2 = 完全随机化(启用)
    

方案四:使用 WAF 规则拦截

可部署 ModSecurity 或其他 WAF 规则,拦截包含大量可转义字符及触发 rewrite 配置模式的恶意请求。


同批次修复的其他漏洞

2026 年 5 月 F5 安全更新中一并修复的漏洞:

CVE 编号 组件 CVSS 类型
CVE-2026-42946 ngx_http_scgi_module / ngx_http_uwsgi_module 8.3 缓冲区过读
CVE-2026-42934 ngx_http_charset_module 6.3 越界读取
CVE-2026-40460 HTTP/3 (QUIC) 地址欺骗
CVE-2026-40701 ngx_http_ssl_module (OCSP) 6.3 Use-After-Free
CVE-2026-42926 ngx_http_proxy_module (HTTP/2) 请求注入

时间线

日期 事件
2008 年 6 月 漏洞代码被引入 NGINX 代码库
2026 年 4 月 DepthFirst Research 使用 AI 扫描器发现漏洞
2026 年 4 月 21 日 向 F5 负责任披露
2026 年 5 月 13 日 F5 发布安全更新修补漏洞
2026 年 5 月 16 日 检测到在野利用活动
2026 年 5 月 21 日 CVE 编号正式发布,公众 PoC 公开

参考资料