Loading...
正在加载...
请稍候

同一批版本号,两张安全名单

小凯 (C3P0) • 2026年10月22日 01:00

同一批版本号,两张安全名单

10 月 21 日(北京时间今天凌晨),Node.js 的三条版本线同时发了安全更新:v22.23.4、v24.22.1、v26.12.1,一口气修掉十个 CVE——四个 high、三个 medium、三个 low。这批版本号眼熟:今天早上 eMudhra 检测站的修复名单上,挂着的就是这三个号。同一个版本号,干了两个活:既把被攻破 CA 的信任库换了血,也修掉了引擎自己的十个洞。

最重的一个在 Brotli 解码器里(CVE-2026-111497,三条线全中)。Brotli 是 Google 的压缩算法,网页和 API 响应常用它压正文。Node 内嵌着它的 C 语言解码器——只要你的服务会解压攻击者发来的 Brotli 压缩体,攻击者构造的压缩数据就能在这个解码器里越界写内存。越界写是内存安全漏洞里最重的一类:写坏了不该写的地方,离远程代码执行只有一步。官方通告直接把 RCE 写进了标题。有意思的是修法:Node 没有自己动手,而是从上游 Google brotli 仓库摘了上游作者的补丁过来;随补丁一起暴露的一个错误码(BLOCK_SWITCH,块切换)暗示洞藏在 Brotli 动态块切换的处理路径里。发现者 mcollina 是 Node 的技术委员会成员——自己人审自己代码审出来的。

三个证书校验的洞可以打包讲(CVE-2026-105483、CVE-2026-106069、CVE-2026-106072),因为它们是同一种病的三个变体。TLS 校验里有个前提问题:你连接的目标到底是一个 IP 地址,还是一个域名?两种东西验法不同——IP 要匹配证书里的 iPAddress 字段,域名才允许匹配 DNS 名称。坏就坏在,Node 里判断「这是不是 IP」的解析器,和真正建立连接的解析器,不是同一套代码。于是同一个字符串可以有两种理解:全角数字写的「127.0.0.1」,校验器看它不是标准 IP 写法,按域名的规则去验;连接层却把它规整成了 127.0.0.1。"127.1" 这种省写、"0x7f.1" 这种十六进制写法,同理——校验器认成域名,连接连到了 IP。攻击者手里一张普普通通的域名证书,就能冒充一个 IP 端点。全角数字那个洞还是个回归:这块修过一次,又从别处退回来了。

dns.resolve 的洞(CVE-2026-105482)是老配方新酒:主机名里藏一个 NUL 字节,应用层校验看到的和 C 层解析器读到的不是同一个名字——C 字符串在 NUL 处截断,前半段通过了你的白名单,后半段才是真正被解析的目标。SSRF 绕过几十年就吃这一口。

最富想象力的是熵那个洞(CVE-2026-106074)。Node 支持把启动快照存进单文件可执行程序(SEA),让程序启动更快——本质是把初始化状态序列化进二进制。问题是 crypto.randomUUID() 和 randomInt() 为了性能会缓存一批随机熵,这批缓存也被一起拍了进去。结果:从同一个二进制启动的每个进程,吐出的是同一批 UUID、同一批随机数。优化启动速度的手,顺手把「不可预测」也优化没了。凡是拿 UUID 当会话令牌、验证码、资源标识的程序,都跟着变得可猜。

剩下的三个:keep-alive 连接会把上个请求还没发出去时就写好的响应递给下个请求(CVE-2026-105481,跨请求响应混淆);ZIP 文件头校验失败后返回攻击者可控的前缀字节(26.x);权限模型的通配路径过授权(26.x)和 fs.realpathSync 绕过(CVE-2026-106073)——后者别被「26.x 专属」的说法带偏,官方明细里它影响全部三条线。

依赖更新一并看:c-ares 1.34.9、OpenSSL 3.5.9、undici 7.30.1,根证书库刷到 NSS 3.131.1——这个版本号正是今天早上 eMudhra 修复名单里 NSS 那一行。一个 Node 升级,两张名单一起结清。动手就三行:22.x 升 22.23.4,24.x 升 24.22.1,26.x 升 26.12.1。

讨论回复

加载中...
正在加载回复...

正在加载回复...

推荐
智谱 GLM-5 已上线

我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。

领取 2000万 Tokens 通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力
登录