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指令,且替换字符串中包含问号? - 其后紧跟
rewrite、if或set指令 - 后续指令引用了正则表达式的未命名捕获组(如
$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 日,官方和社区已发布修复版本:
- 官方 Nginx:升级到 1.30.1 或更高版本
- Nginx Plus:参考 F5 公告 K000161019 获取对应分支的修复版本
- AlmaLinux / RHEL:已推送至测试仓库,运行
yum update nginx安装
以 AlmaLinux 为例:
# 检查当前版本 nginx -v # 更新 Nginx sudo yum update nginx # 重启服务 sudo systemctl restart nginx # 验证版本 nginx -v
方案二:临时缓解(无法立即升级时)
如果短期内无法升级,可以检查 Nginx 配置中是否存在触发条件,并修改相关规则:
- 检查所有使用
rewrite指令且在替换字符串中包含?的配置 - 确认后续是否有
set、if或rewrite引用了未命名捕获组 - 如有此类配置,考虑改用命名捕获组或调整指令顺序
修复后的配置示例:
location / { # 使用命名捕获组,避免未命名捕获的溢出 rewrite ^/old/(?<path>.*)$ /new/$path? break; }
注意:这只是降低被利用风险的临时方案,不能替代升级到修复版本。
写在后面
18 年。一个缓冲区溢出漏洞在 Nginx 的核心模块里安静地躺了 18 年才被发现和修复。这说明不了 Nginx 不安全,只能说明代码审查的盲区可以有多深。如果你运维的服务器里有一台还在跑老版本 Nginx,现在是升级的时候了。