内容提要
CVE-2026-111497 是谷歌 Brotli 解码器缺陷,影响范围超出 Node.js,可导致 .NET 原生崩溃、FFmpeg 经 libjxl 内存损坏、ClickHouse 崩溃及 Apache Arrow 无限解码循环。受影响的上游版本为 Brotli 1.0.3 至 1.0.10 之前、1.1.0 及 1.2.0 早期版本。部分项目已单独修复,需核查厂商补丁而非仅看版本号。团队应追踪不可信数据进入解压代码的路径。
延伸解读
漏洞根源不在 HTTP,而在 Brotli 解码器
CVE-2026-111497 虽因 Node.js 安全更新进入公众视野,但问题实际出在谷歌 Brotli 解码器处理非法块切换的逻辑上。解码器将畸形数据误判为“需要更多输入”,继续在损坏状态下处理,最终导致越界写入。这意味着任何使用受影响 Brotli 版本的软件都可能暴露,而非仅限于 Web 服务器或 HTTP 流量。
不同项目表现各异,崩溃与死循环并存
同一缺陷在不同软件栈中触发方式不同:.NET 出现原生段错误直接终止进程;FFmpeg 经 libjxl 处理恶意 JPEG XL 图片时发生内存损坏;ClickHouse 收到 23 MB 压缩体后崩溃并中断查询;Apache Arrow 则因 534 字节输入陷入无限循环、持续消耗 CPU。这些差异说明影响程度取决于各项目如何使用解码库。
版本号不可靠,须核查厂商补丁记录
受影响的上游 Brotli 版本包括 1.0.3 至 1.0.10 之前、1.1.1 之前的 1.1.0,以及 1.2.1 之前的 1.2.0。但部分项目可能在不升级上游版本的情况下单独应用修复,因此仅凭版本号判断是否安全并不可靠。团队应核查各厂商的补丁说明,确认实际修复状态。
排查重点:不可信数据进入解压代码的路径
JFrog 的演示覆盖本地控制台应用、媒体文件、HTTP 请求体和 pyarrow 输入,说明攻击面取决于不可信数据如何流入解压代码。团队应追踪文件、缓冲区、请求和响应进入 Brotli 解码的路径。扫描工具可帮助识别潜在入口,但匹配结果本身不能证明可被远程利用,需结合具体调用场景判断。
Q&A
CVE-2026-111497 漏洞的根本原因是什么?
该漏洞源于谷歌 Brotli 解码器的一个缺陷:非法的块切换(block switch)被误判为“需要更多输入”的请求,导致处理过程在损坏的解码器状态下继续,最终越界写入预期内存缓冲区之外。
哪些上游 Brotli 版本受到该漏洞影响?
受影响的上游版本包括:Brotli 1.0.3 至 1.0.10 之前的版本、1.1.1 之前的 1.1.0,以及 1.2.1 之前的 1.2.0。
除了 Node.js,这个 Brotli 漏洞还会影响哪些软件?
该漏洞还影响 .NET 应用(导致原生崩溃)、FFmpeg(通过 libjxl 处理 JPEG XL 图像时造成内存损坏)、ClickHouse(服务器崩溃)以及 Apache Arrow(无限解码循环)。
在 FFmpeg 中,攻击者如何利用这个 Brotli 漏洞?
攻击者通过构造一张 JPEG XL 图像,在压缩的元数据盒中携带畸形的 Brotli 数据。当 libjxl 解码这些数据时,内存损坏导致进程在清理阶段崩溃,且攻击者能够控制一个被损坏的指针值。但尚未证实完整的远程代码执行利用链。
Apache Arrow 受该漏洞影响的表现是什么?
通过 pyarrow 的 Brotli 解码路径发送一个 534 字节的输入,便引发了无限循环,持续消耗 CPU 且无法完成。而 Brotli 1.2.1 在不到一秒内就拒绝了同样的输入。该问题在 Arrow 上的跟踪议题仍处于开启状态。
团队应如何防范这个 Brotli 解码器漏洞?
团队应追踪不受信任的文件、缓冲区、请求和响应是如何进入解压代码的。同时,必须核查厂商的补丁记录,而不能仅凭版本号判断,因为各项目可能在不升级到上游版本的情况下就应用了修复。JFrog 的扫描工具可帮助识别潜在路径,但仅凭匹配结果并不能证明可被远程利用。