CVE-2026-42945 — "NGINX Rift" 堆缓冲区溢出漏洞
潜伏 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):
- Length Pass(长度计算阶段) — 计算输出缓冲区所需的总字节数(使用
e->is_args = 0) - Copy/Write Pass(写入阶段) — 将实际内容写入预分配的缓冲区
漏洞触发流程:
- rewrite 指令的替换字符串中包含
?(查询字符串分隔符) ngx_http_script_start_args_code在写入阶段将e->is_args设为1,但在长度计算阶段未设置- 导致长度计算阶段分配的缓冲区过小
- 写入阶段对查询参数执行 URI 编码转义(将
+、&、%等字符扩展为多字节序列)时,写入超出堆边界
触发条件
漏洞利用需要同时满足三个条件:
- rewrite 指令的替换字符串中包含
? - 后续的
rewrite、if或set指令引用了未命名的 PCRE 捕获组($1、$2等) - 请求 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
方案三:配置缓解(无法立即升级时)
将所有未命名捕获替换为命名捕获
# 修改前(有漏洞) rewrite ^/users/(.*)$ /profile?user=$1 last; # 修改后(安全) rewrite ^/users/(?<username>.*)$ /profile?user=$username last;移除 rewrite 指令中的
?查询参数# 将查询参数移到 proxy_pass 或其他指令中 rewrite ^/api/(.*)$ /internal last; # 在代理目标中传递参数确保 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 公开 |
参考资料
💬 评论