Node 三条线同一天发安全版:11 个 CVE,5 个高危,两个在 tls、一个在 dns
10 月 21 日 Node 同时发 26.12.1、24.22.1、22.23.4,修 11 个 CVE。高危集中在 tls 与 dns 的输入解析,另有两条权限模型的边角修复,以及根证书换到 NSS 3.131.1。
10 月 21 日 Node 同时发了三个版本:26.12.1(Current)、24.22.1(Krypton LTS)、22.23.4(Jod LTS)。三个都是安全版本,修的是同一批 11 个 CVE。结论很直接:服务端跑 Node 的,今天就把版本号改掉,这不是可以排进下个迭代的那种补丁。
修了什么
按组件分组,比按版本看更清楚:
| 组件 | 问题 | 等级 |
|---|---|---|
| tls | 拒绝非规范 IP 地址(CVE-2026-106069、CVE-2026-106072) | 高危 |
| tls | 修 IP 规范化回归(CVE-2026-105483) | 高危 |
| dns | resolve 系列校验空字节(CVE-2026-105482) |
高危 |
| src / brotli | 暴露 BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH 并摘取上游修复(CVE-2026-111497) |
高危 |
| http | 无 I/O 时 agent 的数据守卫失效(CVE-2026-105481) | 中危 |
| crypto | 快照之间重置随机数缓存(CVE-2026-106074) | 中危 |
| zlib | 不再缓存非法的 ZIP 本地头(CVE-2026-106070) | 低危 |
| src | 通配节点上的 fs 权限树节点(CVE-2026-106071) | 低危 |
| permission | realpathSync 也走权限模型(CVE-2026-106073) |
低危 |
另外两条不是 CVE,但同样值得注意:V8 摘了一个 backport(93cd21e8254b),根证书更新到 NSS 3.131.1。

五个高危里有四个是「解析输入」
tls 三条加 dns 一条,本质是同一类问题:把外部传来的字符串当成结构化的东西用,但校验不够严。
- 「拒绝非规范 IP 地址」——
::ffff:127.0.0.1与127.0.0.1、带前导零的 IPv4、大小写不同的 IPv6 十六进制,这些写法在语义上是同一个地址。如果一个地方按字符串比对做「是否内网地址」的判断,另一个地方按规范化后的结果连接,两边就会不一致 —— 绕过就是这么来的。 - 「dns resolve 校验空字节」—— 字符串里塞
\0,C 层截断后拿到的是前半截,JS 层看到的是全串。这类问题在 2026 年还在出现,说明边界校验仍然是最容易漏的地方。 - 「修 IP 规范化回归」这条更值得看:它修的是上一次修复引入的回归。安全补丁自己出问题并不罕见,这也是为什么安全版本之后常常紧跟一个补丁版。

两条权限模型修复说明什么
permission 那两条都是低危,但方向有意思:一条是通配节点上的 fs 权限树节点,一条是 realpathSync 也要走权限模型。
权限模型(--permission)的设计目标是「就算代码被注入,也只能碰允许的路径」。它按路径前缀建树做判断。于是两个经典的绕过就出现了:
- 通配节点(比如
--allow-fs-read=/data/*)在树上是个特殊节点,判断时容易走错分支; realpathSync会解析符号链接 —— 如果它不经过权限检查,那「先检查再解析」的顺序就能被符号链接绕过。
# 权限模型的典型用法:只允许读一个目录
node --permission --allow-fs-read=/srv/app/config app.js
这两条修完,权限模型才算把「路径归一化 + 符号链接」这条链闭合。我还是不建议把 --permission 当成沙箱用 —— 它是纵深防御的一层,不是隔离边界。
我怎么处理
本站没有 Node 服务端,但构建跑在 CI 上,node-version 指到哪条线就跟着升哪条线 —— 构建机器同样会执行依赖里的代码,同样会解析 URL 与 DNS。升级动作只有一行:
- uses: actions/setup-node@v4
with:
node-version: 24.22.1 # 或者跟着 26.x 的当前版
顺手把根证书那条也记下来:NSS 3.131.1 意味着新的根证书进来了,也可能有旧的被移除。证书链恰好依赖某个被移除根的旧系统,会在升级后突然握手失败 —— 这类故障不会在本地复现,只会在生产环境的某次外部请求上出现。

一句话判断
11 个 CVE 里真正能远程打的有几个,取决于你的代码路径 —— 但只要对外提供 HTTPS 服务,tls 那三条就跟你有关。安全版本不存在「评估一下再说」的余地:升级是一次构建,不升是一次未知概率的事故。


评论
…