用 Node.js 的要升级了:三条版本线都有高危漏洞,最严重的可远程执行代码,eMudhra 那 8 枚坏证书也一并拉黑
用 Node.js 跑服务、写工具的开发者,这周要换版本了。10 月 21 日,Node.js 给还在维护的三条版本线发了安全更新:22.x 升到 v22.23.4,24.x 升到 v24.22.1,26.x 升到 v26.12.1。三条线都修了高危漏洞,最严重的一个,官方说可能被用来远程执行代码。
20.x 在 2026 年 4 月 30 日停止维护,25.x 在 6 月 1 日停止维护,这次都没有补丁。Node.js 在公告里提醒,每次发安全更新,停止维护的版本都会受影响,还在用的只能换到 22、24 或 26。
【最需要注意的几个】
Node.js 自带一个解压 Brotli 格式的组件。Brotli 是网页传输常用的压缩格式,HTTP 里写作 br。这个组件有越界写入的问题,也就是把数据写到了不该写的内存位置,官方说这能导致远程执行代码。公告对它只有这一句描述,没说什么情况下会触发。修法是同步了 Google Brotli 项目的一处改动,让解压程序更早发现并拒绝格式不对的数据。
另外三个漏洞出在 HTTPS 的证书核对上,两个高危、一个中危。Node 连 HTTPS 地址时,会核对证书上写的地址和你要连的地址是否一致,对不上就拒绝连接。这三个问题都和 IP 地址有关:IP 用全角数字写(输入法全角状态下打出的“127”这种),或者写法不规范、但能被宽松地认成 IP,核对就可能被绕过。修复后,Node 直接拒绝写法不规范的 IP 地址。全角数字那个只影响 24.x 和 26.x。
还有一个高危出在 dns.resolve(查域名对应地址的函数):域名中间如果夹着一个空字符(NUL),Node 会在那里把名字截断,实际查的只是前半截。
中危里,用启动快照或者把程序打包成单个可执行文件(SEA)的要留意:crypto.randomUUID() 和 randomInt() 的随机数缓存会被一起存进包里,每次启动都生成同样的“随机”值。另有三个低危,涉及 26.x 读取 ZIP 文件,以及实验性的权限模型(--permission 开关)。
这次还更新了 c-ares、OpenSSL、SQLite、undici 等内置组件,修的是这些组件已经公开的漏洞。
【eMudhra 坏证书,Node 也拉黑了】
三个新版本都加了一份内置黑名单,第一批放进去的就是 eMudhra 那 8 枚出问题的中间证书。
这件事前几天刚曝出:印度发证机构 eMudhra 有 8 枚被各家系统认可的“网站公章”,盖章用的密码小到一秒就能算出来,谁拿到都能给任意网站做假证书。10 月 17 日被发现后,Chrome 和 Firefox 当天拉黑,eMudhra 18 日作废,Apple 19 日、Microsoft 20 日跟进,Node.js 21 日发版。
当时 Cloudflare 提醒,浏览器之外的程序要一路更新到编程语言这一层,Node.js 就在这一层。Node 内置了 Mozilla 的可信发证机构名单,却没有浏览器那种随时拉黑坏证书的机制,所以用这 8 枚章签出的假证书,旧版 Node 照样放行。这份黑名单对 Node 建立的所有加密连接都生效。修复的提交说明里写道,它和 Go 语言、Electron 拉黑的是同一批。
想测自己的程序还认不认这几枚章,可以用 Mozilla 工程师 Dennis Jackson 做的自查网站:https://t.co/iJDiH3dZ4O
原文:https://t.co/0Ib8AIHPaX