不止 Node.js!Brotli RCE(CVE-2026-111497)影响范围说明

· 2026-10-29 14:32 · 26 阅读

原创 微步情报局 2026-10-29 14:32 北京

点击查看漏洞详情

漏洞概况

CVE-2026-111497 是 Google Brotli C 解码器中的越界写漏洞(CVSS 4.0 9.2)。Brotli 解码器在处理畸形 Brotli 输入数据时,会在解码过程中触发越界写入,成功利用可能导致拒绝服务、进程内存读取和远程代码执行。

Google Brotli 受影响版本为 1.0.3–1.0.9、1.1.0 和 1.2.0,其修复代码于 2026 年 2 月进入 google/brotli 仓库。Google 于 10 月 21 日发布修复版本 1.0.10、1.1.1 和 1.2.1,该漏洞同日随 Node.js 安全更新被广泛披露。

Brotli 是常见的压缩实现,HTTP 流量里的 br 编码会交给解码器,部分字体和 Parquet 文件同样会调用它。Node.js、Bun、Python 软件包、.NET、代理与防火墙、开发工具以及文件处理软件,往往各自编译或链接一份 C 解码器。缺陷位于这份被广泛集成的上游库,各产品里的副本彼此独立,升级其中一款,无法修复其余产品中的解码器,许多下游产品仍带着未修复副本。

影响范围

1. 已发布修复版本的产品

产品

修复版本

默认配置下是否自动解压

Node.js 22 / 24 / 26

22.23.4 / 24.22.1 / 26.12.1

客户端 fetch(出站)会;Express 5 的 json() / raw()(入站)会;仅 http.createServer、未接解压中间件 不会

Bun

1.4.4

客户端 fetch(出站)会

PyPI Brotli / brotlicffi

1.2.1 / 1.2.1.0

环境里装了其中之一后,调用常见 HTTP 客户端方法会自动解压 br

Envoy

1.40.0 / 1.39.3 / 1.38.6 / 1.37.8 / 1.36.12

不会

(需配置)

Istio

1.31.2 / 1.30.6 / 1.29.9

不会

(需配置)

.NET 8 / 9 / 10 / 11

8.0.33 / 9.0.22 / 10.0.14 / 11 第 3 个候选发布版(RC3)

不会

(请求解压与 HttpClient 自动解压默认关闭)

PAN-OS

以 Palo Alto 通告热修复表为准

不会

(Brotli 流量检查默认关闭;11.2.3 及更早不支持)

PowerShell 7

7.4.22 / 7.5.13 / 7.6.9

对不受控站点使用 Invoke-WebRequest / Invoke-RestMethod 时

PHP 官方 Windows 包

8.5.12-1 / 8.4.27-1 / 8.3.36-1 / 8.2.35-1(Brotli 1.2.1)

不会

(cURL 自动解压默认关闭)

Visual Studio

2019 16.11.61;2022 17.14.43;2026 18.11.2

取决于安装的组件

Prisma Cloud Transporter Client

0.2.9

会

注:“默认配置下是否自动解压”指在常见默认配置下,是否会自动解压不可信的 Brotli 数据。

2. 尚未发布修复版本的产品

截至 2026-10-29,这些产品尚无包含修复的正式版本,修复前不要用来处理不可信的输入。

产品

现状

不可信输入

DuckDB

最新正式版 2.0.0 内置未修复的 Brotli 1.1.0

Brotli 压缩的 Parquet

Apache Arrow

最新正式版 26.0.0 的打包构建使用 Brotli 1.0.9;链接已修复系统库的构建不受影响

Brotli 压缩的 Parquet / Arrow IPC

google/woff2

10 月 28 日已合入 Brotli 1.2.1,但尚无新正式版;旧源码随附 1.0.3,CMake 构建可使用系统库

WOFF2 字体

公开扫描名单(Semgrep、broccoli2shell)依据的是软件中含有受影响版本的的 decode.c。可视为排查线索,不等同当前应用可被远程利用。

不可信数据如何进入解码器

本漏洞在进程对不可信数据执行 Brotli 解压时触发,常见情况可分为以下场景:

1. 应用作为 HTTP 客户端

应用作为 HTTP 客户端访问外部资源,响应头为 Content-Encoding: br 时解压响应:

  • Node.js: 内置 fetch()、axios、got 默认解压。

  • Bun:fetch 默认解压响应;node:zlib 的 Brotli 解压方法、DecompressionStream("brotli") 在显式调用时解压。

  • Python: 装了 Brotli 或 brotlicffi 后,urllib3、requests、httpx、aiohttp 默认解压,即使业务代码没有 import brotli。

  • .NET HttpClient: 打开 AutomaticDecompression 的 Brotli 或 All 才会解压。默认关闭。

  • PHP 官方 Windows 包: cURL 自动解压默认关闭,应用或客户端库可以打开。

  • PowerShell 7: 对不受控站点使用 Invoke-WebRequest / Invoke-RestMethod 时会解压。

2. 应用作为 HTTP 服务端

应用作为 HTTP 服务端,请求头为 Content-Encoding: br 时解压请求体:

  • Express 5 / body-parser 2:json()、raw() 默认解压;NestJS、Koa + koa-bodyparser 在使用支持 Brotli 的适配器或解析中间件时同样。仅 http.createServer 不会自动解压;Express 4 自带解析器不支持 Brotli,但另接支持 Brotli 的中间件后仍会解压。

  • Flask: 默认不解压。

  • ASP.NET Core: 注册 AddRequestDecompression() 并调用 UseRequestDecompression() 后默认支持 br。应用默认不启用该中间件。

3. 代理、服务网格、防火墙

反向代理、服务网格或防火墙若对流量做 Brotli 解压,解压发生在这些设备上。

  • Envoy: 配置了 Brotli 解压器才会解压。

  • Istio: 启用 Brotli 解压(例如 EnvoyFilter)才会解压。

  • PAN-OS: 同时开启 Brotli 流量检查与 TLS 解密才会解压;默认关闭。

4. 文件工具

升级系统 libbrotli 无法修复程序内部静态链接的 Brotli;动态链接系统库的构建可通过更新系统库修复。正式修复发布前,不要打开或导入来源不可信的这类文件。

  • DuckDB / Apache Arrow: 读取 Brotli 压缩的 Parquet 时会解压;Arrow 读取含 Brotli 压缩数据的 IPC 文件也会解压。

  • google/woff2: 解码 WOFF2 时会解压。

5. 开发工具与配套客户端

  • Visual Studio: 随安装的组件携带 Brotli,以实际安装的组件为准。

  • Prisma Cloud Transporter Client: 通告写明无需特殊配置。

  • .NET 运行时: 请求解压、HttpClient 自动解压默认关闭;使用 BrotliStream 解压模式 / BrotliDecoder 处理输入时会解压。

  • Node.js / Bun / Electron: Electron 内嵌的 Node、已分发的 bun build --compile 是另一份副本,升级宿主机无法更新。

修复建议

  1. 优先升级会解压不可信 HTTP br 数据的应用。 Node.js 升到 22.23.4 / 24.22.1 / 26.12.1 并重启(细节见上述 Node.js 说明)。Bun 升到 1.4.4;已用 bun build --compile 生成的文件,用 1.4.4 重新编译。已安装 PyPI Brotli 或 brotlicffi 的 Python 环境,把包升到 1.2.1 / 1.2.1.0。升级后重建容器镜像并重启进程。

  2. 检查应用是否会把不可信 br 数据交给受影响的解码器处理。

  3. 升级系统库 libbrotlidec,并重启仍加载旧动态库的进程。

  4. 对于静态链接或内嵌自编译 Brotli C 解码器的程序,需安装该软件的修复版本或重新构建。

  5. 正式修复发布前,不要用尚未修复的文件工具打开或导入来源不可信的 Parquet、WOFF2 等文件。

跳转微信打开

本文转载自微信公众号「微步在线研究响应中心」,查看原文。版权归原作者所有,如有侵权请联系删除。