严重的 NGINX 漏洞可导致工作进程崩溃,并可能实现远程代码执行

2026-07-21 11:19:16 1 285

F5 修复了 nginx的严重漏洞 CVE-2026-42533,该漏洞可导致远程未经身份验证的攻击者通过特制 HTTP 请求触发堆缓冲区溢出,造成拒绝服务(DoS),在特定条件下还可能实现远程代码执行(RCE)。 漏洞已在 nginx 1.30.4、1.31.3 和 NGINX Plus 37.0.3.1 中修复,建议受影响用户尽快升级。虽然目前尚未公开利用案例,但研究人员预计 PoC 将于近期发布,及时修补至关重要。



F5 发布的修复程序解决了一个影响 nginx 的严重漏洞。该漏洞允许远程、未经身份验证的攻击者通过精心构造的 HTTP 请求,在工作进程中触发堆缓冲区溢出。编号为 CVE-2026-42533 的漏洞已于 7 月 15 日在 nginx 1.30.4(稳定版)、1.31.3(主线版)以及 NGINX Plus 37.0.3.1 中完成修补;仍在使用更早版本的用户应尽快升级。

成功触发该漏洞可能导致工作进程崩溃或重启,从而造成拒绝服务(DoS)。 F5 表示,在禁止使用地址空间布局随机化(ASLR)或能够绕过 ASLR 的情况下,该漏洞还可能被用于实现远程代码执行(RCE)。

漏洞存在于 nginx 的脚本引擎中,也就是负责在处理请求时根据配置指令动态拼接字符串的代码。只有在特定的配置下才会被触发:使用基于正则表达式的 map,并且该 map 的输出变量在字符串表达式中引用,而字符串表达式又使用了此前正则匹配产生的捕获组。

在这种情况下,脚本引擎的两阶段求值机制会出现问题。第一阶段是负责计算最终结果所需的字节数并分配相应大小的缓冲区;第二阶段则是将数据写入缓冲区。这两个阶段都会读取同一份共享的捕获状态,而在两次处理之间执行 map 的正则表达式匹配时,该共享状态会被覆盖。

因此,第一阶段是根据原始捕获组(例如 location 匹配中的 $1)来计算并分配缓冲区大小,而第二阶段却写入了另一个由攻击者控制、长度不同的捕获结果。最终缓冲区由于容量不足的问题,发生溢出的现象,而且溢出的长度和内容都完全由攻击请求决定。

该漏洞并不会影响所有 nginx 服务器,并且该漏洞是否存在风险是取决于具体配置,而不仅仅是版本的原因。F5 的安全公告指出,除核心服务器和 NGINX Plus 外,NGINX Ingress Controller、Gateway Fabric、App Protect WAF 以及 Instance Manager 也受到影响。不过,截至公告发布时,F5 尚未公布这四款产品的修复版本。

F5 按照 CVSS v4 标准为该漏洞评分 9.2 分,在旧版 CVSS v3.1 标准下评分为 8.1 分,并认为攻击复杂度较高。从 nginx 0.9.6 一直到 1.31.2 的所有版本均受到影响,这一漏洞范围可追溯至 2011 年,当时 map 功能新增了对正则表达式的支持。

CVE-2026-42533 是由十多位研究人员各自独立向 F5 报告的。F5 在公告中感谢了这些研究人员 “独立地将这一问题告知我们”。nginx 官方更新日志则将修复工作的努力归功于 Winfunc Research 的 Mufeed VH 以及维护者 Maxim Dounin。

其中一位报告者 Stan Shaw(以 cyberstan 名义发布研究)发表了一篇比官方公告更为深入的技术分析。F5 认为远程代码执行需要禁用或绕过 ASLR,而 Shaw 则认为,该漏洞本身就能够实现这一绕过。

Shaw 表示,捕获状态被覆盖的问题还存在反向利用方式:当覆盖后的捕获组比原始捕获组更小时,过大的缓冲区会返回未初始化的堆内存数据。在默认安装的 Ubuntu 24.04 系统中,仅需一个未经身份验证的 GET 请求,就可以泄露构造攻击载荷所需的内存地址。



Shaw 表示:“阅读 F5 的公告后,人们会很容易得认为默认系统上该漏洞只能造成拒绝服务攻击,但事实并非如此。”

这一说法比 F5 的官方结论更深入一步。Shaw 表示,在自己的测试结果中成功率达到了100%,不过目前他暂未公开具体的利用细节和概念验证(PoC),因此外界暂时无法独立验证这一结论。

官方修复方案是升级至 nginx 1.30.4、1.31.3 或 NGINX Plus 37.0.3.1。对于暂时无法升级的用户,F5 提出的临时缓解措施是将受影响的正则 map 改为使用命名捕获组。Shaw 表示,这一措施能够阻断主要攻击路径,并覆盖大多数配置场景。

然而,他表示,这种缓解方案依旧留下了一条攻击路径:如果 map 与 location 正则表达式定义了相同名称的命名捕获组,那么仍然可以通过另一条代码路径触发相同的堆缓冲区溢出。他已经使用 AddressSanitizer 验证了这一情况,而 F5 的公告并未提及这一变体。

他说:“升级到 1.30.4 或 1.31.3 才是唯一彻底的修复方案。”

实际存在风险的配置条件较为严格,其中包括必须使用基于正则表达式的 map,并且 map 变量与此前正则表达式产生的编号捕获组(如 $1、$2)共同出现在同一个字符串表达式中,同时捕获组引用位于 map 变量之前。

Shaw 还发布了一款扫描工具,可自动检查 nginx 配置,递归解析 include 文件,并仅标记真正具备可利用条件的配置顺序。该工具不会尝试利用漏洞,但它属于研究人员开发的工具,而非厂商官方的产品。

这是约两个月内公开披露的第三个 nginx 表达式求值代码中的堆缓冲区溢出漏洞。此前分别是 5 月披露的 Rift(CVE-2026-42945),以及几天后公布的 rewrite 模块重叠捕获组漏洞(CVE-2026-9256)。



这三个漏洞本质上属于同一类问题:nginx 的两阶段脚本引擎在第一阶段计算缓冲区大小,在第二阶段写入数据,而每一次都是写入的数据超出了此前计算出的容量。三者的触发原因各不相同,比如,Rift 是由于过期标志位,rewrite 模块漏洞源于重叠捕获组,而此次漏洞则由捕获状态被覆盖导致。但研究人员指出,它们共同暴露出两阶段设计的根本弱点,即脚本引擎过于信任自己第一阶段计算出的缓冲区大小。

截至 7 月 20 日,CVE-2026-42533 尚未被列入 CISA 的 “已知正在被利用漏洞”(KEV)目录,公开的漏洞利用代码也尚未出现。

Shaw 表示,他将在补丁发布 21 天后公开自己的概念验证代码。Rift 漏洞就是一个值得警惕的例子,因为其利用代码在补丁发布后数天内便已公开,随后很快就进行活跃性的攻击。因此,值得尽快升级的真正原因是在此次漏洞的利用代码公开之前完成修补。

F5 已被问及两个问题:一是改用命名捕获组是否能够完全消除 CVE-2026-42533(考虑到 Shaw 提出的变体);二是上述受影响下游产品的修复版本何时会发布。截至文章发表时,F5 尚未作出回应。

PoC: 尚未公开

关于作者

ranran19篇文章46篇回复

评论1次

要评论?请先  登录  或  注册
  • 1楼
    前天 11:19

    这漏洞评分9.2,而且有RCE可能性,不是那种"看看就好"的洞。关键点是它不是默认中招,必须触发特定配置条件——正则map + 捕获组混用。实际受影响的人群没想象中那么多,但中招的基本都是高危。

    直接建议:先确认自己有没有这个配置。 Shaw放了个扫描工具,专门找这种有利用价值的配置顺序,比手动翻配置省事。如果扫出来有风险,别犹豫直接升级。

    升级窗口别拖。 21天后PoC就公开了,Rift那个洞的经验教训还热乎着,补丁出来没几天利用代码就满天飞然后开始有人被打。趁现在没公开赶紧升,别等到时候手忙脚乱。

    临时缓解只当备用。 改命名捕获组能挡一条路,但Shaw说还有变体能绕。F5到现在都没回应这个说法是否属实,说明官方可能还没完全摸清。所以临时缓解就是临时缓解,别当成长久之计。

    关于Ubuntu默认环境就能泄露内存地址这事, 如果Shaw的说法属实,这漏洞比F5官方描述的危险得多。等于不需要任何前置条件,一个GET请求就能搞定信息泄露为后续RCE铺路。这块等21天后PoC出来就能验证了。

    总结就是:先扫配置,有就升,没就继续躺平等着看热闹。