文章总结: 2026年5月13日披露的nginx严重漏洞CVE-2026-42945(CVSS9.2分)为潜伏18年的堆缓冲区溢出漏洞,存在于ngxhttprewrite_module模块。该漏洞因rewrite引擎在处理含问号的替换字符串时两阶段执行状态不一致导致,攻击者可通过特制HTTP请求在无需认证下实现远程代码执行,影响nginx0.6.27至1.30.0全系版本。建议立即升级至1.31.0/1.30.1或通过将未命名捕获组替换为命名捕获组临时缓解。 综合评分: 98 文章分类: 漏洞预警,应急响应,Web安全
紧急预警!NGINX 曝 18 年老漏洞,CVSS 9.2 分,无需认证直接 RCE,全球数亿服务器受影响
原创
JunYi JunYi
毅心安全
2026年5月14日 14:54 广东
在小说阅读器读本章
去阅读
紧急预警!NGINX 曝 18 年老漏洞,CVSS 9.2 分,无需认证直接 RCE,全球数亿服务器受影响
兄弟们,今天这个漏洞必须单独拉出来说,而且要马上看。
2026 年 5 月 13 日,安全研究机构 depthfirst 联合 F5 披露了一个编号为 CVE-2026-42945 的 NGINX 严重漏洞,CVSS v4.0 评分 9.2 分,漏洞类型是堆缓冲区溢出,可实现无需认证的远程代码执行(RCE)。
更让人头皮发凉的是——这段有问题的代码,从 2008 年起就藏在 NGINX 代码库里了,整整潜伏了 18 年。
下面我们来完整拆解这个漏洞。
漏洞在哪?根源是什么?
漏洞出在 ngx_http_rewrite_module 模块,也就是 NGINX 中负责处理 rewrite 指令的脚本引擎里。
这个引擎在处理 rewrite 规则时,会走两遍执行流程:
- • 第一遍(长度计算):用全零初始化的子引擎,计算输出字符串的长度,然后分配对应大小的内存缓冲区。
- • 第二遍(数据拷贝):用主引擎执行,把数据实际写入第一遍分配好的缓冲区。
问题就出在这两遍之间的状态不一致上:
当 rewrite 指令的替换字符串中含有问号(?)时,引擎内部的 is_args 标志位会被置为 1,但不会在两遍之间重置。
第一遍计算长度时,用的是未转义的原始长度(1个字符 = 1字节)来分配内存;但第二遍实际写数据时,主引擎会对 URI 中的特殊字符进行转义扩展——一个特殊字符可以从 1 字节膨胀到 3 字节(如 %XX 编码)。
结果:实际写入量远超已分配的缓冲区大小,直接造成堆溢出。
攻击者如何利用?
这个漏洞的利用门槛非常低,全链路如下:
第一步:触发漏洞 攻击者无需任何身份认证,只需向目标服务器发送精心构造的 HTTP 请求,命中含有特定 rewrite 配置模式的路由,即可触发堆溢出。
第二步:堆内存布局操控 通过控制连接时序,攻击者可以操纵 NGINX Worker 进程的堆内存布局,为后续的精准覆写做准备。
第三步:注入 Payload,实现 RCE 借助 POST 请求体注入任意二进制载荷,最终实现对 NGINX Worker 进程的远程代码执行。
无需登录,无需账号,一个 HTTP 请求开始,一个 shell 结束。
受影响范围:覆盖极广,不容小觑
| 产品 | 受影响版本 | | — | — | | NGINX Open Source | 0.6.27 ~ 1.30.0 全系 | | NGINX Plus | R32 ~ R36 | | NGINX Instance Manager | 受影响 | | F5 WAF for NGINX | 受影响 | | NGINX App Protect WAF/DoS | 受影响 | | NGINX Gateway Fabric | 受影响 | | NGINX Ingress Controller | 受影响 |
NGINX 是全球使用量最高的 Web 服务器之一,大量部署于云原生 Kubernetes 集群的 Ingress 层和 API 网关场景。这意味着此次暴露面涉及全球数以亿计的生产服务器,企业核心业务、金融系统、电商平台、SaaS 服务……几乎无一幸免。
如何修复?
方案一:立即升级(强烈推荐)
| 产品 | 修复版本 | | — | — | | NGINX Open Source | 升级至 1.31.0 或 1.30.1 | | NGINX Plus | 升级至 R36 P4 或 R32 P6 |
升级后必须重启 NGINX 服务使补丁生效:
# 升级后执行
nginx -v # 确认版本已更新
nginx -t # 检查配置无误
systemctl restart nginx # 重启服务
方案二:暂时无法升级?用命名捕获组规避
如果你的环境当前无法立即升级,可以通过修改 rewrite 配置来消除触发条件——将所有未命名捕获组($1、$2)替换为命名捕获组。
修改前(存在风险):
rewrite ^/foo/(.*)$ /bar/$1? last;
修改后(规避触发):
rewrite ^/foo/(?P<param>.*)$ /bar/${param}? last;
方案三:排查你的配置是否受影响
在服务器上执行以下命令,检索同时含有未命名捕获组与问号替换字符串的 rewrite 指令:
# 检查 NGINX 当前版本
nginx -v
# 搜索有风险的 rewrite 配置(含 $1/$2 且含 ?)
grep -rn 'rewrite' /etc/nginx/ | grep '\$[0-9]' | grep '?'
如果有输出,说明存在风险配置,需要立即处理。
总结一张表
| 项目 | 内容 |
| — | — |
| CVE 编号 | CVE-2026-42945 |
| CVSS 评分 | 9.2(严重) |
| 漏洞类型 | 堆缓冲区溢出 → RCE |
| 触发条件 | 无需认证,特定 rewrite 配置 + 恶意 HTTP 请求 |
| 影响版本 | NGINX 0.6.27 ~ 1.30.0 及多个企业产品 |
| 潜伏时长 | 18 年 (2008年引入) |
| 修复版本 | Open Source 1.31.0/1.30.1,Plus R36 P4/R32 P6 |
| 临时缓解 | 配置中将 $1/$2 替换为命名捕获组 |
| 参考链接 | depthfirst 分析 | NVD |
最后说一句大实话:
NGINX 这次的漏洞,不是偏僻角落里的小功能,是 rewrite——几乎每个稍微复杂点的 NGINX 配置都会用到。暴露面之大,修复的紧迫性之高,在近几年的漏洞里都属于第一梯队。
今天就去检查你的 NGINX 版本,今天就升级。别拖。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:毅心安全 JunYi JunYi《紧急预警!NGINX 曝 18 年老漏洞,CVSS 9.2 分,无需认证直接 RCE,全球数亿服务器受影响》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论