资讯 NGINX map 正则触发堆溢出:CVE-2026-42533 的触发条件与修复版本

2026-09-20 21:01:27

NGINX map 正则触发堆溢出:CVE-2026-42533 的触发条件与修复版本

NGINX 官方安全公告页新增了几条漏洞,其中影响面最大的是 map 与正则组合导致的堆缓冲区溢出。下面按「触发条件 → 影响版本 → 修复版本 → 临时缓解」整理,附自查命令与上线流程。

公告列表:
奇安信 CERT 通告:

CVE-2026-42533:map + regex 堆缓冲区溢出

  • 名称:Buffer overflow when using map and regex
  • 级别:major
  • CVE:CVE-2026-42533
  • 不受影响:1.31.3+、1.30.4+
  • 受影响:0.9.6-1.31.2

问题出在 NGINX 脚本引擎处理含正则捕获的复杂变量时的缺陷。当 map 指令使用正则匹配,且其输出变量与正则捕获变量(如 $1)在同一个字符串表达式中被引用时,脚本引擎采用「两遍」评估模型:第一遍计算长度,第二遍填充数据。而正则捕获的共享状态会在两次评估之间被 map 指令的匹配操作篡改,导致长度计算与实际写入数据大小不一致。

未授权攻击者可以构造 HTTP 请求触发 Worker 进程崩溃、内存信息泄露;若 ASLR 被禁用或绕过,可能进一步导致任意代码执行。PoC 与技术细节已公开。

触发三要素

  1. 存在正则捕获源:locationserver_namerewriteif 中的正则。
  2. 存在使用正则模式的 map 变量。
  3. 求值顺序:捕获引用在 regex map 变量之前被求值,例如 "$1=$bodyvar=$1"

三个条件同时成立才会命中,这也是排查时最容易确认的部分。

影响范围

  • NGINX Open Source 0.9.6-1.31.2(1.30.4 / 1.31.3 修复)
  • NGINX Plus 37.0.0.1-37.0.3.0、R33-R36 P6
  • NGINX Instance Manager 2.17.0-2.22.1
  • F5 WAF for NGINX 5.9.0-5.13.3
  • NGINX App Protect WAF 4.11.0-4.16.0 与 5.2.0-5.8.0
  • NGINX Gateway Fabric 1.3.0-1.6.2 与 2.0.0-2.6.6
  • NGINX Ingress Controller 3.5.0-3.7.2、4.0.0-4.0.1、5.0.0-5.5.2、2026-lts-r1 至 2026-lts-r3

修复

  • NGINX Open Source 升级到 1.30.* >= 1.30.4,或 1.31.* >= 1.31.3;
  • NGINX Plus 升级到 37.* >= 37.0.3.1,或 >= R36 P7;
  • 衍生组件升级到对应已修复版本。

升级后重启 NGINX。

临时缓解

map 及相关指令中的未命名捕获组($1$2)改写为命名捕获组 (?...),配合 $named_group 引用,并确保捕获仅在持有正则匹配的块内被引用。

# 改写前
map $uri $backend {
~^/api/(.*)$  api_$1;
}

# 改写后
map $uri $backend {
~^/api/(?.*)$  api_$api_path;
}

这种改写可能无法覆盖所有变体,升级仍是唯一的彻底方案。

另外两条 medium

  • CVE-2026-60005:Memory disclosure when using ngx_http_slice_module,级别 medium,不受影响 1.31.3+、1.30.4+,受影响 1.15.8-1.31.2。
  • CVE-2026-56434:Use-after-free when using ngx_http_ssi_module,级别 medium,不受影响 1.31.3+、1.30.4+,受影响 0.8.11-1.31.2。

新增:HTTP/3 堆缓冲区溢出

2026-09-15 新增一条 CVE-2026-90439ngx_http_v3_module 堆缓冲区溢出导致拒绝服务。在特定配置下,使用 HTTP/3 且 OpenSSL 版本不高于 3.5.0 时,处理 TLS 握手过程中可能发生有限的堆缓冲区溢出。该问题非确定性发生(超出攻击者控制),可导致 worker 重启和/或有限数据损坏;仅是数据面问题,不涉及控制面。

自查与处理流程

先确认当前运行的编译版本:

nginx -V

再检查配置中 map 的正则用法,以及 $1/$2 的引用顺序,重点看是否存在「捕获引用出现在 regex map 变量之前」的字符串表达式:

nginx -T | grep -nE 'map|\(.*\)|\$[0-9]'

确认命中后按顺序执行:

# 1. 修改配置(命名捕获组改写,或升级后按新版语法调整)
# 2. 验证语法
nginx -t
# 3. 平滑生效
nginx -s reload

nginx -t 不通过就不要 reload。生产环境如果不能立即升级,先按命名捕获组改写并把捕获引用限制在持有正则匹配的块内;能升级的环境直接升到 1.30.4 / 1.31.3 及以上。

复制全文 生成海报 NGINX 安全漏洞 CVE 运维 配置

推荐文章

程序员茄子在线接单