文章总结: NGINX爆出堆溢出高危漏洞CVE-2026-42945,影响0.6.27至1.30.0版本,攻击者可利用未命名捕获组与问号组合的rewrite规则实现RCE。文档开源了NGINXRift自查工具,支持远程扫描与本地配置审计,并给出命名捕获组替换、版本升级、隐藏版本号等修复方案,建议立即排查风险。 综合评分: 88 文章分类: 漏洞分析,解决方案,安全工具,漏洞预警,WEB安全
NGINX 爆出堆溢出高危漏洞,可致 RCE!我们开源了一款自查工具
原创
iak3ec iak3ec
薛定谔的安全
2026年5月25日 17:28 江苏
在小说阅读器读本章
去阅读
NGINX 爆出堆溢出高危漏洞,可致 RCE!我们开源了一款自查工具
前言
近日,NGINX 官方披露了一个存在于 ngx_http_rewrite_module 中的堆溢出漏洞(CVE-2026-42945),影响范围涵盖 NGINX 开源版 0.6.27 至 1.30.0 以及 NGINX Plus 商业版 R32 至 R36。
该漏洞一旦被利用,攻击者可实现拒绝服务(DoS)甚至远程代码执行(RCE),对使用 NGINX 作为反向代理或负载均衡器的互联网基础设施构成严重威胁。
为帮助广大安全运维人员快速排查风险,我们第一时间开发并开源了 NGINX Rift 漏洞扫描与验证工具,支持远程指纹识别和本地深度配置审计。
一、漏洞原理:一个问号引发的”灾难”
CVE-2026-42945 的根因在于 NGINX 处理 rewrite 规则时,对未命名捕获组反向引用(如 $1、$2)的内存拷贝逻辑存在缺陷。当替换字符串中同时包含 ?(查询字符串分隔符)和未命名捕获组引用时,内部的堆缓冲区拷贝操作可能越界写入。
触发条件(三者缺一不可)
- NGINX 配置中存在
rewrite指令 - 替换 URL 中包含
?字符 - 替换 URL 中使用了
$1、$2等未命名捕获组引用
存在漏洞的配置
# 危险!同时包含 ? 和 $1 未命名捕获组
rewrite ^/api/(.*)$ /internal?id=$1 last;
安全的配置写法
# 安全:使用命名捕获组 <myid> 替代 $1
rewrite ^/api/(?<myid>.*)$ /internal?id=$myid last;
为什么命名捕获组是安全的?因为 NGINX 内部对命名捕获组(?<name>)和未命名捕获组($1)走了完全不同的代码路径,命名版本不涉及触发溢出的那段内存拷贝逻辑。
二、影响范围
| 组件 | 受影响版本 | 修复版本 | | — | — | — | | NGINX 开源版 | 0.6.27 ~ 1.30.0 | 1.30.1 (stable) / 1.31.0 (mainline) | | NGINX Plus 商业版 | R32 ~ R36 | R32 P6, R33 P4, R34 P4, R35 P3, R36 P4 | | NGINX Ingress Controller | 多个版本线受影响 | v1.9.6+, v1.10.2+, 3.7.3, 4.0.2, 5.4.2 |
一个容易踩的坑:版本号 ≠ 是否安全
很多运维同学看到自己服务器上 nginx -v 显示的版本号比较老,就认为一定存在漏洞。但实际上,Linux 发行版(Ubuntu、CentOS 等)的包管理器经常会对旧版本进行 Backport(向后移植)补丁修复。
也就是说,你的 NGINX 版本号可能是 1.18.0,但 Canonical 或 Red Hat 已经在 1.18.0-0ubuntu1.4 这样的包版本中悄悄修补了 CVE-2026-42945。
所以,判断是否安全,不能只看版本号,还要检查 OS 包的补丁状态。
三、NGINX Rift:一键自查
为了帮助大家快速确认自身环境的风险状态,我们开发了 NGINX Rift 工具,提供两种检测模式。
模式一:远程扫描 (Scan)
适用于批量摸排互联网资产。工具会向目标发送 HTTP 请求,解析 Server 响应头中的 NGINX 版本号,判断是否在受影响范围内。
# 扫描单个目标
./nginx_rift_scanner scan -u http://your-target.com
# 批量扫描(从文件读取)
./nginx_rift_scanner scan -f targets.txt
批量扫描完成后,工具会输出分类汇总:哪些目标存在风险、哪些安全、哪些连接失败。
模式二:本地深度验证 (Verify)
适用于登录到服务器后的深度自查。工具会执行三步立体审计:
第一步:二进制版本检测 + OS 补丁回溯检查
运行 nginx -v 获取版本号,然后调用 dpkg-query(Debian/Ubuntu)或 rpm --changelog(CentOS/RHEL)检查系统包是否已包含 CVE-2026-42945 的修复补丁。
第二步:配置文件语义分析
递归解析 NGINX 配置文件(包括所有 include 引入的子配置),精准识别包含 ? 和 $1 的危险 rewrite 规则。
第三步:K8s Ingress 资源探测
如果服务器上安装了 kubectl,工具会自动获取集群中所有 Ingress 资源,检查是否存在危险的 rewrite-target 注解配置。
# 自动查找默认配置路径
./nginx_rift_scanner verify
# 指定配置文件
./nginx_rift_scanner verify -p /etc/nginx/nginx.conf
四、修复方案
根据你的环境和条件,可以选择以下方案:
方案一:紧急配置缓解(推荐,零停机)
如果你无法立即升级 NGINX,可以在不重启服务的情况下修改配置:
# 修改前(存在漏洞)
rewrite ^/api/(.*)$ /internal?id=$1 last;
# 修改后(安全)
rewrite ^/api/(?<myid>.*)$ /internal?id=$myid last;
修改后执行 nginx -t && nginx -s reload 即可生效,完全不影响线上服务。
方案二:操作系统包管理器更新
# Ubuntu / Debian
sudo apt-get update && sudo apt-get upgrade nginx
# CentOS / RHEL
sudo yum update nginx
更新后建议使用 NGINX Rift 的 verify 模式确认补丁已生效。
方案三:源码编译升级
从 NGINX 官方下载 1.30.1+ 或 1.31.0+ 版本重新编译安装。商业版用户升级至对应的安全补丁版本。
方案四:云原生 K8s 环境
排查所有 Ingress 资源中的 rewrite-target 注解,升级 NGINX Ingress Controller 至安全版本。
方案五:纵深防御
无论是否受漏洞影响,建议在 http 块中添加:
server_tokens off;
隐藏版本号,增加攻击者的侦察成本。
五、下载地址
关注微信公众号,私信发送NGINX-Rift或CVE-2026-42945获取项目地址
总结
CVE-2026-42945 是一个影响范围极广的 NGINX 高危漏洞,但好在触发条件明确、配置缓解手段简单。我们建议所有使用 NGINX 的团队:
- 立即使用 NGINX Rift 扫描,确认自身风险状态
- 优先采用命名捕获组替代未命名捕获组,零成本消除攻击面
- 尽快升级至官方修复版本
- 开启
server_tokens off,做好纵深防御
安全无小事,防患于未然。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:薛定谔的安全 iak3ec iak3ec《NGINX 爆出堆溢出高危漏洞,可致 RCE!我们开源了一款自查工具》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论