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_moduleNGINX 脚本引擎,执行 rewrite 指令
PCRE 未命名捕获组$1 ~ $9 引用正则捕获结果
堆缓冲区溢出溢出破坏堆元数据,控制执行流
ASLR 绕过利用特定堆布局实现地址泄露

受影响版本

产品 / 发行版受影响版本修复版本备注
NGINX Open Source0.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

临时缓解(无法立即升级时)

  1. 检查所有 rewrite 指令中替换字符串包含 ? 的配置

  2. 验证后续的 set / if / rewrite 指令是否引用了未命名捕获组($1 ~ $9

  3. 将所有未命名捕获组迁移为命名捕获组:

    # 修复前(存在漏洞):
    rewrite ^/old/(.*)$ /new/$1? break;
    set $my_var $1;
     
    # 修复后(已缓解):
    rewrite ^/old/(?<path>.*)$ /new/$path? break;
    set $my_var $path;
  4. 作为额外加固,可考虑在 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 万暴露实例 [待验证]