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 与技术细节已公开。
触发三要素
- 存在正则捕获源:
location、server_name、rewrite、if中的正则。 - 存在使用正则模式的
map变量。 - 求值顺序:捕获引用在 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-90439,ngx_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 及以上。