一文读懂Node.js最高危漏洞:原理拆解与影响范围

源自13位全网作者

19:13

2026年10月21日,Node.js 为仍在维护的 22.x、24.x、26.x 三条版本线同步发布安全更新,官方公告共列出 10 个漏洞,其中 4 个标记为高危;影响最严重的是内置 Brotli 解压组件的越界写入漏洞 CVE-2026-111497,公告直接写明它可以导致远程执行代码。三条版本线全部受影响,唯一修复办法是分别升级到 v22.23.4、v24.22.1 和 v26.12.1。Node.js 官网

先说清“最高危”指什么。Node.js 的漏洞严重度分为 Low、Medium、High、Critical 四档,官方明确本次修复的最高等级是 High,没有出现 Critical 级漏洞。在十个漏洞里,只有 Brotli 这一个能走到代码执行,处置优先级因此排在第一位。Node.js 官网

一个解压库,怎么就成了远程代码执行的入口

Brotli 是 Google 设计的压缩格式,网页传输里用得很多,HTTP 头部写作 Content-Encoding: br;Node.js 把它的解码器内置进了自带的 zlib 模块,开发者日常解压网络数据都会经过它。问题出在压缩数据的块结构上:Brotli 把数据分成若干块,每块可以有不同的类型和长度,流里可能出现“块切换”标记——按修复附带的测试用例注释,当数据流声明只有一个块类型时,携带块切换就是非法输入,而旧解码器并不把它识别为格式错误。旧代码会把这种情形误当成“输入还没读完”,解码循环带着不一致的块类型状态继续写输出,写入位置随之越过输出缓冲区的边界。这就是官方所说的越界写入:攻击者若能精心构造压缩数据,就可能破坏进程内存,进而被利用来执行代码。微博GitHub

修法相当克制:为这种情形新增专门的错误码 BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH(取值 -17),更早地发现并报告无效数据流,遇到非法块切换立即终止,而不是继续带错运行。Node.js 侧同步暴露了该错误常量,并加入了一条 22 字节畸形数据流的回归测试。官方公告没有披露更多利用细节,也未提及该漏洞已在野外被利用。GitHub

影响范围:哪些版本、哪类代码会被波及

版本线方面,26.x、24.x、22.x 全部受影响,且官方提醒每次安全更新都会波及停止维护的版本;20.x 已于 2026 年 4 月底停止维护,25.x 也在年中退场,这批补丁不会下发给它们,还在使用的只能迁移到三条受支持版本线。Node.js 官网微博

代码层面,触发条件可以收窄:凡是用 zlib 模块的 brotliDecompress、brotliDecompressSync 或 createBrotliDecompress 解压不可信数据,都在攻击面上,典型场景包括处理用户上传的压缩文件、自行解码 br 编码的接口响应;fetch 的底层实现 undici 在启用解压拦截器时调用的正是同一组接口,风险并无区别。

其余三个高危漏洞与代码执行无关,但同样触及安全底线。两个出在 TLS 证书核对上:证书地址用全角数字书写时可以绕过主机名校验(仅影响 24.x 和 26.x),主机名能被宽松解析成 IP 时也可能被证书错误认证;另一个是 dns.resolve 遇到含空字符的域名会在那里截断,实际查询的只是前半截,属于中间人、域名仿冒一类风险。中危里有一个容易被忽略:crypto.randomUUID() 与 randomInt() 的随机数缓存会被一起保存进启动快照和 SEA 单文件包里,导致每次启动产出的“随机”值完全相同——用快照打包分发工具链的团队需要专门核对。三个低危中,26.x 占两个,涉及 ZIP 头部处理和实验性权限模型(–permission)的通配符越权,权限模型经 realpathSync 绕过的一个问题则三条线都有。

同一次发布,还拉黑了一批泄露的证书

除漏洞修复外,本次更新同步处理了 eMudhra 中间证书私钥泄露事件:受影响的根证书组件 ca-cert 在 26.x、24.x、22.x 三条线上全部更新。印度 CA 机构 eMudhra 有 8 枚 emSign 中间证书的私钥在 2026 年 10 月被报告泄露,意味着持有者可以为任意网站签发被信任的证书。浏览器有现成的证书拉黑机制,Node.js 此前没有等价物;这次它在内核中编译进一份公钥黑名单,对所有 TLS 连接(含 QUIC 与 DTLS)握手校验,命中即报告证书已被撤销,被拉黑的公钥集合与 Go、Electron 的修复完全一致。根证书库也同步升级到 NSS 3.131.1,移除了三枚 emSign 根证书。Node.js 官网GitHubGitHub

官方同时写明了一个限制:升级前建立的连接若发生会话恢复,在会话超时之前不会重新校验证书。也就是说只升版本、不重启连接的服务,旧会话仍可能继续信任这批假证书,升级后应尽快重启。GitHub

现在该做哪几件事

第一步,执行 node -v 核对版本线:在 22/24/26 上的直接升级到 v22.23.4、v24.22.1、v26.12.1,本次是补丁级安全版本,应用代码无需改动;停在 20.x、25.x 等过期版本线上的,不存在“打补丁”选项,迁移到受支持版本线本身就是修复。第二步,排查程序里解压不可信 brotli 数据的入口,官方没有给出不升级可用的缓解手段,升级之外无捷径。第三步,用启动快照或 SEA 打包分发的工具,升级到新版本后需重新打包,否则包内仍是旧解码器和旧随机数缓存;对外 HTTPS 连接依赖证书校验的服务,升级后安排重启,让公钥黑名单真正生效。

内容由AI生成
0
扫一下,分享更方便,购买更轻松
0评论

当前文章无评论,是时候发表评论了
提示信息

取消
确认
评论举报

最新文章 热门文章