发生了什么
Google 于 10 月 16 日预留、10 月 22 日公开 CVE-2026-111497:Brotli 解码器(c/dec/decode.c)存在越界写入,影响 1.0.3 至 1.2.0 全平台版本,CVSS 4.0 评 9.2;上游 10 月 21 日发布 1.0.10、1.1.1、1.2.1 三个修复版本。
机制写在 Node.js 安全公告里:非法的 block switch 被当作「还需要更多输入」而非格式错误,流式解码器便持续把输入字节追加进一个 8 字节内部缓冲区,越界写坏相邻内存。攻击双向:未修复的服务端可被恶意客户端送来的压缩体接管,未修复的客户端也可被恶意服务端返回的压缩响应接管。
受影响的不止 Node.js
- Node.js:22.23.4 / 24.22.1 / 26.12.1;20、23、25 系列已停止维护,不再出补丁
- Bun 1.4.4;上游 Google Brotli 1.0.10 / 1.1.1 / 1.2.1
- Envoy 1.40.0 / 1.39.3 / 1.38.6 / 1.37.8;Istio 1.31.2 / 1.30.6 / 1.29.9,仅在开启 Brotli 解压时暴露
- Python 的 brotli 1.2.1 与 brotlicffi 1.2.1.0:装了包,requests、httpx、aiohttp 就自动解 br,代码不必 import brotli
- .NET 8.0.33 / 9.0.22 / 10.0.14、Debian DSA-6582-1、cdxgen 13.5.0 亦已跟进
比漏洞本身更值得记的一点
根因修复早在 2 月 27 日就进了 Brotli 源码,当时无人认定为安全问题,此后八个月没有带修复的版本发布——上游上次发版还是 2025 年 10 月的 1.2.0。下游普遍把源码 vendor 进发布物,这八个月里按 tag 打包的产品都在携带一个修好却装不到的缺陷。含义是:能报出 OpenSSL 版本号的团队很多,能说清哪个二进制链接了 libbrotli 的很少。
现在该做什么
- 先定位再升级:官方构建的 Node.js 自带 Brotli,升运行时即可;由系统库动态链接的发行版需同时更新 libbrotli
- 升级后必须重启进程、重建镜像与编译产物,运行中的旧进程仍持有旧解码器
- 短期缓解:入口拒绝 Content-Encoding: br;Envoy 与 Istio 只摘 Brotli 解压过滤器;Python 侧可卸载 brotli 与 brotlicffi 回落到 gzip
- 无效做法:Accept-Encoding 里删掉 br 不管用,服务端仍可主动返回;各家 WAF 规则只覆盖入站
- 曾在不可信 br 输入上运行过的对外进程,建议轮换云凭据与模型 API Key
不确定之处
评分不一致:Google 给 9.2 严重,Red Hat 评 8.1,Node.js 只标 high。Imperva 已在官方 Node.js 24.22.0(Linux ARM64)上取得代码执行,但需多次尝试、利用代码未公开;Bun、Envoy、Istio 与 Python 包目前仅有内存破坏的确认结论。截至 10 月 23 日,CISA 记录在野利用为「无」,未进 KEV 目录。

