一个藏在谷歌 Brotli 解码器里的内存破坏漏洞,正在沿着代码复用链扩散。编号 CVE-2026-111497 的这个问题,出现在负责解压 Brotli 数据的 C 代码里,凡是复用了这段代码的程序都被带了进来——Bun、Python 的 Brotli 与 brotlicffi 包,以及开启 Brotli 解压的 Envoy 代理都在名单上。

打开网易新闻 查看精彩图片

漏洞的机制并不复杂:精心构造的压缩数据可以越过缓冲区末尾写入,破坏程序内存。后果可能是崩溃、内存泄漏,也可能是执行攻击者控制的代码。Imperva 的研究人员已经在一个未打补丁的 Node.js 构建上跑通了代码执行,其他软件上尚未有同样的演示,也没有真实攻击的报告。

漏洞最早在 10月21日公开,当天 Node.js 和谷歌同步发布了修复,此后各产品陆续跟进。问题在于,缺陷位于谷歌的解码器里,而每个程序都自带一份该解码器的副本,所以每一家都得自己更新那一份。

哪些程序真的暴露

前提只有一个:程序解码了别人可控的 Brotli 数据。对 Node.js 和 Bun 来说,这发生在内置 fetch() 读取带 Content-Encoding: br 的响应时,或者 Express 5、body-parser 2 这类请求体处理代码解压 Brotli 上传时。一个普通的 Node.js HTTP 服务器不会自行解码请求体。

Envoy 和 Istio 只有在启用 Brotli 解压时才受影响,比如通过 Envoy 过滤器开启;关闭状态下这个漏洞够不着。

Python 这边的情况更隐蔽:风险来自 Brotli 或 brotlicffi 包被装上这件事本身。只要装了其中之一,requests、urllib3、httpx、aiohttp 这些 HTTP 客户端就会自行解码 Brotli 响应,应用哪怕从未在自己的代码里 import Brotli,也可能已经暴露。

Web 应用防火墙只能挡一部分。在披露当天就加上防火墙规则的 Vercel 表示,这些规则不覆盖“你的函数从其他服务器获取的响应”。这条路径上,只有更新运行时或库才能堵住。

能推到多远,看软件而定

Imperva 红队把自己的工作命名为 Node2Shell,在未修改的 Node.js 24.22.0(Linux on ARM64)构建上执行了攻击者提供的代码,分别以抓取响应和 Express 请求体两种方式投递。该利用需要多次尝试,未对外发布,也没有在其他构建上测试。

报告该漏洞的 OpenAI Codex Security 团队将其描述为 Brotli 中的未认证远程代码执行,并把 Node.js、Bun、Envoy 列为受影响软件。按其说法,这个漏洞是双向的:接受压缩输入的未修补服务端,可能被恶意客户端接管;接受压缩输入的未修补客户端(例如 curl --compressed),可能被恶意服务端接管。

目前没有在野利用的报告。CISA 在 10月23日的评估中把利用状态记为“无”、自动化状态记为“无”,红帽也表示没有可靠的公开概念验证能跑通代码执行。

严重性评分各家不一。分配 CVE 的谷歌在 CVSS 4.0 量表上给出 9.2,即严重;Node.js 称其为高危;红帽给出 8.1,即重要。

修复的来路有点特别。堵住漏洞的那次改动早在 2月27日就进了 Brotli 源码,但直到 10月21日才有新的 Brotli 版本把它带上。OpenAI 的说法是,根因“实际上在二月份就已在 Brotli 源码中修复,但当时并不知道它会导致一个安全漏洞,而且此后没有更新的 Brotli 发布”。Node.js 把报告归功于 OpenAI Codex Security 的 Khai Tran 和 Sylvie Mayer,修复归功于维护者 Matteo Collina 和 Antoine du Hamel。

现在该做什么

升级到修复版本,然后重启服务、重建容器镜像——运行中的进程会一直持有旧的解码器,直到重启为止。

暂时无法升级的,先停止解码不可信的 Brotli。OpenAI 的披露页面和安全公司 Aikido 都建议:

  • 在任何代理或解析器解码请求体之前,拒绝带 Content-Encoding: br 的入站请求。
  • 关闭 HTTP 客户端里的自动 Brotli 解码,在响应被解码前拒绝 Brotli 响应。
  • 在 Python 中卸载 Brotli 和 brotlicffi 包,让客户端回退到 gzip 和 deflate。

仅从 Accept-Encoding 头里去掉 br 并不管用,因为服务端可以无视客户端的要求照样发 Brotli。Node.js 方面没有发布任何绕过方案,升级运行时是唯一的解法。

系统软件包的修复节奏各不相同。Debian 在 10月23日以 1.1.0-2+deb13u1 版本修复了 Debian 13(trixie)的 brotli 包;截至 10月22日,Amazon Linux 2023 仍把其 brotli 和 Node.js 24 包列为待修复。

依赖扫描器可能还标不出 Python 包。CVE 记录指向的是谷歌的 Brotli 仓库,而不是 PyPI 上的包,GitHub 的安全公告也仍未列出受影响包,而 Dependabot 读的正是这份公告。两个 Python 包的公告条目 PYSEC-2026-4322 和 PYSEC-2026-4323 在 10月23日才补上,所以已安装版本还得手动核对一遍。