Node.js Brotli RCE 漏洞自查指南:fetch、undici、axios 都在影响面,三分钟确认你的版本

概要:Node.js 的 Brotli 解码器被挖出一个越界写漏洞,编号 CVE-2026-111497,CVSS 9.2,可未认证远程代码执行。官方 10 月 21 日已发补丁,22.23.4、24.22.1、26.12.1 三个版本线同步修复,Bun 1.4.4 也修了。这篇文章讲清楚影响面为什么比你想的大、怎么三分钟确认自己中没中、以及一时升不了版本的临时缓解办法。

一、发生了什么

先说结论:如果你在用 Node.js 发起对外请求,大概率受影响,升级就完事。

漏洞出在 Node.js 内置的 Brotli 解码器,属于越界写,CVSS 9.2,可以未认证远程代码执行。发现者是 OpenAI Codex 安全团队的研究员 Khai Tran 和 Sylvie Mayer。Node.js 在 10 月 21 日发布了修复版本:22.23.4、24.22.1、26.12.1,三个版本线同时补上。Bun 1.4.4 也修了同一个问题。

二、为什么 fetch、undici、axios 全在内

这是这次漏洞最要命的地方,值得单独讲明白。

很多后端同学的心智模型是:我不处理用户上传的图片,不解析陌生文件,攻击面应该很小。但这次不一样。问题不在你的业务代码,在 Node.js 底层的解压环节。

现代客户端发请求时会带上 Accept-Encoding 响应头声明自己支持什么压缩格式,其中就有 Brotli,对应的 Content-Encoding 值是 br。关键在于:只要对方服务器返回 br 压缩的响应,Node.js 会自动解压。也就是说,哪怕你的业务代码只是老老实实调了一个 fetch,只要请求的目标是不可信的服务器,对方返回一个精心构造的 Brotli 数据流,解码器里的越界写就被触发了。

undici 是 Node.js 内置 fetch 的底层实现,axios 在 Node 端也走类似路径,所以这三类客户端全部落在影响面里。中招的前提只有两个:你发请求了,且对端是不可信的。爬虫、聚合接口调用、SSRF 防护不严的回调场景,全都算。

三、三分钟自查

第一步,看版本:

bash 复制代码
node -v

对照修复线:22.x 线看是否不低于 22.23.4,24.x 线看是否不低于 24.22.1,26.x 线看是否不低于 26.12.1。低于这些补丁版本,就在受影响范围内,直接升级。别在旧的大版本线上待着,官方修复只发在上面这几条线。

第二步,查依赖面。检查项目里有没有对不可信地址发请求的代码,重点看这几类:

bash 复制代码
grep -rn "axios.get\|axios.post\|fetch(" src/ --include="*.js" | head -20
grep -rn "undici" package.json

爬虫、webhook 回调、第三方数据聚合,这三类是高危场景。

第三步,如果你用 Bun,确认版本不低于 1.4.4:

bash 复制代码
bun -v

四、升级与 CI 闸门

升级本身没什么好说的,各版本线直接升到补丁版:

bash 复制代码
nvm install 22.23.4 && nvm alias default 22.23.4

用 Docker 的记得动基础镜像,别宿主机升了容器里还是旧的:

bash 复制代码
FROM node:22.23.4-slim

真正推荐做的是第三步:在 CI 里加一道版本闸门,以后再有这类安全版本,脚本改一行就能复用:

bash 复制代码
node -e "
const [a, b, c] = process.versions.node.split('.').map(Number);
const ok =
  (a === 22 && (b > 23 || (b === 23 && c >= 4))) ||
  (a === 24 && (b > 22 || (b === 22 && c >= 1))) ||
  (a === 26 && (b > 12 || (b === 12 && c >= 1))) ||
  a > 26;
if (!ok) {
  console.error('Node ' + process.versions.node + ' 在 CVE-2026-111497 受影响范围,请升级');
  process.exit(1);
}
console.log('Node ' + process.versions.node + ' 已包含 Brotli 修复');
"

把这段存成 check-node.js,CI 的第一个步骤跑一下,版本不达标直接红。安全版本这东西靠人记忆靠不住,闸门靠得住。

五、一时升不了的临时缓解

总有升级要排期的系统。临时缓解的思路是绕开 Brotli 解压:客户端主动不声明支持 br。

axios 可以在请求头里压缩掉 br:

bash 复制代码
axios.get(url, { headers: { 'Accept-Encoding': 'gzip, deflate' } });

undici 和原生 fetch 同理,把 Accept-Encoding 限制在 gzip 和 deflate。对方返回不了 br,恶意数据流就进不了那个解码器。

注意这只是止血,不是治疗。两个代价:一是放弃了 Brotli 的压缩率,带宽成本会涨一点;二是这个办法只覆盖你显式控制请求头的代码,漏掉一处就白做。升级才是终解,缓解手段给你的是排期时间,不是豁免权。

六、顺带说两句趋势

这次有意思的不只是漏洞本身,还有发现它的方式。前段时间 Anthropic 开源了漏洞扫描器 OSS Scanner,上线 11 天报出 77 个严重和 803 个高危问题,88% 的样本最终达到披露标准。AI 挖洞从概念验证进入了量产阶段,往后这类「AI 团队挖出基础组件漏洞」的新闻会越来越多。

对普通开发者的启示很朴素:你依赖的基础组件漏洞发现周期在变短,意味着「以为没漏洞」的安全感在贬值,版本闸门和依赖更新流程会从加分项变成标配。

另外同周还爆了 AWS Multi Model Server 的一个未认证 RCE,编号 CVE-2026-115812,CVSS 9.8。因为产品已停产,官方不修了,直接建议迁移。还在跑 EOL 组件的团队注意一下,那条路的尽头是没人给你打补丁。

写在最后

总结成三句话:Node 发对外请求的,今天就把版本升到 22.23.4、24.22.1 或 26.12.1;升不了的先掐掉 Accept-Encoding 里的 br;最后去 CI 加一道版本闸门,别靠记忆管安全。

相关推荐
烬羽1 小时前
给 RAG Agent 装上"仪表盘":LangSmith 全链路观测与量化评估实战
深度学习·openai·ai编程
用户0171582819331 小时前
Agent 为什么需要 CLI
人工智能
东坡AI1 小时前
Agent 安全网关 · 威胁模型 v1.0(AI知识学习分享)
人工智能
秦先生在广东1 小时前
Kali配这本笔记,白嫖600种工具
人工智能
博谷1 小时前
GEO 的技术机制:RAG 链路、信源归因与内容工程
人工智能
shehuiyuelaiyuehao1 小时前
算法56,重排链表
数据结构·算法·链表
合尘猫1 小时前
词元涨价近一倍后,我把 AI 客服的成本拆成了四个可优化的变量
人工智能·后端·架构
长不大的杨瑞杰1 小时前
OpenCode v2 MCP 与插件体系实战:把数据库、工单和内部 API 安全接入 Agent
人工智能·安全·语言模型·软件工程·1024程序员节