Node.js 这周也发安全版本了。里面有个 high 级的问题,编号 CVE-2026-111497:Node 自带的 Brotli 解压库,喂一段特制的压缩数据进去,能写出缓冲区,一路变成远程代码执行。
先说清楚它为什么值得单拎出来讲——不是"又一个 RCE",而是这次被证明能在官方原版上打穿。
10 月 21 日 Node.js 官方发了 26.x / 24.x / 22.x 三条线的安全更新。几天后 Imperva 放出 PoC,起名 Node2Shell。他们的验证环境不是自己编译的调试版,是官方的 Node.js 24.22.0 Linux arm64 镜像——就是你直接 docker run 拉起来那个。没有 debugger,没有额外补丁,喂一段构造过的 Brotli 数据,代码就跑起来了。他们自己也说不是每次都能成,在 arm64 上试了好几次才复现一次;但复现了就是复现了。
洞在哪
Node 内置的 Brotli 解码器有个逻辑没拧对:遇到一个非法的 block switch,它没有当成"格式错误、立刻报错",而是当成了"输入还不够、再给我点"。于是流式解码器就继续往一个 8 字节的内部缓冲区里追加数据——追加过头,就成了越界写。
能越界写,后果就那三样:崩进程、把进程内存里的东西读出来、或者直接执行任意代码。官方给的是 high。
谁会中招
不是所有跑 Node 的都在射程里,但触发条件没想象中那么苛刻:只要你的应用会用 node:zlib 解 Brotli 数据,而这数据的来源不完全可控,就该看一眼。
现实里这种情况比你以为的多:
- 你处理客户端发来的
Content-Encoding: br请求体; - 你解压用户上传的
.br文件,或者第三方接口返回的压缩数据; - 你在网关 / 缓存层顺手解一层 br。
一句话:把"解压"当成输入处理的一部分、又没做来源限制的,都算。
影响版本:Node.js 26.x、24.x、22.x。
修复版本:26.12.1 / 24.22.1 / 22.23.4(2026-10-21 发布)。Imperva 的复测结论是:在 24.22.1 上,同一段数据直接被拒,没有代码执行。
一条自查命令:
node -v多版本共存的机器上,node -v 未必等于你服务实际跑的那个,再看一眼:
node -p "process.version + ' brotli=' + process.versions.brotli"怎么补
能升就升,没什么可权衡的:
nvm install 24.22.1 && nvm alias default 24.22.1
# 或者按发行版 / 官方源
sudo apt update && sudo apt install --only-upgrade nodejs生产上更稳的路子是先把容器 base image 的 tag 提到 24.22.1 或 26.12.1,跑一轮回归,再滚动发布。这次是 patch 版本,一般不涉及 API 变更,但也别一天之内把所有线上一起重启——升级翻车的,从来不是版本号,是手快。
短期实在升不了,至少把攻击面收一收:
- 在入口层直接掐掉不可信的 Brotli:nginx / CDN 上关了
br,只留 gzip; - 需要解第三方数据的服务,跟主业务隔离到独立进程 / 容器,出事先炸它一个;
- 别让手里攥着凭证的进程去解不可信压缩数据。
顺带一句
上周是 PHP 引擎自己有个洞,这周轮到 Node 自带的压缩库。两件事的共性不在语言,在"自带"两个字:运行时、基础库、内置解码器,这些平时没人盯的一层,改起来最麻烦,覆盖面又最广。
官方公告:https://nodejs.org/en/blog/vulnerability/october-2026-security-releases

评论