事件概述:一次紧急安全更新,最高危的问题出在"解压"环节
10 月 21 日,Node.js 项目发布新一轮安全更新,覆盖 22.x、24.x、26.x 三条仍在维护的发行线,共修复 10 个安全问题,其中最受关注的是编号 CVE-2026-111497 的 Brotli 解码器越界写(Out-of-bounds Write)漏洞。新加坡网络安全局(CSA)随后发布警报,给出 CVSS v3.1 评分 9.8,并呼吁受影响用户"立即修补"。
Brotli 是当前 Web 传输中最常用的压缩算法之一,浏览器请求资源时普遍会在 Accept-Encoding 中带上 br。Node.js 内置了解压 Brotli 的组件,而这个漏洞恰恰出在"把外部送来的压缩数据解压开来"这一步:畸形构造的压缩流可以让解码器越界写入内存,轻则导致进程崩溃,重则被进一步利用执行远程代码。Node.js 官方将其定级为 High,中国台湾数位发展部资安署也在 10 月 22 日发文,要求各级机关与企业检查服务器主机与容器化映像档,限期完成升级与重新部署。
影响范围:不只是 node -v 那一个数字
根据 Node.js 官方公告与乌干达国家 CERT(CERT.UG)的通报,受影响版本包括:22.x 早于 22.23.4、24.x 早于 24.22.1、26.x 早于 26.12.1 的全部版本,对应的安全修复版本为 v22.23.4、v24.22.1 和 v26.12.1。已经结束维护的 20.x 及更早版本同样存在该缺陷,但官方明确不会为这些版本发布补丁。
更值得注意的是三类"隐藏"暴露面。其一,Node.js 经常被嵌入在厂商软件、开发工具链和容器镜像里,不少团队"并不知道自己在跑 Node.js";其二,使用 Debian、Alpine、Fedora、RHEL 等发行版软件源安装的 Node.js,可能链接的是系统自带的 Brotli 库,补丁要等发行版自己的包更新,仅看 node -v 的版本号并不能确认已经修好;其三,据安全媒体分析,同一个上游 Brotli 解码器也被 Python 的 Brotli、brotlicffi 等包使用,而这些包在漏洞数据库中尚未映射到该 CVE,pip-audit、Dependabot 一类依赖扫描工具目前不会标记它们,并且这些包还会被 requests、httpx、aiohttp 等 HTTP 客户端间接引入——很多项目并没有直接安装过它们。

为什么站长和运维要重视:不需要"主动调用"压缩功能
这个漏洞的触发条件比想象中宽。CERT.UG 的通报指出,只要应用解压了攻击者可控的 Brotli 数据就存在暴露风险,例如请求体,或者从其他服务器拉取的响应;甚至当应用只是用 fetch() 去请求一个返回 Brotli 压缩内容的响应时,有问题的解码代码也会自动运行——开发者根本没有直接调用 Brotli,同样会受影响。对以 Node.js 做 BFF 层、API 网关、服务端渲染或爬虫采集的团队来说,这意味着任何"会接收外部压缩内容"的入口都在潜在影响范围内。
截至目前,公开信息中尚无在野利用的报告。10 月 22 日公开的概念验证(PoC)只在刻意弱化的测试构建上达成了代码执行,在标准构建上表现为进程崩溃和有限的进程内存读取。但 PoC 已经公开,安全社区普遍预期相关研究会继续推进,现在正是补齐版本的窗口期。
排查思路:先弄清楚"哪些地方在跑 Node.js"
建议运维和开发团队按以下顺序做一轮清查,具体命令以各发行版和官方文档为准:
1. 清点运行时:在服务器与 CI 环境执行 node -v 确认版本,同时检查 package.json 的 engines 字段、Dockerfile 中的 node 基础镜像标签,以及各类前端构建工具链——很多构建工具自带 Node.js。
2. 清点间接依赖:在 Python 环境执行 pip show brotli brotlicffi 检查是否安装了相关包;由于扫描器暂不识别,可再结合依赖树工具确认是否被 requests、httpx、aiohttp 等项目间接引入。
3. 确认补丁形态:通过发行版软件源安装的 Node.js,需关注对应发行版的安全公告,确认其系统 Brotli 库的更新情况;其他捆绑 Brotli 的软件,需关注厂商是否已更新至 Brotli 1.2.1 / 1.1.1 / 1.0.10。
修复与缓解建议
官方与 CERT 机构的建议相当一致:升级是唯一完整的修复方式,目前没有可靠的临时变通方案。具体可参考以下步骤:
1. 将 Node.js 升级到 22.23.4、24.22.1 或 26.12.1 及以上版本;仍运行在 20.x 及更早 EOL 版本上的系统,应规划迁移到受支持的发行线,而不是继续等待不会到来的补丁。
2. 升级生产环境前,按惯例先在测试环境验证业务兼容性,并对配置和依赖清单做好备份;重启或滚动发布尽量安排在业务低峰期,提前评估对线上服务的影响。
3. 容器化部署的团队应重新构建基础镜像,而不是只替换运行时文件——补丁要写进新的镜像层,重新部署后才算真正生效。
4. 同一批安全更新还修复了两个 TLS 证书主机名校验绕过漏洞(CVE-2026-105483、CVE-2026-106069)和一个 dns.resolve 缺陷(CVE-2026-105482),并更新了内置根证书包(封禁此前被入侵的 eMudhra 中间 CA 密钥)。建议一并升级,不要只挑一个 CVE 修。
5. 在补丁窗口期内,可采取的保守缓解包括:审查对外服务中解压外部数据的逻辑,限制不可信来源的压缩内容进入内网服务,并加强对 Node.js 进程异常崩溃的监控与日志告警。
后续观察
这个漏洞的后续值得盯三件事:一是 PoC 公开之后是否出现稳定的利用链和在野攻击报告,以及是否进入 CISA KEV 目录;二是各 Linux 发行版与镜像仓库跟进系统 Brotli 库更新的速度;三是 Python 生态中 Brotli / brotlicffi 等包何时被漏洞数据库正确映射,让依赖扫描工具真正能识别这条传播路径。
对绝大多数团队来说,当前动作可以很简单:确认版本、排期升级、重新构建镜像。补丁已经就绪,剩下的只是别让它在待办清单里躺太久。本文信息整理自 Node.js 官方公告及新加坡 CSA、CERT.UG、中国台湾资安署等机构通报,具体影响版本与操作请以官方文档为准。










暂无评论内容