安全指南

Brotli 漏洞 CVE-2026-111497(Node2Shell):如何检查 Node.js、Python 和 .NET,以及需要更新什么

CVE-2026-111497 是 Brotli 解码器中的越界写入漏洞,构造的压缩数据可破坏内存。受影响的是 Brotli 1.0.3–1.0.9、1.1.0 和 1.2.0,Node.js、Bun、Python Brotli 软件包、.NET 等都内置了副本。本文介绍检查方法、修复版本,以及为什么仅更新操作系统可能无法修复。

发布于 2026-10-27 更新于 2026-10-27 最后核实 2026-10-27 6 分钟阅读
本页目录

本文面向:在 Node.js、Bun、Python 或 .NET 上运行 Web 服务、API、爬虫或批处理任务的开发者和运维人员。本文基于 Google 的 Brotli 项目、Node.js、Microsoft、PyPI、JPCERT/CC 以及美国政府来源的公开信息撰写,不涉及攻击步骤或利用代码。

持续更新中:随着更多信息发布,本页面将会更新

截至2026年10月26日 UTC 23:00

尚不清楚

  • 是否被利用(没有一手来源报告)
  • NVD 自身的评估(等待分析)
  • 受影响产品的完整清单
  • 部分 Linux 发行版(旧版本尚未评估)

Google 于10月21日(美国时间)发布了修复,Node.js 于同一天发布,Microsoft 于10月25日(美国时间)发布。JPCERT/CC 于10月26日发布了警报。CISA 的 KEV 目录未收录该漏洞。更多供应商仍在陆续发布修复,本页面将随其发布而更新。

今天要做的事

1

确认是否解压来自外部的 Brotli 数据

例如:解压以 Content-Encoding: br 发送的请求的 Web 服务器、自动解压外部网站响应的 HTTP 客户端,以及解压用户上传文件的代码。如果符合其中任何一项,请将其作为紧急事项处理(本站观点)。

2

检查运行时和软件包的版本

使用下文“如何检查是否受影响”中的命令,检查 Node.js、Bun、Python 软件包以及 .NET 运行时和 SDK。

3

更新到修复版本

至少更新到下文“修复版本”中列出的版本。nodejs.org 的 Node.js 20.x 及更早版本的官方构建已停止支持,不会获得修复,请迁移到 22.x 或更高版本。对于从 Ubuntu 或 Debian 软件包安装的 Node.js,请遵循发行版的安全通知。

4

重新构建、重新部署并重启

使用修复版本重新构建容器镜像、用 bun build --compile 制作的可执行程序,以及 .NET 自包含或 NativeAOT 应用,然后重新部署。同时也要重启正在运行的进程:旧进程仍会加载旧的库。

5

检查入侵迹象

JPCERT/CC 要求用户在应用修复的同时检查是否遭到入侵。在解压外部数据的进程中,留意崩溃次数增加、陌生的子进程或对外连接(本站建议)。

6

修改锁定文件和基础镜像中的版本固定

如果 package-lock.json、requirements.txt、poetry.lock 或 Dockerfile 的 FROM 行固定了旧版本,下次构建时会把它带回来。请将固定版本改为修复版本。

修复版本

9.2
CVSS v4.0(Google 的评分)
1.0.3–1.0.9, 1.1.0, 1.2.0
受影响的 Brotli 版本
未收录
CISA KEV(日本时间10月27日上午)
无报告
被利用情况(一手来源)
你使用的软件受影响修复版本来源
Brotli(C 库)1.0.3–1.0.9、1.1.0、1.2.01.0.10、1.1.1、1.2.1Google
Node.js 22.x低于 22.23.422.23.4Node.js
Node.js 24.x低于 24.22.124.22.1Node.js
Node.js 26.x低于 26.12.126.12.1Node.js
Node.js 20.x 及更早版本(nodejs.org 官方构建)已停止支持无(请迁移到 22.x 或更高版本)Node.js
Bun1.0.21 及以上、低于 1.4.41.4.4Bun
PyPI brotli1.0.3 及以上、低于 1.2.11.2.1GitHub Advisory Database
PyPI brotlicffi1.0.3 及以上、低于 1.2.1.01.2.1.0GitHub Advisory Database
.NET 8低于 8.0.33运行时 8.0.33(SDK 8.0.133、8.0.427)Microsoft
.NET 9低于 9.0.22运行时 9.0.22(SDK 9.0.123、9.0.320)Microsoft
.NET 10低于 10.0.14运行时 10.0.14(SDK 10.0.114、10.0.403)Microsoft
Envoyv1.39.2、v1.38.5、v1.37.7、v1.36.11v1.40.0、v1.39.3、v1.38.6、v1.37.8、v1.36.12Envoy
PHP Windows 构建重新构建前的 8.5.12、8.4.27、8.3.36、8.2.358.5.12-1、8.4.27-1、8.3.36-1、8.2.35-1PHP

.NET Framework 不受影响(Microsoft)。.NET 11 预览版也有修复(11.0.0-rc.3.26522.148)。根据 Envoy 的说法,只有配置了 Brotli 解压器的部署才受影响。

Linux 发行版通常会在不改变上游版本号的情况下回移修复。例如,Ubuntu 22.04 的 brotli 在“1.0.9-2ubuntu0.1”中得到修复,但版本号仍显示 1.0.9。对于操作系统软件包,请以发行版的安全通知为准,而不是仅看版本号。

根据 PHP 团队的说法,PHP Windows 构建在启用 HTTP 响应自动解压时会通过 cURL 扩展暴露(cURL 默认关闭该功能,但应用程序和 HTTP 客户端库可能将其开启)。修复后的构建带有“-1”后缀;PHP 版本本身不变。

操作系统库(libbrotli)

通过操作系统更新修复。重启使用它的进程

内置于运行时(Node.js、Bun、.NET)

更新运行时本身

语言软件包(brotli、brotlicffi)

在每个虚拟环境中更新

你自己构建的产物(容器、可执行程序)

用修复版本重新构建并重新部署

Brotli 副本所在的每个位置都需要单独修复。操作系统更新只能修复操作系统的库。

如何检查是否受影响

以下命令仅检查你自己系统上的版本。

1

Node.js

运行 node -v。低于 22.23.4、24.22.1 或 26.12.1 的版本受影响。node -p process.versions.brotli 会显示内置的 Brotli 版本,但根据修复的应用方式,该数字可能不会改变,因此请以 Node.js 版本本身来判断(本站观点)。对于 Docker,请在镜像内部检查,例如 docker run --rm --entrypoint node <image> -v。从 Ubuntu 或 Debian 软件包安装的 Node.js 使用系统的 libbrotli,因此请按下文“操作系统库”中的说明检查。

2

Bun

运行 bun --version。低于 1.4.4 的版本受影响。用 bun build --compile 构建的可执行程序包含构建时所用的 Bun,在重新构建之前一直受影响(Bun 的安全公告)。

3

Python

运行 pip show brotli brotlicffi(或在 python -m pip list 中查找 Brotli 和 brotlicffi)。低于 1.2.1 的 brotli 和低于 1.2.1.0 的 brotlicffi 受影响。如果两者都未安装,则没有需要针对该漏洞修复的 Python 软件包。每个虚拟环境和容器都有自己的副本,请逐一检查。如果是从 python3-brotli 等操作系统软件包安装的,请以发行版的安全通知为准,而不是看版本号。

4

.NET

运行 dotnet --list-runtimes 和 dotnet --list-sdks。Microsoft 表示,如果你在 ASP.NET Core 请求解压或 HttpClient 自动响应解压中启用了 Brotli,或直接调用 BrotliStream 或 BrotliDecoder,就会暴露于该漏洞。两个自动选项默认都未开启。

5

操作系统库

在 Debian 和 Ubuntu 上使用 dpkg -l 'libbrotli*',在 RHEL 系系统上使用 rpm -qa 'brotli*' 'libbrotli*',在 Alpine 上使用 apk list --installed 'brotli*' 检查已安装版本,并与发行版的安全通知进行比较。Debian 在 1.0.9-2+deb12u1(DLA-4855-1)中修复了 Debian 12,在 1.1.0-2+deb13u1(DSA-6582-1)中修复了 Debian 13。

已披露的内容

Brotli 解码器中的越界写入(CVE-2026-111497)
CVE
CVE-2026-111497(GitHub 安全公告 GHSA-9v8h-qqgm-4m35)
类型
Brotli 解码器(c/dec/decode.c)中的越界写入(CWE-787)和未检查的返回值(CWE-252)
严重程度
CVSS v4.0 9.2(Google)。网络攻击向量,无需认证,无需用户交互,存在攻击前提条件(AT:P)。Microsoft 在 CVSS v3.1 下将 .NET 的问题评为 8.1
影响
解压构造的 Brotli 流可能破坏相邻内存、泄露内存内容、导致拒绝服务,甚至可能允许任意代码执行(Google 在 NVD 上的描述)。对于 .NET,Microsoft 表示可能导致信息泄露、拒绝服务或权限提升(未提及代码执行)
受影响
Brotli 1.0.3–1.0.9、1.1.0 和 1.2.0,以及内置这些版本的产品
修复
Brotli 1.0.10、1.1.1、1.2.1(2026年10月21日,美国时间)
临时措施
Google 未提供(JPCERT/CC)。Microsoft 表示,在能够更新之前,避免解压攻击者可控的 Brotli 数据

根据 Node.js 的说法,解码器将畸形数据中无效的块切换视为暂时需要更多输入,而不是格式错误,因此会持续写入,超出内部 8 字节缓冲区的末尾。在 Node.js 中,使用 node:zlib 解压攻击者提供的 Brotli 数据的应用程序受影响。Node.js 将该问题评为 High(高)。同一批版本还修复了另外九个漏洞。

根据 Bun 的安全公告,Bun 的 fetch 默认会自动解压 Brotli 响应,因此应用程序所连接的服务器,或位于未加密连接路径上的攻击者,都可以提供这类数据。

仅更新操作系统可能无法修复

Brotli 以副本形式内置于许多程序中,包括 Node.js、Bun、Python Brotli 软件包、.NET 和 Envoy。JPCERT/CC 要求应用程序会解压 Brotli 数据的用户查看各供应商的最新信息,确认影响和修复状态。Microsoft 也表示,更新共享运行时并不能修复 NativeAOT 应用,必须重新发布这些应用。

利用和概念验证状况

截至10月27日上午(日本时间),Google、Node.js、Microsoft 和 JPCERT/CC 均未报告在野利用。CISA 的 KEV 目录(10月26日版本)未收录该漏洞。10月23日添加到 NVD 的 CISA SSVC 评估将利用状况评为 none(无),可自动化评为 no(否),技术影响评为 total(完全)。Microsoft 的 CVSS 将利用代码成熟度评为 unproven(未经证实)。

一手来源未提及公开的概念验证代码。一个独立的解说网站称,10月22日有 PoC 公开:在标准构建上只会导致崩溃和有限的内存读取,而在刻意削弱防护的构建上可以达到代码执行。该网站还称,一家安全公司的研究团队在官方 Node.js 镜像上实现了代码执行,但未公开方法。本站尚未核实上述任何内容,也不提供链接。

Ubuntu 将该问题评为 Medium(中)优先级,而 Google 将其评为 9.2。对你来说哪一个更重要,取决于你是否会解压从外部收到的数据(本站观点)。

关于主要的 Python HTTP 库

截至10月27日,requests、urllib3、httpx 和 aiohttp 均未针对该漏洞发布安全公告(本站查看了各仓库的安全公告列表)。urllib3、httpx 和 aiohttp 将 brotli 或 brotlicffi 作为可选附加依赖,只有安装了其中之一时才会解压 Brotli。需要修复的是同一环境中的 brotli 和 brotlicffi。如果 brotli 仍是旧版本,仅更新 HTTP 库并没有帮助。

尚不清楚的事项

项目状态
在野利用一手来源未报告。未收录于 KEV
公开的概念验证代码一手来源未提及。一个独立网站称已存在(未核实)
NVD 评估等待分析(仅有 Google 的 9.2)
受影响产品的完整清单仍在增加。浏览器和其他产品请查看各供应商的通知
Linux 发行版Ubuntu 20.04 及更早版本尚未评估

来源

均于2026年10月27日确认。

  • JPCERT/CC,关于 Brotli 越界写入漏洞(CVE-2026-111497)的警报(JPCERT-AT-2026-0034,2026年10月26日,日文)— jpcert.or.jp
  • PHP,"Updated PHP Windows builds for Brotli security fix"(2026年10月26日)— php.net
  • Google Brotli 版本 v1.2.1、v1.1.1、v1.0.10(2026年10月21日)— v1.2.1 / v1.1.1 / v1.0.10
  • Node.js,"Node.js Security Releases"(2026年10月21日)— nodejs.org
  • Microsoft,"Microsoft Security Advisory CVE-2026-111497 | .NET Brotli Decoder Out-of-bounds Write Vulnerability"(2026年10月25日)— github.com/dotnet
  • GitHub Advisory Database GHSA-9v8h-qqgm-4m35(PyPI brotli 和 brotlicffi)— github.com
  • PyPI brotli 1.2.1 — pypi.org / brotlicffi 1.2.1.0 — pypi.org
  • Bun,"Bundled brotli decoder has an out-of-bounds write"(GHSA-663w-cv8g-jj2p,2026年10月23日)— github.com
  • Envoy,"Out-of-Bounds Write in Brotli Decompressor"(GHSA-3wvj-j6qm-62mr,2026年10月23日)— github.com
  • NVD,"CVE-2026-111497" — nvd.nist.gov
  • CISA,"Known Exploited Vulnerabilities Catalog"(10月26日版本中未收录)— cisa.gov
  • Ubuntu,"CVE-2026-111497" — ubuntu.com / Debian,"DLA-4855-1 brotli" — lists.debian.org

更新历史

2026-10-27:首个版本,基于 Google、Node.js、Microsoft、Bun、Envoy、PHP、PyPI、JPCERT/CC、NVD、CISA 的 KEV 目录、Ubuntu 和 Debian 的公开信息。

延伸阅读

最新快讯

FAQ

Q发生了什么?
A

2026年10月21日(美国时间),Google 发布了 Brotli 1.2.1、1.1.1 和 1.0.10,修复了官方 Brotli 库中的越界写入漏洞 CVE-2026-111497。解压构造的数据可能破坏内存,导致崩溃、内存泄露,甚至可能导致代码执行。Node.js、Bun、Python Brotli 软件包、.NET 等已针对各自内置的副本发布了修复。

QNode2Shell 和 HTTP2Shell 是什么?
A

它们是这个漏洞的别称。根据 JPCERT/CC 的说法,因与 Node.js 的披露相关而被称为 Node2Shell,又因 Brotli 被广泛用于 HTTP 压缩而被称为 HTTP2Shell。两者都指 CVE-2026-111497,并非不同的漏洞。

Q我是否受影响?
A

如果内置 Brotli 1.0.3–1.0.9、1.1.0 或 1.2.0 的软件会解压从外部收到的 Brotli 数据,你就受影响。具体包括:相应版本线上低于 22.23.4、24.22.1 或 26.12.1 的 Node.js,低于 1.2.1 的 PyPI brotli,低于 1.2.1.0 的 brotlicffi,以及低于 8.0.33、9.0.22 或 10.0.14 的 .NET。Microsoft 表示,ASP.NET Core 和 HttpClient 默认不会自动解压 Brotli,因此 .NET 是否暴露取决于你是否启用了该功能。

Q我已经安装了操作系统更新,这样够了吗?
A

不一定。来自 nodejs.org 的官方 Node.js 构建和 Docker 镜像、Bun、从 PyPI 安装的 Python Brotli wheel、.NET 自包含(self-contained)和 NativeAOT 应用,以及 Bun 单文件可执行程序都自带 Brotli。更新操作系统的 libbrotli 不会改变这些副本。请逐一更新,然后重新构建并重新部署容器镜像和可执行程序。以 Ubuntu 或 Debian 软件包安装的 Node.js 使用系统的 libbrotli,因此更新操作系统即可修复(Ubuntu 和 Debian 安全追踪页面)。

Q该漏洞是否正被利用?
A

截至10月27日上午(日本时间),没有一手来源报告其被利用,CISA 的 KEV 目录也未收录。10月23日添加到 NVD 的 CISA SSVC 评估将利用状况评为 none(无)。Google、Node.js、JPCERT/CC 和 Microsoft 均未提及公开的概念验证(PoC)代码。一个独立的解说网站称已有 PoC 公开;本站尚未核实。

Q我需要更新 requests、urllib3、httpx 或 aiohttp 吗?
A

截至10月27日,这些库都没有针对该漏洞发布安全公告。urllib3、httpx 和 aiohttp 只有在安装了 brotli 或 brotlicffi 时才会解压 Brotli(requests 使用 urllib3)。需要修复的是同一环境中的 brotli(1.2.1 或更高版本)和 brotlicffi(1.2.1.0 或更高版本)。可以用 pip show brotli brotlicffi 检查。