超 254 万中国网站受影响!Nginx 高危 RCE 漏洞(CVE-2026-42945)已潜伏 18 年

2026 年 5 月 13 日,F5 和安全研究员 depthfirst 公布了一个 Nginx ngx_http_rewrite_module 模块中的堆缓冲区溢出漏洞,编号 CVE-2026-42945,被命名为"NGINX Rift"。攻击者只需发送一个精心构造的 HTTP 请求,就能在未认证的情况下执行任意代码或导致服务崩溃。

这个漏洞为什么值得关注

Nginx 是全球使用最广泛的反向代理和负载均衡器之一。这个漏洞从 2008 年左右就存在于代码中——那时 Nginx 才刚刚被大规模采用。换句话说,过去十几年里部署的绝大多数 Nginx 实例都可能受影响。

项目 详情
漏洞编号 CVE-2026-42945(NGINX Rift)
CVSS 评分 9.2(严重)
漏洞类型 堆缓冲区溢出(Heap Buffer Overflow)
攻击向量 网络(远程)
认证要求 无需认证
影响版本 Nginx 0.6.27 至 1.30.0
修复版本 Nginx 1.30.1+
披露日期 2026 年 5 月 13 日

漏洞原理

问题出在 ngx_http_rewrite_module 模块处理 PCRE(Perl-Compatible Regular Expression)未命名捕获组时的逻辑。当配置同时满足以下条件时会触发:

  • 存在 rewrite 指令,且替换字符串中包含问号 ?
  • 其后紧跟 rewriteifset 指令
  • 后续指令引用了正则表达式的未命名捕获组(如 $1$2

攻击者通过构造特殊的 HTTP 请求 URL,可以让 PCRE 捕获组返回预期之外的内容,进而触发堆缓冲区溢出。这个溢出不需要任何认证,因为 rewrite 规则通常在请求处理的早期阶段执行。

研究人员指出,攻击者可以利用这个溢出可靠地绕过 ASLR(地址空间布局随机化)保护,从而实现远程代码执行。

配置示例

如果你的 Nginx 配置里有类似这样的规则,你就可能受影响:

location / {     rewrite ^/old/(.*)$ /new/$1? break;     set $my_var $1; }

这个配置看起来完全正常,但在 1.30.0 之前的所有版本中都存在被利用的风险。

影响范围

几乎所有还在使用 Nginx 0.6.27 到 1.30.0 版本的服务器都受影响。根据 RunZero 的扫描数据,全球暴露在互联网上的受影响实例超过 975 万,按国家分布如下:

国家/地区 暴露实例数
🇺🇸 美国 5,340,011
🇨🇳 中国 2,540,008
🇩🇪 德国 1,871,780

中国有超过 254 万个暴露在互联网上的 Nginx 实例可能受此漏洞影响,数量位居全球第二。如果你的服务器直接对外提供服务,建议尽快升级。

具体受影响的产品包括:

  • Nginx Open Source:0.6.27 至 1.30.0 全部受影响
  • Nginx Plus:同样受影响,F5 已发布修复版本
  • Linux 发行版打包版本:AlmaLinux、Ubuntu、Red Hat 等均已开始推送修复补丁

考虑到 Nginx 在 Web 服务器和反向代理市场的份额,这个漏洞的影响面相当大。而且因为无需认证就能触发,风险等级被定为 9.2。

如何修复

方案一:升级 Nginx(推荐)

最快的修复方式是升级到已修补的版本。截至 2026 年 5 月 13 日,官方和社区已发布修复版本:

以 AlmaLinux 为例:

# 检查当前版本 nginx -v  # 更新 Nginx sudo yum update nginx  # 重启服务 sudo systemctl restart nginx  # 验证版本 nginx -v

方案二:临时缓解(无法立即升级时)

如果短期内无法升级,可以检查 Nginx 配置中是否存在触发条件,并修改相关规则:

  • 检查所有使用 rewrite 指令且在替换字符串中包含 ? 的配置
  • 确认后续是否有 setifrewrite 引用了未命名捕获组
  • 如有此类配置,考虑改用命名捕获组或调整指令顺序

修复后的配置示例:

location / {     # 使用命名捕获组,避免未命名捕获的溢出     rewrite ^/old/(?<path>.*)$ /new/$path? break; }

注意:这只是降低被利用风险的临时方案,不能替代升级到修复版本。

写在后面

18 年。一个缓冲区溢出漏洞在 Nginx 的核心模块里安静地躺了 18 年才被发现和修复。这说明不了 Nginx 不安全,只能说明代码审查的盲区可以有多深。如果你运维的服务器里有一台还在跑老版本 Nginx,现在是升级的时候了。