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。

v26.12.1 的发布页,开头就写明这是安全版本

五个高危里有四个是「解析输入」

tls 三条加 dns 一条,本质是同一类问题:把外部传来的字符串当成结构化的东西用,但校验不够严。

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

发布页往下滚,CVE 一条条列出来,每条后面都跟着提交者名字

两条权限模型修复说明什么

permission 那两条都是低危,但方向有意思:一条是通配节点上的 fs 权限树节点,一条是 realpathSync 也要走权限模型。

权限模型(--permission)的设计目标是「就算代码被注入,也只能碰允许的路径」。它按路径前缀建树做判断。于是两个经典的绕过就出现了:

  1. 通配节点(比如 --allow-fs-read=/data/*)在树上是个特殊节点,判断时容易走错分支;
  2. 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 意味着新的根证书进来了,也可能有旧的被移除。证书链恰好依赖某个被移除根的旧系统,会在升级后突然握手失败 —— 这类故障不会在本地复现,只会在生产环境的某次外部请求上出现。

Node 的版本发布节奏页,Current 与两条 LTS 线的对应关系一目了然

一句话判断

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

Node 官方博客的发布列表,同一天三条安全公告并列

← 返回文章列表

评论

…