nginx 在 10 月 14 日发布 1.30.6 稳定版和 1.31.7 主线版,一次修复五个漏洞,1.30.5、1.31.6 及更早的版本都在受影响范围内。其中三个是 worker 进程里的堆内存破坏,F5 在 CVE 记录里给的 CVSS 3.1 都是 8.1,在 ASLR 被关闭或被绕过时可能执行代码。这三个都要特定配置才会触发,是否受影响取决于配置里有没有用到对应的指令组合。

版本和评分

nginx.org 安全公告页列出的五个漏洞,修复版本都是 1.31.7 和 1.30.6。

CVE问题受影响版本CVSS 3.1
CVE-2026-15176alias 配合 rewrite 时的缓冲区溢出0.1.29 到 1.31.68.1
CVE-2026-93479字符串表达式求值时的缓冲区溢出1.31.2 到 1.31.6,1.30.0 到 1.30.58.1
CVE-2026-97205AIO 加 SSI 时的 use-after-free0.8.11 到 1.31.68.1
CVE-2026-97629TLS session ticket 可被伪造1.23.2 到 1.31.66.5
CVE-2026-95101HTTP/3 请求体注入1.25.0 到 1.31.65.3

两处评分口径不一样。nginx.org 的公告页把五个都标成 medium,CVE 记录里 F5 给的 CVSS 3.1 却有三个是 8.1,评级 High,对应的 CVSS 4.0 是 9.2。这三个 8.1 的向量都是 AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H,即不需要认证、可从网络发起,但攻击复杂度高。

三个内存破坏各自要什么配置

CVE-2026-15176 出在 alias。F5 的描述是,location 里用了 alias,又用 rewrite 改了 URI,再在 set 或 return 里引用 $request_filename,或者在 access log 的格式里用了 $request_filename,构造好的请求就能让 worker 堆溢出。这个问题从 0.1.29 就存在,覆盖的版本很广,只是配置条件比较窄。

CVE-2026-93479 出在 map。map 用正则匹配,root 或者日志格式里先引用了 map 的正则捕获变量、后引用 map 的输出变量,会触发堆溢出。F5 还给了另一种触发方式,即在字符串表达式里用了不可缓存的变量。CHANGES 里写的影响范围是 http 和 stream 模块的 document root 计算和请求日志。这个漏洞只影响 1.30 和 1.31 两条线,1.28 及更早的版本不受影响。

CVE-2026-97205 要开了 aio,再处理带 include virtual 的 SSI 页面,worker 里会出现 use-after-free。

三个的后果相同:worker 进程崩溃重启,ASLR 关闭或被绕过时可能执行代码。F5 注明它们只影响数据面,不涉及控制面。

另外两个

CVE-2026-97629 和 TLS 会话有关。F5 的描述是,配置了 ssl_session_cache shared:...,又没有用 ssl_session_ticket_key 显式指定 ticket 密钥文件、而是让 nginx 自动轮换时,未认证的攻击者能伪造客户端 TLS 会话,进而绕过客户端证书校验。CHANGES 里的说法是自动轮换时有一个密钥没有初始化。伪造能否成功不受攻击者控制,所以 CVSS 是 6.5。用 mTLS 做服务间认证、同时开了共享会话缓存的部署落在这个条件里。

CVE-2026-95101 在 HTTP/3。F5 说开了 proxy_request_buffering on 时,攻击者可以往代理出去的请求里注入数据。CHANGES 补充了原因:未知帧的一部分会被当成请求体,可能绕过 client_max_body_size。没有开 QUIC 监听的实例不受影响。

镜像和配置核对

官方 Docker 镜像已经能拉到新版本,nginx:stable 和 nginx:mainline 两个标签也已指向新版:

$ docker run --rm nginx:1.31.7 nginx -v
nginx version: nginx/1.31.7
$ docker run --rm nginx:1.30.6 nginx -v
nginx version: nginx/1.30.6
$ docker run --rm nginx:stable nginx -v
nginx version: nginx/1.30.6
$ docker run --rm nginx:mainline nginx -v
nginx version: nginx/1.31.7

nginx -T 会输出完整配置,再用 grep 找上面几个漏洞涉及的指令。下面是对一份带 alias、aio 和共享会话缓存的测试配置跑的结果:

$ docker run --rm -v $PWD/test.conf:/etc/nginx/conf.d/default.conf:ro nginx:1.30.6 nginx -T 2>/dev/null | grep -nE '^\s*(alias|aio|ssl_session_cache|ssl_session_ticket_key|ssi|map)\b|request_filename|listen .*quic'
147:    ssl_session_cache shared:SSL:10m;
149:        aio on;
150:        alias /srv/files/;

命中某条指令不等于受影响,还要对照上面的触发条件。这份配置里有 ssl_session_cache shared 而没有 ssl_session_ticket_key,落在 CVE-2026-97629 描述的配置里;有 alias 但没有 rewrite 和 $request_filename,不满足 CVE-2026-15176 的条件;有 aio 但没有 SSI,不满足 CVE-2026-97205 的条件。

1.31.7 的其他变化

1.31.7 除了安全修复,还带了几项行为变化:ngx_http_v2_module 改用 RFC 9218 的优先级方案,RFC 7540 的优先级信号会被忽略;geoip 模块开始支持 MaxMind DB(MMDB)格式;后端 SSL 证书可以按 IP 地址校验。1.30.6 稳定版的 CHANGES 里同样列了这五条安全修复,另外是一批 bugfix。

发行版跟进情况

截至 10 月 16 日,Debian 安全追踪器显示这五个 CVE 已在 unstable(sid)的 nginx 1.30.4-8 中修复,bookworm、trixie 和 forky 的 nginx 仍标记为 vulnerable;Ubuntu 和 ingress-nginx 等内嵌 nginx 的产品,本文没有核对其状态。

本文依据 nginx 安全公告页、1.31.7 CHANGES、1.30.6 CHANGES、CVE.org 上的 CVE-2026-15176、CVE-2026-93479、CVE-2026-97205、CVE-2026-97629、CVE-2026-95101 记录,以及 Debian 安全追踪器。

— 感谢阅读 —
广告

一起交流

分享你的思考,让讨论更进一步。