F5 一次性修补 NGINX 三个内存漏洞:map 指令 9.2 分堆溢出已有 PoC,24–48 小时内先用命名捕获缓解
2026-07-15,F5 修复了 NGINX 的三个内存漏洞。其中最严重的是 CVE-2026-42533:map 指令中潜伏多年的堆缓冲区溢出,CVSS v4.0 评分 9.2。未认证攻击者用一条特制 HTTP 请求(或构造超长 SNI 字段的 TLS ClientHello)就能在 worker 进程内触发越界写,配合 ASLR 绕过理论上可达到远程代码执行。公开 PoC 已出现。
另外两个伴生漏洞:
- CVE-2026-60005(8.8):
ngx_http_slice_module未初始化内存泄露 - CVE-2026-56434(8.3):SSI 模块 Use-After-Free
受影响版本
| 发行线 | 受影响版本 | 修复版本 |
|---|---|---|
| Open Source stable | 1.30.0 ~ 1.30.3 | 1.30.4 |
| Open Source mainline | ≤ 1.31.2 | 1.31.3 |
| NGINX Plus | 37.0.0.1 ~ 37.0.2.1、R33 ~ R36 | 37.0.3.1 / R36 P7 |
| Ingress Controller | 5.0.0 ~ 5.5.2 | 5.5.3 |
| Gateway Fabric | 2.0.0 ~ 2.6.6 | 2.6.7 |
发行版会自己编号打包(例如 Alpine 修复包为 <1.30.4-r0),用包管理器安装的要看对应发行版的安全公告。
触发条件
并非所有老版本都会立刻被打穿。CVE-2026-42533 的实际触发需要满足:
map指令使用正则匹配- 输出变量之前,有字符串表达式引用了 map 的正则捕获变量(如
$1) - 该表达式落到了动态输出 / 转发类指令上
自查命令:
nginx -v
grep -rn '\$[0-9]' /etc/nginx/conf.d/*.conf /etc/nginx/nginx.conf
缓解动作:把编号捕获改成命名捕获
将 $1 改为命名捕获(如 $name),并且只在包含该正则的块内引用捕获变量。这一条能同时缓解 CVE-2026-42533 和 slice 漏洞(CVE-2026-60005 也与未命名正则捕获有关)。
slice / SSI 模块的取舍
- CVE-2026-60005:
slice模块默认不编译,需要--with-http_slice_module显式启用才受影响。泄露内容可能包含 TLS 密钥材料、其他客户端的 Cookie/Header、内存指针——指针若与 42533 配合可辅助绕过 ASLR。不用 slice 就重新编译去掉。 - CVE-2026-56434:触发条件是
ssi on+proxy_pass+proxy_buffering off三者同时存在,且攻击者能控制上游响应(内网 MITM 或上游被控)。没有临时缓解,只能升级。
升级命令
# Debian/Ubuntu
apt install nginx=1.31.3
# RHEL/CentOS
yum update nginx-1.31.3
平滑升级:
nginx -t
kill -USR2 $(cat /var/run/nginx.pid)
Docker / K8s 注意
- 不要用
latest或固定大版本 tag,换官方安全版本重建镜像 - 测试环境先执行
nginx -t,通过后再滚动更新 - Ingress Controller 设置
maxUnavailable=0保留旧 Pod,便于出问题时回滚 - 第三方模块(lua/WAF/缓存)升级主程序后可能不匹配导致启动失败,先确认兼容性或重编译
修复优先级
| 优先级 | 时间窗口 | CVE | 动作 |
|---|---|---|---|
| P0 | 24–48 小时 | CVE-2026-42533 | 编号捕获改为命名捕获;尽快升级 |
| P1 | 1–2 周 | CVE-2026-60005 | 命名捕获 / 禁用 slice 模块 |
| P1 | 1–2 周 | CVE-2026-56434 | 只能升级,无临时缓解 |