NGINX Rift:ngx_http_rewrite_module 堆缓冲区溢出远程代码执行漏洞
文档版本:v1.0 · 更新日期:2026-05-18 适用对象:安全工程师、运维团队、Web 服务管理员
漏洞速览
| 属性 | 值 |
|---|---|
| CVE 编号 | CVE-2026-42945 |
| 漏洞别名 | NGINX Rift |
| CVSS 评分 | 9.2 CRITICAL (CVSS v4) |
| 漏洞类型 | 堆缓冲区溢出 Heap Buffer Overflow (CWE-122) |
| 攻击向量 | 网络 Network (AV:N) |
| 权限要求 | 无需认证 None (PR:N) |
| 用户交互 | 不需要 None (UI:N) |
| 公开日期 | 2026-05-13 |
| PoC 状态 | 已公开(攻击者仅需构造特殊 HTTP 请求) |
| 补丁版本 | NGINX >= 1.30.1 / NGINX Plus 已发布修复 |
| 临时缓解 | 检查并修改 rewrite 配置(使用命名捕获组) |
| 发现方 | depthfirst(AI 安全分析公司,AI 仅 6 小时自主扫描发现) |
| 潜伏时长 | 18 年(2008 ~ 2026) |
关键时间线:
~2008 漏洞引入 (NGINX 0.6.27)
↓
2026-05-13 F5 与 depthfirst 公开披露
2026-05-13 同日发布修复版本 1.30.1
↓
各发行版陆续推送 AlmaLinux / RHEL / Ubuntu / Debian 发布修复包
漏洞简介
NGINX 是全球使用最广泛的反向代理和负载均衡服务器,支撑着全球约三分之一的网站。CVE-2026-42945 由 AI 安全公司 depthfirst 在仅 6 小时的自主扫描中发现,揭示了该漏洞在 NGINX 源代码中已潜伏长达 18 年(自约 2008 年发布的 NGINX 0.6.27 起)。
该漏洞位于 ngx_http_rewrite_module 模块对 PCRE(Perl 兼容正则表达式)未命名捕获组的处理逻辑中。rewrite 正则表达式引擎中的状态机处理缺陷导致堆缓冲区溢出,攻击者仅需发送特制的 HTTP 请求,即可在无需认证的情况下实现远程代码执行(RCE)或拒绝服务(DoS)。
据 RunZero 扫描数据 [待验证],全球约有 1900 万暴露实例受到影响:美国约 534 万,中国约 254 万,德国约 187 万。受影响版本涵盖 NGINX Open Source 0.6.27 至 1.30.0、NGINX Plus 以及所有 Linux 发行版打包版本。由于无需认证且 rewrite 规则在请求处理早期即被执行,该漏洞风险等级被评为 9.2(Critical)。
值得注意的是,该漏洞可稳定绕过 ASLR(地址空间布局随机化)保护,实现可靠的远程代码执行,极大提升了实际利用的危害性。
技术原理
漏洞利用链
┌───────────────────────────────────────────────────────────────┐
│ 1. 配置触发条件 │
│ rewrite 指令的替换字符串中包含 "?",随后紧跟引用未命名 │
│ 捕获组($1, $2, ..., $9)的 rewrite/if/set 指令 │
├───────────────────────────────────────────────────────────────┤
│ 2. 攻击者构造特制 HTTP 请求 URL │
├───────────────────────────────────────────────────────────────┤
│ 3. PCRE 捕获组返回非预期内容 │
├───────────────────────────────────────────────────────────────┤
│ 4. ngx_http_rewrite_module 脚本引擎发生堆缓冲区溢出 │
├───────────────────────────────────────────────────────────────┤
│ 5. 溢出破坏相邻堆元数据或关键结构 │
├───────────────────────────────────────────────────────────────┤
│ 6. 攻击者稳定绕过 ASLR │
├───────────────────────────────────────────────────────────────┤
│ 7. 无需认证实现远程代码执行(RCE) │
└───────────────────────────────────────────────────────────────┘
存在漏洞的配置示例
location / {
rewrite ^/old/(.*)$ /new/$1? break;
set $my_var $1;
}在上述配置中,rewrite 指令的替换字符串 /new/$1? 末尾带有问号,其后的 set 指令引用了未命名捕获组 $1。当攻击者发送特制请求时,PCRE 捕获组处理的状态机逻辑出错,导致堆缓冲区溢出。
修复方式
使用命名捕获组或调整指令顺序:
location / {
rewrite ^/old/(?<path>.*)$ /new/$path? break;
set $my_var $path;
}涉及关键组件
| 组件 | 角色 |
|---|---|
ngx_http_rewrite_module | NGINX 脚本引擎,执行 rewrite 指令 |
| PCRE 未命名捕获组 | $1 ~ $9 引用正则捕获结果 |
| 堆缓冲区溢出 | 溢出破坏堆元数据,控制执行流 |
| ASLR 绕过 | 利用特定堆布局实现地址泄露 |
受影响版本
| 产品 / 发行版 | 受影响版本 | 修复版本 | 备注 |
|---|---|---|---|
| NGINX Open Source | 0.6.27 ~ 1.30.0 | >= 1.30.1 | 影响跨度约 18 年的所有版本 |
| NGINX Plus | 受影响 | F5 已发布修复 (K000161019) | 联系 F5 获取修复版本 |
| AlmaLinux / RHEL 打包 nginx | 受影响版本 | 通过 yum update 升级 | 发行版已推送安全更新 |
| Ubuntu 打包 nginx | 受影响版本 | 通过 apt 升级 | 发行版已推送安全更新 |
| Debian 打包 nginx | 受影响版本 | 已修复 | 发行版已推送安全更新 |
| NGINX < 0.6.27 | 不适用 | 不适用 | 不受影响(漏洞尚未引入) |
漏洞影响场景
场景一:面向公网的 Web 服务器被远程控制
攻击者向运行 NGINX 的公网服务器发送特制 HTTP 请求 → 触发堆缓冲区溢出 → 实现 RCE → 完全控制服务器。受影响服务器约 1900 万台,攻击面极大。
场景二:反向代理 / 负载均衡器被攻陷
NGINX 作为反向代理部署在内部网络边界,一旦被攻破,攻击者可透过 NGINX 访问后端内部网络资源,形成横向移动跳板。
场景三:CDN / API 网关级连锁影响
NGINX 广泛用于 CDN 边缘节点和 API 网关基础设施,若被攻陷可能导致大规模下游服务受影响,波及范围呈指数级放大。
场景四:拒绝服务攻击
攻击者通过构造特定请求导致 NGINX worker 进程崩溃,造成服务中断。由于无需认证,攻击成本极低,可轻易发起大规模 DoS 攻击。
修复措施
推荐修复(根本解决)
升级 NGINX 至修复版本:
# 检查当前版本
nginx -v
# ── 官方 NGINX ──
# 从 nginx.org 下载或通过包管理器安装 1.30.1+
# ── AlmaLinux / RHEL ──
sudo yum update nginx
sudo systemctl restart nginx
# ── Ubuntu / Debian ──
sudo apt update && sudo apt upgrade nginx
sudo systemctl restart nginx
# ── 验证版本 ──
nginx -v # 应显示 >= 1.30.1临时缓解(无法立即升级时)
-
检查所有
rewrite指令中替换字符串包含?的配置 -
验证后续的
set/if/rewrite指令是否引用了未命名捕获组($1~$9) -
将所有未命名捕获组迁移为命名捕获组:
# 修复前(存在漏洞): rewrite ^/old/(.*)$ /new/$1? break; set $my_var $1; # 修复后(已缓解): rewrite ^/old/(?<path>.*)$ /new/$path? break; set $my_var $path; -
作为额外加固,可考虑在 WAF 层添加规则过滤针对 rewrite 逻辑的可疑 URL 模式
⚠️ 注意:临时缓解方案仅降低攻击面,无法完全防御所有绕过变体,强烈建议尽快升级至修复版本。
一键检查与执行临时修复脚本
检查脚本
#!/bin/bash
# NGINX Rift (CVE-2026-42945) 配置扫描脚本
# 用途:检测 nginx 配置中可能受漏洞影响的 rewrite 模式
echo "============================================"
echo " NGINX Rift (CVE-2026-42945) 配置扫描"
echo "============================================"
echo ""
# 1. 检查 nginx 版本
echo "[1/3] 检查 nginx 版本..."
if command -v nginx &> /dev/null; then
NGINX_VER=$(nginx -v 2>&1 | grep -oP '\d+\.\d+\.\d+')
echo " → 当前版本:$NGINX_VER"
if [[ "$NGINX_VER" < "1.30.1" ]]; then
echo " ⚠ 版本存在漏洞!建议升级至 >= 1.30.1"
else
echo " ✓ 版本安全"
fi
else
echo " ✗ 未检测到 nginx"
exit 1
fi
echo ""
# 2. 检测 nginx 配置文件目录
echo "[2/3] 定位 nginx 配置目录..."
NGINX_CONF_DIR="/etc/nginx"
if [ ! -d "$NGINX_CONF_DIR" ]; then
echo " ✗ 未找到 /etc/nginx 目录,请手动检查"
exit 1
fi
echo " → 配置目录:$NGINX_CONF_DIR"
echo ""
# 3. 扫描可能存在漏洞的 rewrite 模式
echo "[3/3] 扫描可能存在漏洞的 rewrite 模式..."
echo " → 检测 rewrite 中替换字符串包含 '?' 的配置:"
echo "----------------------------------------"
grep -rn 'rewrite.*\$[0-9].*\?' "$NGINX_CONF_DIR" 2>/dev/null || echo " 未发现匹配模式"
echo "----------------------------------------"
echo ""
echo " → 检测引用未命名捕获组的指令:"
echo "----------------------------------------"
grep -rn '\$[0-9]' "$NGINX_CONF_DIR" 2>/dev/null | grep -v 'location'
echo "----------------------------------------"
echo ""
echo "扫描完成。如有匹配结果,请逐一检查相关配置是否存在漏洞。"NGINX 配置扫描(非标准 Shell 修复)
由于此漏洞位于 NGINX 应用层而非内核层,临时修复的核心在于配置检查与修正。以下命令可快速定位潜在风险配置:
# 检测 rewrite 指令中替换字符串包含 "?" 且引用 $1~$9 的模式
grep -rn 'rewrite.*\$[0-9].*\?' /etc/nginx/
# 检测所有引用未命名捕获组的指令(排除 location 块首行)
grep -rn '\$[0-9]' /etc/nginx/ | grep -v 'location'参考资源
| 资源 | 链接 |
|---|---|
| NVD 漏洞详情 | https://nvd.nist.gov/vuln/detail/CVE-2026-42945 |
| NGINX 官方安全公告 | https://nginx.org/en/security_advisories.html |
| F5 K000161019 (NGINX Plus) | https://my.f5.com/manage/s/article/K000161019 |
| depthfirst 披露详情 | [待验证具体 URL] |
| RunZero 暴露扫描数据 | 全球约 1900 万暴露实例 [待验证] |