Node2Shell:Node.js、Bun 和 Python 中的 Brotli RCE(CVE-2026-111497)
CVE-2026-111497 是 CVSS v4.0 评分为 9.2 的解码器溢出漏洞,影响 Node.js、Bun、.NET、Python Brotli 包、Envoy 和 Istio;修复于 2026 年 10 月 21 至 25 日发布。
要点速览
- CVE-2026-111497 是 C Brotli 解码器中的越界写入漏洞,该代码负责解压网络上的 Brotli 压缩(
Content-Encoding: br)数据。特制数据流会破坏进程内存,导致崩溃、内存泄露或代码执行。CVE 记录将其评为 CVSS v4.0 9.2(CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N);Node.js 将其评为高危,Red Hat 的评分为 8.1。 - 漏洞存在于 Google Brotli 1.0.3 至 1.2.0,并传播到所有捆绑该代码的软件:Node.js 22.x、24.x 和 26.x,Bun 1.4.3 及更早版本,PyPI Brotli 和 brotlicffi 包,启用 Brotli 解压的 Envoy 和 Istio,cdxgen 独立构建,以及 .NET 运行时;后者在 10 月 25 日修复,覆盖 .NET 8 至 .NET 11 候选发布版。
- 暴露的前提是解码由他人控制的 Brotli 数据:
fetch()响应、Express 5 或 body-parser 2 请求体、代理解压过滤器,或 Python HTTP 客户端;后者只要安装了相关包,就会自动解码 Brotli。 - 目前没有已知的在野利用:CISA 的 10 月 23 日评估将利用情况记录为“无”。Imperva 红队在未经修改的 Node.js 24.22.0 ARM64 构建上演示了代码执行,尚未公开利用代码;10 月 22 日出现的公开概念验证仅能在刻意削弱防护的构建上执行代码,在标准构建上只会导致崩溃和有限的内存读取,Red Hat 也表示尚无可可靠执行代码的公开概念验证。
- 立即更新解码器的每个副本,然后重启服务并重新构建容器镜像:正在运行的进程会一直保留旧解码器,直到重启。
我是否受影响?
如果以下两项都成立,您就受影响:
- 您运行的软件捆绑或链接了受影响版本的 Brotli 解码器,并解码来自您无法完全控制的一方的 Brotli 数据。普通 Node.js HTTP 服务器不会自行解码请求体,因此暴露来自下列路径。
- 对 Python 而言,风险在安装 Brotli 或 brotlicffi 包时就已存在。只要安装了其中之一,requests、urllib3、httpx 和 aiohttp 等 HTTP 客户端便会自行解码 Brotli 响应,因此应用即使从未在自身代码中导入 Brotli,也可能暴露。
| 软件 | 受影响版本 | 修复版本 |
|---|---|---|
| Google Brotli(C 库) | 1.0.3 至 1.2.0 | 依分支为 1.0.10、1.1.1 或 1.2.1(2026 年 10 月 21 日) |
| Node.js 26.x | 26.12.1 之前 | 26.12.1(2026 年 10 月 21 日) |
| Node.js 24.x | 24.22.1 之前 | 24.22.1(2026 年 10 月 21 日) |
| Node.js 22.x | 22.23.4 之前 | 22.23.4(2026 年 10 月 21 日) |
| Node.js 20.x 及更早版本 | 全部(已停止支持) | 无:迁移到受支持的版本线 |
| Bun | 1.4.3 及更早版本 | 1.4.4(2026 年 10 月 22 日) |
| .NET 8 | 8.0.0 至 8.0.32 | 8.0.33(2026 年 10 月 25 日) |
| .NET 9 | 9.0.0 至 9.0.21 | 9.0.22(2026 年 10 月 25 日) |
| .NET 10 | 10.0.0 至 10.0.13 | 10.0.14(2026 年 10 月 25 日) |
| .NET 11 预览版和 RC | 11.0.0-preview.1 至 11.0.0-rc.3.26522.147 | 11.0.0-rc.3.26522.148 |
| PyPI Brotli | 1.2.1 之前 | 1.2.1 |
| PyPI brotlicffi | 1.2.1.0 之前 | 1.2.1.0 |
| Go,andybalholm/brotli | 1.2.7 之前 | 1.2.7(2026 年 10 月 23 日) |
| Envoy | 1.36.11、1.37.7、1.38.5、1.39.2 | 1.36.12、1.37.8、1.38.6、1.39.3、1.40.0 |
| Istio | 1.29.0 至 1.29.8、1.30.0 至 1.30.5、1.31.0 至 1.31.1 | 1.29.9、1.30.6、1.31.2 |
| cdxgen 独立二进制文件和镜像 | 13.4.0 及更早版本、12.8.8 及更早版本 | 13.5.0、12.8.9 |
| PHP 官方 Windows 构建 | 2026 年 10 月 21 日的 8.5.12、8.4.27、8.3.36 和 8.2.35(根据构建 SBOM,捆绑 Brotli 1.2.0) | 8.5.12-1、8.4.27-1、8.3.36-1 和 8.2.35-1,即 10 月 26 日捆绑 Brotli 1.2.1 的重新构建版本 |
.NET 公告 GHSA-p3jp-9v83-76w9(高危,CVSS v3.1 8.1)覆盖四条发布线的 225 个 NuGet 包,且与代理有相同的前提条件:ASP.NET Core 和 HttpClient 的默认配置不会自动解压 Brotli 数据,因此 .NET 应用只有启用 Brotli 解压,或对攻击者控制的数据显式使用 BrotliStream、BrotliDecoder 或自动解压选项时才会暴露。.NET Framework 不受影响。
解码器的 Go 移植版 andybalholm/brotli 在其 decodeBlockTypeAndLength 中也混淆了返回值,Andy Balholm 于 2026 年 10 月 23 日以提交 33c2a988 修复,直接移植 Google 的修复 0ed4268,并以 v1.2.7 发布,没有公告,也没有 CVE。其影响范围小于 C 解码器:Go 对切片访问进行边界检查,会将越界的块类型索引变为 panic,而非静默的越界写入,因此 Go 中的故障表现为攻击者输入导致崩溃,而不是 C 库中可能发生的内存破坏。解压攻击者提供的 Brotli 数据的 Go 服务仍应升级至 1.2.7 或更高版本。
除了表中项目,自行编译解码器副本的项目也会继承此漏洞,直到更新;社区跟踪器正在跟踪它们。截至 10 月 24 日已修复:Ruby brotli gem 0.9.1、PHP brotli 扩展 0.21.1 和 UEFITool A76,均捆绑 Brotli 1.2.1;还有 MuPDF 1.28.x,其 Brotli 分支已于 4 月纳入修复。截至 10 月 27 日仍未发布修复版本:ClickHouse、NanaZip、GraalJS(graal-nodejs)、YDB 和 libjxl,这些项目已将修复合并到主分支,但最新发行版仍捆绑受影响解码器;以及 Apache Arrow,其强制使用更新 Brotli 版本的 C++ 变更,即拉取请求 #55167,仍未合并。
一个捆绑副本较晚才得到修复,值得明确指出,因为版本检查无法识别它。PHP 在 10 月 21 日发布的官方 Windows 安全构建 8.5.12、8.4.27、8.3.36 和 8.2.35,其软件物料清单中包含 Brotli 1.2.0;应用开启 HTTP 响应自动解压时,cURL 扩展就可触达它。PHP Foundation 指出,cURL 默认关闭此功能,但应用及 HTTP 客户端库可以启用它。10 月 26 日,PHP 团队用 Brotli 1.2.1 将四者重新构建为 8.5.12-1、8.4.27-1、8.3.36-1 和 8.2.35-1;PHP 源码没有变化,因此更新前后 php -v 输出相同版本,重新构建版本只能通过包名中的 -1 后缀和下载页上的 SHA-256 识别。Guzzle 是开箱即满足暴露条件的客户端库:根据其 7.16.1 和 8.3.1 源码,只要 decode_content 选项不为 false,其 cURL 处理器就会将 CURLOPT_ENCODING 设为空值,而空值表示让 cURL 接受并解压其支持的所有编码。
Envoy 和 Istio 在显式启用 Brotli 解压时受影响,例如通过 Envoy 解压过滤器。未开启时,漏洞不可达。
检查主机、容器和 CI 镜像中运行的软件:
node --version && node -p "process.versions.brotli" # Node.js: runtime and bundled decoder
bun --version # Bun 1.4.4+ is fixed
python -m pip show Brotli brotlicffi 2>/dev/null | grep -E '^(Name|Version)'
envoy --version # only meaningful with decompression enabled
istioctl version
curl -V | grep -o 'brotli/[0-9.]*' # brotli library linked into curl, e.g. brotli/1.1.0
go list -m all | grep brotli # Go: andybalholm/brotli 1.2.7+ is fixed
对于 Node.js,锁文件无法回答这个问题:应用通过内置 node:zlib 模块解码 Brotli,而该模块使用运行时捆绑的解码器,因此应检查上面的 Node.js 版本。npm brotli 包是用于 WOFF2 字体的独立 JavaScript 移植版,并非 C 解码器,它是否出现在 package-lock.json 中与暴露情况无关。对于 Python,固定的依赖要求确实重要:
grep -iE '^(brotli|brotlicffi)' requirements.txt
PyPI Brotli 包每月下载量约为 8280 万次,因此这一依赖广泛存在于应用和 CI 技术栈中。
如何修复?
更新所有位置的解码器,然后重启进程并重新构建所有容器镜像:正在运行的进程会将旧解码器保留在内存中,直到重启。
- Node.js:更新到 2026 年 10 月 21 日安全发布中的 26.12.1、24.22.1 或 22.23.4。Node.js 20.x 已停止支持,不会获得修复;请将这些部署迁移到受支持的版本线。
- Bun:更新到 2026 年 10 月 22 日发布的 1.4.4。
- Python:执行
pip install --upgrade Brotli brotlicffi,升级至 1.2.1 和 1.2.1.0,并重新构建固定了任一包版本的镜像。 - Go:对所有解压攻击者提供的 Brotli 数据的服务,将 andybalholm/brotli 更新至 1.2.7 或更高版本。
- .NET:更新到 8.0.33、9.0.22、10.0.14 或 11.0.0-rc.3.26522.148。只有显式启用 Brotli 解压,或对攻击者控制的数据使用 Brotli API,才会暴露;.NET Framework 不受影响。自包含和 NativeAOT 部署携带自己的运行时副本,因此更新机器上的共享运行时无法修复它们:使用更新的运行时重新构建并部署自包含应用,并使用已修补的 SDK 重新发布 NativeAOT 应用。根据社区跟踪器,公开 GitHub 分支尚未同步内部修复,因此从 GitHub 源码构建的版本仍受影响。
- Envoy 和 Istio:如果配置中启用了 Brotli 解压,更新到表中的修复版本。
- Google Brotli,如果您直接基于它构建:根据所在分支升级至 1.0.10、1.1.1 或 1.2.1。
- Windows 上的 PHP:从 PHP 下载页安装 -1 重新构建版本,即 8.5.12-1、8.4.27-1、8.3.36-1 或 8.2.35-1,并验证 SHA-256,因为
php -v无法将它们与 10 月 21 日构建区分。在重新构建前,PHP 侧的临时措施是停止自动解压:不要设置CURLOPT_ENCODING,并在 Guzzle 中将decode_content请求选项设为 false;这会停止所有自动解码,因此 gzip 响应也会保持压缩状态。 - curl 及其他链接系统库的工具:更新操作系统软件包。Debian 于 2026 年 10 月 23 日为 Debian 13(trixie)修复了 brotli 1.1.0,版本为 1.1.0-2+deb13u1;截至 2026 年 10 月 22 日,Amazon Linux 2023 仍将其 brotli 和 Node.js 24 包列为等待修复,因此请检查您使用的发行版状态。
如果暂时无法更新,请停止解码不可信 Brotli 数据。OpenAI 披露页面和 Aikido 给出的建议是:
- 在任何代理或解析器解码请求体之前,拒绝携带
Content-Encoding: br的传入请求。 - 关闭 HTTP 客户端的自动 Brotli 解码,并在解码之前拒绝 Brotli 响应。
- 在 Python 中卸载 Brotli 和 brotlicffi 包,让客户端回退至 gzip 和 deflate。
必须明确这些措施的局限。仅从 Accept-Encoding 头移除 br 无济于事,因为无论客户端请求什么,服务器都可以发送 Brotli。对于 Node.js 本身,目前没有公开的通用临时措施,因此更新运行时是唯一修复办法。与此同时,可以封闭一条入站路径:将 Express 5 和 body-parser 2 解析器设置为 inflate: false,便会在解压前以 415 错误拒绝任何压缩请求体;但这对 fetch() 响应或其他解码 Brotli 的代码无效。Web 应用防火墙仅提供部分帮助:在披露当天发布防火墙规则的 Vercel 表示,这些规则不覆盖“函数从其他服务器获取的响应”,只有更新运行时才能封闭这条路径。
根本原因是什么?
解码器将永久性的格式错误报告为可恢复的“需要更多输入”状态,而快速解码路径连这一状态也丢弃了,因此解码在本应停止的位置之后继续,并写出了内部缓冲区。 漏洞位于 c/dec/decode.c 中的 DecodeBlockTypeAndLength,Evgenii Kliuchnikov 于 2026 年 2 月 27 日提交的修复 0ed4268 揭示了具体机制。
修复之前,该函数返回库内的布尔类型 BROTLI_BOOL。BROTLI_FALSE 有两种截然不同的含义:数据流格式错误,以及可以靠更多输入补全的不完整读取:
static BROTLI_INLINE BROTLI_BOOL DecodeBlockTypeAndLength(
int safe, BrotliDecoderState* s, int tree_type) {
...
if (max_block_type <= 1) {
- return BROTLI_FALSE;
max_block_type <= 1 表示数据流声明了单一块类型,因此此时出现块切换命令是无效输入,而非暂停的读取。调用者无法区分这两种情况。在流式路径中,Node.js 描述了其后果:“无效块切换被报告为暂时需要更多输入,而非永久性格式错误,因此流式解码器持续将输入字节追加到一个八字节内部缓冲区。”
在快速路径中,结果被完全丢弃。字面量块切换的不安全变体声明为 void,因此失败从未传递给调用者:
-static void BROTLI_NOINLINE DecodeLiteralBlockSwitch(BrotliDecoderState* s) {
- DecodeLiteralBlockSwitchInternal(0, s);
三个块切换调用点使用的 BROTLI_SAFE 宏,在推测性安全模式下检查结果,在不安全模式下则忽略它。修复增加的注释直接说明:“在‘不安全’执行情况下,输入保证充足,结果会被忽略。”这一保证仅适用于格式正确的数据流,而不适用于携带无效块切换的数据流,因此快速路径会继续使用过期的块类型环形缓冲区和 Huffman 树状态解码,后续写入便落到缓冲区末尾之外。该漏洞的 GitHub 公告标记为 CWE-252,即未检查返回值;溢出本身属于 CWE-787,即越界写入。
如何利用?
攻击只需要一条使目标解压攻击者控制的 Brotli 数据的投递路径,再加一个特制数据流。步骤如下:
- 攻击者构造一个 Brotli 数据流,使其在该树仅声明一种块类型时,携带块切换命令到达
DecodeBlockTypeAndLength。 - 该数据流作为
fetch()调用的Content-Encoding: br响应、由 Express 5 或 body-parser 2 解析的 Brotli 压缩请求体,通过 Envoy 或 Istio 解压过滤器,或作为已安装 Brotli 的 Python HTTP 客户端自动解码的响应投递。 - 无效块切换返回
BROTLI_FALSE。流式路径将其理解为“继续提供字节”;快速路径则丢弃它。两者都继续解码,而非拒绝数据流。 - 使用过期块类型状态的解码,将受攻击者影响的数据写到内部解码器缓冲区末尾之外,破坏相邻进程内存。
- 内存破坏导致进程崩溃、内存泄露或执行流重定向。Imperva 红队将其研究称为 Node2Shell,在未经修改的 Linux ARM64 Node.js 24.22.0 构建上运行了攻击者提供的代码,分别通过获取的响应和 Express 请求体投递载荷。该利用需要多次尝试,尚未公开,也未在其他构建上测试。
报告此漏洞的 OpenAI Codex Security 团队描述了双向暴露:“接受压缩输入的未修补服务器可能被恶意客户端接管,而接受压缩输入的未修补客户端(例如 ‘curl --compressed’)可能被恶意服务器接管。”
攻击流程是什么?
流程很短:通过任意 Brotli 解码路径投递特制数据流,让混淆的错误状态使解码器越过无效块切换后继续运行,后续写入便落在缓冲区之外。
特制 Brotli 数据流"] --> B["经 fetch 响应、请求体
或代理过滤器投递"] B --> C["解码器遇到无效切换:
格式错误,而非输入不足"] C --> D["TRUE 或 FALSE 布尔值混淆
两种状态:错误报告失效"] D --> E["快速路径丢弃结果
并继续解码"] E --> F["过期块类型状态导致
写入越过缓冲区末尾"] F --> G["崩溃、内存泄露
或代码执行"]
攻击者能做什么?
- 使解码进程崩溃。拒绝服务是最可靠的结果,因为堆破坏常常在其他行为发生前就导致崩溃。
- 泄露进程内存。相邻解码器状态及堆内容可能通过受损的解码结果泄露。
- 执行代码。Imperva 已在一个 Node.js 构建上演示;可靠性取决于进程堆布局,这正是演示需要多次尝试,以及 Red Hat 表示尚无可靠公开利用代码的原因。
- 同时危害客户端和服务器。从恶意或已失陷服务器解码 Brotli 的未修补客户端,以相同方式暴露;大多数服务端加固措施无法覆盖这条路径。
攻击者需要的条件:如上所列,一条针对攻击者控制的 Brotli 数据的解码路径,除此之外别无要求。除承载数据的 HTTP 交互本身外,无需其他身份验证;服务端解码无需用户交互。
修复为什么有效?
提交 0ed4268“更早检测并报告无效数据流”重构了错误处理,使两种状态不再归为一个布尔值:
DecodeBlockTypeAndLength现在返回三态的BrotliDecoderErrorCode:成功、不可恢复错误,或需要更多输入。- 无效块切换返回新的永久性错误
BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH,错误码为 -17,该值此前在头文件中标为“保留”。 - 不完整读取单独返回
BROTLI_DECODER_NEEDS_MORE_INPUT,因此流式循环保留了合法的恢复行为。 - 新增的
BROTLI_SAFE_WITH_STATUS宏同时检查安全和不安全路径中的状态,失败时跳转到saveStateAndReturn,因此快速路径不再能忽略块切换错误:
+#define BROTLI_SAFE_WITH_STATUS(METHOD) \
+ { \
+ BrotliDecoderErrorCode status; \
+ if (safe) { \
+ status = Safe##METHOD; \
+ } else { \
+ status = METHOD; \
+ } \
+ if (status != BROTLI_DECODER_SUCCESS) { \
+ result = status; \
+ goto saveStateAndReturn; \
+ } \
+ }
三个块切换调用点现在都使用检查状态的宏,补丁还增加了针对元块长度不变量的调试断言。此修复完整覆盖该漏洞:无效块切换现在在每条路径上都会成为明确报告的永久性错误。
部署层面的教训与代码同样重要。修复于 2026 年 2 月 27 日进入 google/brotli 源码,但直到 2026 年 10 月 21 日才有 Brotli 发行版包含它。OpenAI 的说明是:根本原因“实际上已于 2 月在 Brotli 源码中修复,但当时并不知道它会引发安全漏洞,也没有更新的 Brotli 发行版”。随后,每个运行时和软件包都必须在 10 月发布自己的修复副本,这也解释了为何上面的修复版本跨越三天和八个生态系统。
如何检查是否已遭入侵?
目前没有在野利用报告,也没有该漏洞的失陷指标。CISA 在 2026 年 10 月 23 日的评估中将利用情况记为“无”,自动化记为“否”。
在情况改变之前,一般应关注:处理 Brotli 编码流量的 Node.js、Bun、Envoy 或 Istio 进程中集中出现的崩溃,这些进程崩溃转储中的内存内容异常,以及如果主机确实发生了代码执行,通常会留下的异常子进程和出站连接等进程级痕迹。在 Brotli 解码路径发现这些迹象时,应先视为相关,直到证实无关;应对方式与疑似代码执行的标准处理一致:隔离、创建快照、轮换进程可访问的凭据,并从干净镜像重新构建。
时间线
- 2026-02-27:提交
0ed4268将修复纳入 google/brotli;随后没有发行版,安全影响尚未被识别。 - 2026-10-21:Node.js 发布 26.12.1、24.22.1 和 22.23.4,google/brotli 发布 1.0.10、1.1.1 和 1.2.1。
- 2026-10-22:CVE-2026-111497 发布,CVSS v4.0 评分为 9.2;Bun 1.4.4 发布;针对 Python 包的 GitHub 公告 GHSA-9v8h-qqgm-4m35 发布。
- 2026-10-23:Imperva 的 Node2Shell 演示得到报道;CISA 记录无利用;GitHub 公告更新,映射低于 1.2.1 的 pip brotli 和低于 1.2.1.0 的 brotlicffi;Debian 修复 trixie 的 brotli 包;新增 PYSEC-2026-4322 和 PYSEC-2026-4323;Andy Balholm 以提交 33c2a988 将修复移植到 Go 解码器,并以 andybalholm/brotli v1.2.7 发布。
- 2026-10-24:跨生态系统的受影响版本矩阵发布。
- 2026-10-25:Microsoft 发布 .NET 公告 GHSA-p3jp-9v83-76w9,修复覆盖 .NET 8、9、10 和 11 候选发布版的 225 个 NuGet 包;社区跟踪器记录了 10 月 24 日的 Ruby brotli gem、PHP brotli 扩展和 UEFITool 修复。
- 2026-10-26:PHP 用 Brotli 1.2.1 将官方 Windows 包重新构建为 8.5.12-1、8.4.27-1、8.3.36-1 和 8.2.35-1,距 10 月 21 日发布 SBOM 中包含 Brotli 1.2.0 的构建已过去五天。
- 2026-10-25:本文发布,10 月 27 日更新 PHP Windows 重新构建版本、Guzzle 暴露条件和 Apache Arrow 状态。
常见问题
普通 Node.js HTTP 服务器是否暴露?
普通 Node.js 服务器不会自行解码请求体,因此不在已演示的路径内。服务器通过 Express 5 或 body-parser 2 解析 Brotli 请求体、调用 fetch() 并解码 Content-Encoding: br 响应,或其自身代码将不可信数据传给 zlib.brotliDecompress()、zlib.createBrotliDecompress() 或其他 node:zlib Brotli API(例如在 WebSocket 处理器、RPC 流或文件处理流水线中)时,才会暴露。如果您的代码中没有任何这些行为,仍值得按计划更新运行时。
从 Accept-Encoding 移除 br 能保护客户端吗?
不能。无论客户端请求什么,服务器都能发送 Brotli,而 Python 客户端只要安装了相关包就会自动解码 Brotli。应在客户端配置中关闭自动 Brotli 解码,在解码之前拒绝 Brotli 响应,或卸载 Python 包,使客户端回退到 gzip 和 deflate。
为什么修复从 2 月到 10 月才到达用户?
该变更于 2026 年 2 月 27 日进入 google/brotli 源码,但此后直到 10 月的安全响应,项目都没有发布新版本,当时也不知道该变更的安全影响。包括 Node.js 和 Bun 在内,内置解码器副本的运行时需要等到有可供纳入的发行版,才能采用修复。
依赖扫描器能标记这些 Python 包吗?
GitHub 公告于 2026 年 10 月 23 日更新,现在已映射低于 1.2.1 的 pip brotli 和低于 1.2.1.0 的 brotlicffi,PYSEC-2026-4322 和 PYSEC-2026-4323 条目也已存在,因此同步数据库的工具能够标记它们。过时或隔离网络中的工具可能滞后于这些更新,因此本周可靠的检查方式是如上所示手动检查已安装版本。
Envoy 和 Istio 默认暴露吗?
不。两者在显式启用 Brotli 解压时受影响,例如通过 Envoy 解压过滤器。如果配置从不解压 Brotli,漏洞便不可达;如果会解压,则应采用表中的修复版本。
curl 和其他系统工具呢?
curl 和许多其他工具链接操作系统的 Brotli 库,而非自行捆绑。curl -V 会显示链接版本,例如 brotli/1.1.0。请通过发行版更新:Debian 于 2026 年 10 月 23 日发布了 trixie 的修复包,其他发行版按各自进度发布。
在攻击者之前找出旧解码器
使用 Ostorlab 扫描代码仓库、容器镜像和互联网暴露服务,找出仍捆绑早于 2026 年 10 月 21 日修复版本的 Brotli 解码器的每个 Node.js、Bun 和 Python 部署。
参考资料
- CVE-2026-111497 记录,包含 CVSS v4.0 9.2 向量及 1.0.3 至 1.2.0 受影响范围:https://cveawg.mitre.org/api/cve/CVE-2026-111497 (核查于 2026 年 10 月 25 日)
- Node.js 2026 年 10 月 21 日安全发布,包含各漏洞说明、受影响版本线、修复版本和致谢(报告者为 OpenAI Codex Security 的 Khai Tran 和 Sylvie Mayer;修复者为 Matteo Collina 和 Antoine du Hamel):https://nodejs.org/en/blog/vulnerability/october-2026-security-releases (核查于 2026 年 10 月 25 日)
- 修复提交 0ed4268,“更早检测并报告无效数据流”,Evgenii Kliuchnikov,2026 年 2 月 27 日:https://github.com/google/brotli/commit/0ed4268 (核查于 2026 年 10 月 25 日)
- google/brotli 发行版 1.0.10、1.1.1 和 1.2.1,发布于 2026 年 10 月 21 日:https://github.com/google/brotli/releases (核查于 2026 年 10 月 25 日)
- GHSA-9v8h-qqgm-4m35,已审查公告,映射 pip brotli 和 brotlicffi,并标记 CWE-252:https://github.com/advisories/GHSA-9v8h-qqgm-4m35 (核查于 2026 年 10 月 25 日;PyPI 映射于 2026 年 10 月 23 日更新中添加)
- Bun 1.4.4 发布,2026 年 10 月 22 日:https://github.com/oven-sh/bun/releases/tag/bun-v1.4.4 (核查于 2026 年 10 月 25 日)
- andybalholm/brotli 修复提交 33c2a988,“更早检测并报告无效数据流”,移植自 Google 修复,2026 年 10 月 23 日,以 v1.2.7 发布:https://github.com/andybalholm/brotli/commit/33c2a988 和 https://github.com/andybalholm/brotli/releases/tag/v1.2.7 (核查于 2026 年 10 月 26 日)
- Microsoft 的 .NET 公告 GHSA-p3jp-9v83-76w9,CVE-2026-111497,在 8.0.33、9.0.22、10.0.14 和 11.0.0-rc.3.26522.148 中修复 225 个 NuGet 包,说明自动解压前提和 .NET Framework 不受影响:https://github.com/dotnet/runtime/security-advisories/GHSA-p3jp-9v83-76w9 和 https://github.com/dotnet/announcements/issues/494 (核查于 2026 年 10 月 26 日)
- Broccoli2Shell 社区跟踪器,跟踪捆绑副本、10 月 22 日公开概念验证的状态(标准构建上崩溃及有限内存读取,只有刻意削弱防护的构建才能代码执行)和各项目修复状态:https://broccoli2shell.com/ (核查于 2026 年 10 月 26 日)
- Envoy 公告 GHSA-3wvj-j6qm-62mr:https://github.com/envoyproxy/envoy/security/advisories/GHSA-3wvj-j6qm-62mr (核查于 2026 年 10 月 25 日)
- Istio 安全公告 2026-007:https://istio.io/latest/news/security/istio-security-2026-007/ (核查于 2026 年 10 月 25 日)
- cdxgen 公告 GHSA-5266-jm88-3grm:https://github.com/cdxgen/cdxgen/security/advisories/GHSA-5266-jm88-3grm (核查于 2026 年 10 月 25 日)
- The Hacker News,“导致 Node.js RCE 的 Brotli 解码器漏洞也影响 Bun、Python 和其他广泛使用的软件”,2026 年 10 月 24 日,含受影响矩阵、OpenAI 关于双向影响的引文、CISA 和 Red Hat 评估及临时措施建议:https://thehackernews.com/2026/10/brotli-decoder-flaw-behind-nodejs-rce.html (核查于 2026 年 10 月 25 日)
- The Hacker News 对 Imperva Node2Shell 演示的报道,2026 年 10 月 23 日:https://thehackernews.com/2026/10/researchers-demonstrate-node2shell-rce.html (核查于 2026 年 10 月 25 日)
- OpenAI 在 patchtheplanet.org 的漏洞披露页面:https://patchtheplanet.org/brotli (通过 The Hacker News 2026 年 10 月 24 日报道引用;此环境无法将该页面渲染为静态文本)
- Red Hat 的 CVE 评估,评分 8.1,并指出没有可靠的公开概念验证:https://access.redhat.com/security/cve/CVE-2026-111497 (通过 The Hacker News 2026 年 10 月 24 日报道引用)
- Vercel 关于防火墙规则局限的 Node.js 安全通告:https://vercel.com/kb/bulletin/node-js-security-advisory (通过 The Hacker News 2026 年 10 月 24 日报道引用)
- Debian 对 brotli 1.1.0-2+deb13u1 的安全公告,2026 年 10 月 23 日:https://lists.debian.org/debian-security-announce/2026/msg00498.html (通过 The Hacker News 2026 年 10 月 24 日报道引用)
- Brotli 的 PyPI 下载统计,每月约 8280 万次:https://pypistats.org/packages/brotli (核查于 2026 年 10 月 25 日)
- Aikido 对 Python 包暴露及临时措施的分析:https://www.aikido.dev/blog/python-packages-vulnerable-node2shell-brotli-cve-2026-111497 (通过 The Hacker News 2026 年 10 月 24 日报道引用)
- PHP Foundation,“针对 Brotli 安全修复更新的 PHP Windows 构建”,2026 年 10 月 26 日:采用 Brotli 1.2.1 的 8.5.12、8.4.27、8.3.36 和 8.2.35 的 -1 重新构建版本、cURL 自动解压可达性及 -1 后缀的含义:https://www.php.net/archive/2026.php#2026-10-26-1 (核查于 2026 年 10 月 27 日)
- The Hacker News,“PHP 五天内第二次发布 Windows 安全更新,修复 Brotli 代码执行漏洞”,2026 年 10 月 26 日,含 10 月 21 日构建中 Brotli 1.2.0 的 SBOM 证据、针对 Guzzle 7.16.1 和 8.3.1 源码发现的默认设置,以及 OpenAI 的临时措施建议:https://thehackernews.com/2026/10/php-issues-second-windows-security.html (核查于 2026 年 10 月 27 日)
- Guzzle cURL 处理器源码,7.16.1,
src/Handler/CurlFactory.php,除非decode_content为 false,否则将CURLOPT_ENCODING设为空值:https://github.com/guzzle/guzzle/blob/7.16.1/src/Handler/CurlFactory.php (核查于 2026 年 10 月 27 日) - Apache Arrow 拉取请求 #55167,“GH-55165:[C++] 强制使用更新版本的 Brotli”,截至 2026 年 10 月 27 日仍未关闭:https://github.com/apache/arrow/pull/55167 (核查于 2026 年 10 月 27 日)