10 月 21 日,Node.js 项目为 26.x、24.x、22.x 三条在维护的版本线发布了安全更新,一次修复 10 个漏洞。最严重的是一个 Brotli 解码器越界写,官方标为可导致远程代码执行,本批修复的最高严重级别为 HIGH。这篇把影响面和升级目标版本列清。

高危四个

四个高危里,最值得盯的是 CVE-2026-111497:Brotli 解码器越界写,恶意构造的压缩数据可能实现远程代码执行。触发点不只一处,凡是解压 Brotli 数据的路径都算,包括 node:zlib 和 fetch 自动解压。也就是说,一个服务只要接收了不可信的压缩请求体,或去拉取了不可信的压缩响应,就可能中招,而且没有内部 workaround,只能升级。官方没有报告在野利用,公开 PoC 目前也只在一个被故意削弱的测试构建上实现了崩溃和有限的越界读,标准构建上暂无稳定利用;但这不改变结论——解压路径升级是唯一有效的缓解。这也是 Node.js 近期少有的被直接标为可远程代码执行的漏洞。

另两个高危是 TLS 主机名校验绕过。CVE-2026-105483 是当 IP 用全角数字书写时绕过证书主机名校验,CVE-2026-106069 是当主机名宽松解析成 IP 地址时被绕过。这两个本质是让「看起来可信」的连接被冒充,影响 26.x 和 24.x(部分涉及 22.x)。第四个高危是 dns.resolve 在名字里带 NUL 字符时被截断(CVE-2026-105482),影响三条版本线。

证书拉黑

这次更新顺带把 eMudhra 中间 CA 的 8 枚被泄露证书拉进黑名单。eMudhra 是一家印度证书机构,其 8 个中间证书私钥此前被曝泄露,Mozilla、Google、Apple 已在 10 月 17 到 19 日陆续拉黑。Node.js 内置证书库同步阻断,还加入了被阻断中间证书的列表,即使根证书仍可信,凡是由这些泄露私钥签发的链也会被拒。这意味着依赖这些证书的服务,升级后可能突然握手失败,需要提前排查自己链路上有没有用 eMudhra 签发的证书,尤其是内部系统里那些多年没换的 TLS 证书,最容易中招。

其余六个

中危三个:keep-alive socket 会处理请求发出前就写好的响应(CVE-2026-105481);非规范 IPv4 主机名的证书校验问题(CVE-2026-106072);crypto.randomUUID 和 randomInt 的熵缓存被存进启动快照,导致每个进程重复相同的值(CVE-2026-106074),这个对打包成单可执行文件或启动快照的应用影响最大。低危三个涉及 ZipFile 头部校验、Permission Model 通配符越权、以及 fs.realpathSync 绕过,影响面较小。

对应用的影响

对普通团队,这次更新主要影响三处:一是任何处理不可信 Brotli 压缩数据的服务,比如接收压缩请求体或解压外部响应的,属于高危,优先升级;二是依赖 eMudhra 证书做 TLS 的服务,升级后可能握手失败,要先排查链路上有没有用这家 CA 签的证书;三是打包成单可执行文件或用了启动快照的,randomUUID 重复的问题只在重打包后修复,需要重新构建产物。

升级版本

按版本线对号入座:22.x 升到 22.23.4,24.x 升到 24.22.1,26.x 升到 26.12.1。20.x 及更早版本已结束生命周期,不在这批修复范围内,但同样受影响,需要尽快切到受支持的版本线。除了 Node 本体,打包成单可执行文件或快照的应用要重新构建,内置依赖如 c-ares、OpenSSL、SQLite、Undici 也一并随版本更新。这次更新属于「尽快升」的那一类,尤其是有对外接收压缩数据的服务,别拖到下一个发布窗口。