AlmaLinux 安全团队在 2026-05-13 披露了一个被命名为 NGINX Rift 的严重漏洞,编号 CVE-2026-42945。它存在于 nginx 的 rewrite 模块中,是一个堆缓冲区溢出(CWE-122),CVSS 4.0 评分 9.2(Critical),CVSS 3.1 为 8.1(High)。
受影响版本范围非常广:0.6.27 到 1.30.0,几乎覆盖了过去十多年所有还在线上跑的 nginx 实例。
漏洞原理
漏洞触发的关键是 rewrite 模块在处理替换字符串时两次遍历的长度计算不一致。
具体条件如下:
- 一条
rewrite指令中,使用了未命名的 PCRE 捕获组(如$1、$2); - 替换字符串里出现了问号
?; - 后面紧跟着另一条
rewrite/if/set指令。
在这种组合下,nginx 第一次扫描时计算出的缓冲区大小,与第二次实际写入时所需的大小对不上。原因在于 +、%、& 等字符在再次转义时会膨胀,导致写操作越过分配的内存边界——这就是经典的堆溢出。
影响
- DoS 路径非常容易触发:根据官方描述,“一个精心构造的请求就能稳定地把目标 worker 进程打崩”。
- RCE 风险:在未启用 ASLR 的系统上,攻击者有可能借此实现远程代码执行。
- AlmaLinux 8 / 9 / 10 全系,只要 nginx 配置中包含易受攻击的 rewrite 写法,就在影响范围内。
对于直接暴露在公网、且 rewrite 规则比较复杂的实例,应该把它当成紧急事件处理。
升级修复
截至 2026-05-14,AlmaLinux 已经在生产仓库中发布了修复包,覆盖范围比 Red Hat 上游更广,连一些已经 EOL 的 nginx stream 也一并打了补丁:
- AlmaLinux 8:默认包与 module streams 1.16 / 1.18 / 1.20 / 1.22 / 1.24
- AlmaLinux 9:默认包与 module streams 1.24 / 1.26
- AlmaLinux 10 / Kitten 10:默认包
执行升级:
sudo dnf clean metadata && sudo dnf upgrade nginx
sudo systemctl restart nginx
临时缓解方案
如果暂时无法升级,可以通过改写配置来规避触发条件:把所有未命名捕获组换成命名捕获组。
漏洞写法:
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2;
缓解写法:
rewrite ^/users/(?<user_id>[0-9]+)/profile/(?<section>.*)$ /profile.php?id=$user_id&tab=$section;
逻辑上等价,但因为绕开了未命名捕获 + ? 的组合,不会再走到那条有 bug 的路径上。
小结
- 漏洞:nginx rewrite 模块堆溢出,CVE-2026-42945
- 影响版本:0.6.27 – 1.30.0
- 风险:单请求即可 DoS,特定条件下可 RCE
- 修复:
dnf upgrade nginx后重启服务 - 临时缓解:把
$1、$2改成命名捕获(?<name>...)
公网暴露的 nginx 实例建议立即升级,内网或反向代理后的实例也尽快安排维护窗口。
关于
本文基于 AlmaLinux 安全公告整理:https://almalinux.org/blog/2026-05-13-nginx-rift-cve-2026-42945/,原文作者 Jonathan Wright(Infrastructure SIG Lead & ALESCo Member)。
关注我获取更多资讯