nginx 1.31.5/1.31.6 与 njs 1.0.1:HTTP/3 缓冲溢出、SAML 验签前解析与升级路径
官方安全公告:
2026 年 nginx / njs 版本与安全更新时间线
- 2026-09-15 nginx-1.30.5 stable 与 nginx-1.31.6 mainline 发布,修复 ngx_http_v3_module 缓冲溢出(CVE-2026-90439)。
- 2026-09-02 nginx-1.31.5 mainline 发布,新增 control API、predicate locations、ngx_http_json_module 模块。
- 2026-09-02 njs-1.0.1 发布,修复 js_access 访问控制绕过(CVE-2026-18329)、ngx.fetch() 触发的 worker 进程崩溃(CVE-2026-78222)、xml.exclusiveC14n() 堆缓冲溢出(CVE-2026-78689)。
- 2026-08-19 nginx-1.31.4 mainline 发布。
- 2026-07-15 nginx-1.30.4 stable 与 1.31.3 mainline:map+regex 缓冲溢出 CVE-2026-42533、ngx_http_slice_module 内存泄露 CVE-2026-60005、ngx_http_ssi_module UAF CVE-2026-56434。
- 2026-06-23 njs-1.0.0:弃用 njs 引擎转向 QuickJS,统一异常类,加固 ngx.fetch() 请求校验。
- 2026-06-17 1.30.3/1.31.2:proxy_v2/grpc 缓冲溢出 CVE-2026-42055,charset 越界读 CVE-2026-48142;1.31.2 另修 v3 UAF CVE-2026-42530。
- 2026-05-19 njs-0.9.9:js_fetch_proxy 堆溢出 CVE-2026-8711。
- 2026-04-14 nginx-1.30.0 stable:Early Hints、HTTP/2 to backend、Encrypted ClientHello、upstream sticky sessions、Multipath TCP,默认 proxy HTTP 版本改为 HTTP/1.1 + keep-alive。
1.31.5 mainline 的新增项
1.31.5 在 2026-09-02 进入 mainline,随版带出三块内容:control API、predicate locations、ngx_http_json_module 模块。其中 ngx_http_json_module 是新增的 HTTP 模块。
1.31.6 / 1.30.5:HTTP/3 缓冲溢出 CVE-2026-90439
2026-09-15 同时发布的 nginx-1.31.6 mainline 与 nginx-1.30.5 stable 修的是同一个洞:ngx_http_v3_module 缓冲溢出,编号 CVE-2026-90439。对外提供 HTTP/3 的实例按 mainline、stable 两条线分别升到 1.31.6 或 1.30.5。
njs 1.0.1 修掉的三个问题
| CVE | 问题 | 影响面 |
|---|---|---|
| CVE-2026-18329 | js_access 访问控制绕过 | 已验证客户端可绕过 access 阶段的控制 |
| CVE-2026-78222 | ngx.fetch() 触发 worker 进程崩溃 | worker 稳定性 |
| CVE-2026-78689 | xml.exclusiveC14n() 堆缓冲溢出 | NGINX JavaScript 0.7.10–1.0.1 |
CVE-2026-78689:xml.exclusiveC14n() 的命名空间前缀列表
问题出在 njs XML 模块的命名空间前缀列表解析器,经 xml.exclusiveC14n() 可达。当配置把外部可控的 XML 命名空间前缀列表传给该方法时,构造前缀列表会越界写到堆分配之外。
引擎不同,后果不同:
- njs 引擎(js_engine 缺省时使用的那个)会破坏相邻对象,并使 nginx worker 崩溃;
- QuickJS 引擎每次调用还会泄漏前缀列表,worker 内存随请求增长。
CVSS v4.0 评分 9.2,CRITICAL。该漏洞没有控制面暴露,只走数据面。
官方 nginxinc/nginx-saml 参考实现在 SAML 签名校验期间受影响:它在签名验证之前,就从不可信 SAML 报文里读取 InclusiveNamespaces/@PrefixList 并传入 xml.exclusiveC14n()。这意味着不需要有效 SAML 签名,构造 SAML Response/Assertion/LogoutRequest/LogoutResponse 即可触发。
CVE-2026-18329:js_access 访问控制绕过
与 1.31.5 同批发布的 njs 1.0.1 还修了 js_access 的访问控制绕过。已验证的客户端可以绕过 access 阶段的控制。凡是把鉴权、白名单、拦截逻辑放在 js_access 阶段的配置,都要按这个前提重新评估。
排查与升级
- 先确认实际生效的版本:
nginx -V看编译进构建的 njs 模块路径,njs -v看 njs CLI 版本。njs 0.7.10–1.0.1 都在 CVE-2026-78689 的受影响范围内,njs 用户尽快升到 1.0.1。 - 用了 nginx-saml 的,核对 SAML 签名校验顺序。先验签、再解析可缓和 CVE-2026-78689 的触发路径。
- 暴露 HTTP/3 的实例升到 1.31.6 或 1.30.5。
- 走发行版包管理的:Debian/Ubuntu 需等发行版 backport;Rocky/RHEL 已出 RLSA-2026-66542 / RHSA-2026:66542(对应 CVE-2026-42533),其余 CVE 以各自发行版公告为准。