资讯 njs 的 xml.exclusiveC14n() 堆越界写漏洞 CVE-2026-78689:nginx-saml 默认配置即受影响

2026-09-07 21:03:22

njs 的 xml.exclusiveC14n() 存在堆越界写漏洞(CVE-2026-78689),影响 nginx-saml 默认配置

F5 于 2026-09-02 发布安全公告,披露 NGINX JavaScript 模块(ngx_http_js_module)中的高危漏洞,编号 CVE-2026-78689,并在 2026-09-03 更新。核心问题出在 njs XML 模块的命名空间前缀列表解析器,攻击入口是 xml.exclusiveC14n() 方法。

漏洞机制

构造恶意的命名空间前缀列表传给 xml.exclusiveC14n() 时,会触发越过堆分配末尾的越界写(CWE-122,堆缓冲区溢出)。njs 和 QuickJS(qjs)两种引擎均受影响:

  • njs 引擎(未配置 js_engine 指令时的默认引擎):越界写会破坏邻近对象,导致 NGINX worker 崩溃,形成可重复触发的 DoS。
  • QuickJS 引擎:每次调用都会泄漏前缀列表,worker 内存在请求处理过程中持续增长。

目前未演示出代码执行,但公告未排除该可能性。

真实攻击面:nginx-saml 参考实现

官方参考实现 nginxinc/nginx-saml 受影响,问题出在 SAML 签名校验流程:它在验签之前,就把来自不可信 SAML 消息的 InclusiveNamespaces/@PrefixList 读取出来,并传给 xml.exclusiveC14n()

换句话说,攻击者不需要持有合法 SAML 签名,只要提交一个精心构造的 SAML Response、Assertion、LogoutRequest 或 LogoutResponse 即可触发。若你的配置直接使用该参考实现,或仿照其逻辑在验签前处理 SAML 的 PrefixList,则默认暴露在漏洞下。

影响范围与评分

  • 影响面:仅数据平面,控制面不受影响。
  • 影响后果:可重复的 worker 重启(DoS)、worker 内存增长,理论上存在代码执行可能。
  • CVSS v4.0:9.2 Critical(AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H)
  • CVSS v3.1:8.1 High(AV:N/AC:H)
  • 受影响版本:NGINX JavaScript (njs) 0.7.10 至 1.0.1(custom)
  • 缓解措施:无

发现者:F5 致谢 Cyera 的 Vladimir Tokarev 和 EvilGenius 的 Sujal Tuladhar。

修复与自查

官方修复版本和更多细节见 F5 advisory:K000162602

升级前自查两个点:

  1. 配置或代码中是否直接调用了 xml.exclusiveC14n(),并把外部可控的命名空间前缀列表作为参数传入?
  2. 是否用 njs 解析外部 XML / 实现 SAML 签名验证?尤其检查 nginx-saml 参考实现中,验签前的 InclusiveNamespaces/@PrefixList 处理步骤。

由于没有可用 workaround,立即升级到修复版本是唯一出路。若无法升级且业务暴露于不可信 SAML 流量,应优先考虑在网络层阻断相关请求源,直到完成升级。

复制全文 生成海报 Nginx njs 安全公告 CVE SAML

推荐文章

程序员茄子在线接单