CVE-2026-111497:Brotli 解压缩缓冲区溢出漏洞,攻击者可远程执行代码(Node2Shell)
摘要: 2026 年 10 月,Google Brotli 解码器被披露存在严重的越界写入漏洞 CVE-2026-111497,CVSS 4。0 评分为 9。2。攻击者通过构造恶意压缩数据,可能导致程序崩溃、内存泄露甚至远程代码执行。漏洞涉及 Node。js、Python、。NET 等多个生态,已有公开 PoC 和真实攻击尝试,并被 CISA 列入已知遭利用漏洞目录。
一、漏洞概述
Brotli 是 Google 开发的一种开源数据压缩算法,广泛应用于 HTTP 内容压缩、浏览器、Web 服务及各种编程语言的运行时。
当浏览器请求网页时,服务器可以使用 Brotli 压缩响应内容,减少网络传输的数据量。HTTP 协议通过 Content-Encoding: br 标识这种压缩格式。
2026 年 10 月 22 日,Google 正式公开 CVE-2026-111497。问题出现在 Brotli 解码器处理异常压缩数据时的错误处理逻辑。
| 项目 | 详细信息 |
|---|---|
| CVE 编号 | CVE-2026-111497 |
| 漏洞名称 | Node2Shell / Broccoli2Shell |
| 影响组件 | Google Brotli Decoder |
| 漏洞位置 | c/dec/decode。c |
| 漏洞类型 | 越界写入、缓冲区溢出 |
| CWE 编号 | CWE-787、CWE-252 |
| 正式公开时间 | 2026 年 10 月 22 日 |
| CVSS 4。0 | 9。2 / Critical |
| 攻击方式 | 通过恶意 Brotli 压缩数据触发 |
| 可能后果 | 拒绝服务、内存泄露、远程代码执行 |
该漏洞由 OpenAI Codex Security 的 Khai Tran 和 Sylvie Mayer 发现并报告。
Google 确认 Brotli 1。0。3 至 1。2。0 范围内的多个版本存在问题,并于 10 月 21 日发布修复版本。
需要注意,Brotli 是多个软件共同使用的底层组件。即使开发者没有直接安装 Brotli,所使用的运行时或第三方依赖也可能包含存在漏洞的解码器。
二、漏洞原理:一次错误判断如何引发内存溢出?
理解这个漏洞,需要先知道 Brotli 解码器如何处理压缩数据。
1。 Brotli 的分块解码机制
Brotli 将压缩数据组织成 Meta-block,并在其中使用不同类型的数据块,包括:
- Literal:需要直接输出的字面量数据。
- Command:控制插入、复制等操作的命令。
- Distance:表示数据复制距离的信息。
解码过程中,程序会读取数据块类型,并根据压缩流中的控制信息决定是否切换数据块。
正常流程大致如下:
接收 Brotli 压缩数据
|
v
解析 Meta-block
|
v
读取数据块类型
|
v
判断是否需要切换数据块
|
v
检查数据是否合法
|
v
解码数据并输出
关键问题发生在数据块切换时。
2。 错误的返回值处理
在存在漏洞的版本中,DecodeBlockTypeAndLength() 负责解析数据块类型及长度。
当压缩流要求切换数据块,但当前类别只有一种合法的数据块类型时,该切换操作应当被判定为格式错误。
旧版代码却返回:
if (max_block_type <= 1) {
return BROTLI_FALSE;
}
这里的 BROTLI_FALSE 存在歧义。
解码器可能将其理解为暂时缺少输入数据,而没有立即终止异常压缩流的处理。
尤其在快速解码路径中,相关错误状态未被正确检查,导致解码器继续运行。
最终出现以下过程:
攻击者构造异常 Brotli 数据
|
v
触发非法数据块切换
|
v
解码函数返回模糊的错误状态
|
v
上层未正确识别永久性格式错误
|
v
继续向内部临时缓冲区写入数据
|
v
超过缓冲区容量
|
v
相邻内存被覆盖
Node。js 官方指出,受影响的流式解码路径可能持续向一个只有 8 字节 的内部缓冲区追加数据,最终发生越界写入。
这是典型的 Out-of-Bounds Write(OOB Write)。
3。 为什么可能变成远程代码执行?
C/C++ 程序会在内存中保存数据、对象状态、指针和函数调用信息。
当程序向缓冲区边界之外写入数据时,可能破坏相邻的内存结构。
轻微情况下,程序可能因为访问非法地址而崩溃。
如果攻击者能够进一步控制内存布局和覆盖内容,就可能修改关键指针,改变程序执行流程。
对于运行在服务器上的 Node。js 应用,这可能意味着攻击者最终以 Node。js 进程的权限执行代码。
这里真正危险的是:一次普通的解压缩操作,可能演变成整个应用进程被控制。
4。 官方如何修复?
Google 修改了数据块切换的错误处理逻辑。
修复后的关键代码为:
if (max_block_type <= 1) {
return BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH;
}
新的返回值明确表示数据块切换格式错误。
同时,正常的输入不足场景会返回专门的 BROTLI_DECODER_NEEDS_MORE_INPUT 状态。
这样,解码器便能区分需要继续等待数据与必须终止的异常输入,避免后续越界写入。
对应修复提交可以在 GitHub 上查看:
google/brotli,提交 0ed4268a4401abcb44720963。
三、哪些软件和版本受到影响?
漏洞发生在 Google Brotli 的 C 语言解码器中,因此影响范围跨越多个软件生态。
1。 Google Brotli
| 受影响版本 | 修复版本 |
|---|---|
| 1。0。3~1。0。9 | 1。0。10 |
| 1。1。0 | 1。1。1 |
| 1。2。0 | 1。2。1 |
以上修复版本均已由 Google 官方发布。
2。 Node。js
Node。js 内置 Brotli 解码器,可通过 node:zlib 模块调用。
官方确认,22。x、24。x 和 26。x 分支受到影响。
| Node。js 分支 | 首个修复版本 |
|---|---|
| 22。x | 22。23。4 |
| 24。x | 24。22。1 |
| 26。x | 26。12。1 |
这些安全版本于 2026 年 10 月 21 日发布。已经停止维护的旧版本应迁移到受支持的安全分支。
需要特别注意:Node。js 中的 Brotli 通常是随运行时一起编译发布的,单纯更新 npm 依赖无法修复其内置解码器。
3。 Python
Python 生态中的以下第三方包受到影响:
| Python 包 | 受影响版本 | 修复版本 |
|---|---|---|
| Brotli | 1。0。3~1。2。0 | 1。2。1 |
| brotlicffi | 1。0。3 至低于 1。2。1。0 | 1。2。1。0 |
使用这些组件处理外部 Brotli 数据的 Python 服务,应当及时检查依赖版本。
4。 。NET
微软也针对包含受影响 Brotli 解码器的 。NET 运行时发布了安全更新。
| 。NET 分支 | 修复版本 |
|---|---|
| 。NET 8 | 8。0。33 |
| 。NET 9 | 9。0。22 |
| 。NET 10 | 10。0。14 |
| 。NET 11 预览版 | 11。0。0-rc。3。26522。148 |
微软指出,ASP。NET Core 和 HttpClient 默认配置下不会自动启用相应的 Brotli 解压功能。
主要风险来自主动开启 Brotli 解压,或者明确调用解压 API 处理攻击者控制的数据。
。NET Framework 不受此次漏洞影响。
四、哪些开发者和系统管理员需要担心?
风险判断主要取决于两个条件:
第一,应用是否使用存在漏洞的 Brotli 解码器;第二,攻击者能否让该应用解压自己构造的数据。
以下是常见部署场景。
| 部署环境 | 风险判断 |
|---|---|
| 允许 Brotli 压缩请求体的 Node。js Web 服务 | 高 |
| Express 5 使用默认请求体解析配置 | 高 |
使用 node:zlib 解压外部数据的服务 |
高 |
| 使用 Brotli 解压的 Python API 服务 | 高 |
| 启用 Brotli 解压的 。NET 服务 | 高 |
| 使用受影响依赖的 Docker 容器 | 需要检查 |
| 仅将 Brotli 用于输出压缩的服务 | 该漏洞的直接风险较低 |
| 不使用受影响解码器的软件 | 通常无直接影响 |
尤其需要关注 Express 应用。
Express 官方在 10 月 31 日的安全公告中确认,默认配置下,express。json()、express。urlencoded() 等请求体解析器可以处理带有 Content-Encoding: br 的压缩请求体。
例如:
const express = require('express');
const app = express();
app。use(express。json());
app。post('/api/data', (req, res) => {
res。json({ status: 'ok' });
});
如果使用存在漏洞的 Node。js 运行时,攻击者向相关接口发送特制的 Brotli 压缩请求体,就可能触发底层解码问题。
另外,服务器主动获取外部 HTTP 资源时,如果响应数据经过有漏洞的 Brotli 解码器处理,同样可能形成攻击入口。
因此,即使服务器没有公开提供 Brotli 解压接口,仍需要检查是否会主动解压来自第三方的数据。
五、风险分析:PoC 已公开,真实攻击已出现
这是此次漏洞最需要重视的部分。
1。 公开 PoC 已经存在
2026 年 10 月 22 日,Imperva Red Team 披露了针对官方 Node。js 24。22。0 Linux ARM64 镜像的远程代码执行实验。
研究人员在 Express 和 body-parser 环境下,通过恶意 Brotli 数据成功执行代码。
实验需要多次尝试,表明利用过程受到内存布局等因素影响。
随后,ELLIO 研究团队在 x86-64 环境复现了远程代码执行,涉及 Node。js、Express、Koa 等应用环境。
GitHub 上也出现了公开 PoC 项目,例如:
dimasma0305/CVE-2026-111497-POCgooglesky/CVE-2026-111497
不同项目的验证程度有所差异,部分主要展示越界写入、拒绝服务或特定测试环境中的代码执行。
2。 已有真实攻击尝试
2026 年 10 月 26 日,ELLIO 宣布其安全传感器观察到了针对该漏洞的实际利用流量。
研究人员发现,有攻击者通过发送 Brotli 压缩请求探测目标,并随后尝试使用公开利用代码实施攻击。
2026 年 10 月 27 日,CISA 将 CVE-2026-111497 加入 Known Exploited Vulnerabilities(KEV)目录。
这说明漏洞已经获得真实利用证据,风险明显高于仅存在理论可利用性的漏洞。
不过,目前公开证据主要包括攻击流量、实际利用尝试,以及安全研究人员完成的远程代码执行实验。
这些证据尚不足以确定真实环境中成功入侵的总体数量。
3。 利用难度如何?
Google 给出的 CVSS 4。0 评分为 9。2,攻击复杂度指标为 Low,但同时标记了额外攻击条件。
Red Hat 则根据具体利用条件,将 CVSS 3。1 评分定为 8。1。
这两个评分使用了不同的 CVSS 版本和评估方法。
实际攻击中,恶意数据必须进入受影响的解码路径。进一步实现稳定代码执行,还可能受到内存布局、操作系统防护措施和运行环境的影响。
已有的研究结果说明,至少在部分常见部署环境中,这些利用条件可以被满足。
六、如何检查自己的系统?
1。 检查 Node。js 版本
node -v
查看内置 Brotli 版本:
node -p "process。versions。brotli"
注意:Node。js 可能回移安全补丁而保留原来的 Brotli 版本号,因此应优先根据 Node。js 官方安全版本判断。
查看 Express 依赖:
npm ls express body-parser
检查代码中是否使用 Brotli 解压:
grep -RnE \
'createBrotliDecompress|brotliDecompress|express\。json|express\。urlencoded' \
。/src
如果代码中存在相关调用,应继续确认输入数据的来源,以及解压操作是否允许外部用户触发。
2。 检查 Python 环境
python -m pip show Brotli brotlicffi
查看所有相关依赖:
python -m pip list | grep -i brotli
如果安装了受影响版本,还应检查是否被应用直接或间接调用。
3。 检查 Linux 系统库
Debian、Ubuntu:
dpkg -l | grep -i brotli
RHEL、Rocky Linux、AlmaLinux:
rpm -qa | grep -i brotli
发行版经常通过回移补丁修复漏洞,软件包版本可能仍显示较旧的上游版本。
例如 Ubuntu 24。04 的修复软件包版本为 1。1。0-2ubuntu0。1。
因此,应结合发行版安全公告和软件包修订号判断实际状态。
4。 检查 。NET
dotnet --list-runtimes
还需要检查应用是否使用自包含部署或 NativeAOT。
这些应用可能携带独立编译的 Brotli 解码器,需要重新构建才能获得修复。
七、修复方案与临时缓解措施
1。 升级到官方安全版本
对于 Node。js,建议优先升级整个运行时。
如果使用 nvm:
nvm install 24。22。1
nvm use 24。22。1
实际生产环境可选择更新的受支持安全版本。
Python 用户可以执行:
python -m pip install --upgrade Brotli brotlicffi
对于系统 Brotli 库,可以使用发行版包管理器更新:
# Ubuntu / Debian
sudo apt update
sudo apt upgrade
# RHEL / Rocky Linux
sudo dnf upgrade
容器环境还需要更新基础镜像、重新构建并部署应用。
2。 暂时关闭 Brotli 请求体解压
如果使用 Express,并且暂时无法升级 Node。js,可以在请求体解析中间件之前拦截 Brotli 压缩请求。
const express = require('express');
const app = express();
// 必须注册在请求体解压中间件之前
app。use((req, res, next) => {
const encoding = (
req。get('Content-Encoding') || 'identity'
)。trim()。toLowerCase();
if (encoding === 'br') {
return res。status(415)。send(
'Brotli request encoding is not supported'
);
}
next();
});
app。use(express。json());
这种方法可以减少来自 HTTP 请求体的攻击机会。
如果应用使用 fetch() 获取外部 Brotli 压缩响应,仍需要处理相应风险。
3。 降低应用权限
建议同时采取以下措施:
- 使用普通用户运行 Node。js、Python 等服务。
- 限制容器权限,避免以特权模式运行。
- 对外部 HTTP 数据源实施访问控制。
- 通过反向代理或 WAF 拦截不需要的 Brotli 压缩请求体。
- 监测异常进程崩溃和可疑的
Content-Encoding: br请求。
这些措施有助于降低漏洞被利用的可能性及成功后的影响范围。
彻底修复仍需要更新存在漏洞的 Brotli 解码器。
八、总结
CVE-2026-111497 的危险性来自三个事实。
首先,漏洞位于使用范围极广的 Brotli 底层解码器中,Node。js、Python、。NET 等多个生态都可能受到影响。
其次,漏洞成因非常典型:一个错误的返回值被当作正常状态处理,最终让解码器持续向容量有限的缓冲区写入数据。
最后,公开安全研究已经验证远程代码执行,真实网络中也出现了攻击尝试,CISA 已将其列入 KEV 目录。
对于开发者和系统管理员,当前最重要的工作是:
1。 确认应用是否会解压来自外部的 Brotli 数据。
2。 检查 Node。js、Python、。NET 和系统 Brotli 库的实际安全版本。
3。 尽快更新受影响的运行时及依赖,并重新部署相关容器。
4。 暂时无法升级时,限制 Brotli 解压入口并降低服务运行权限。
这个漏洞也提醒我们:一些看似普通的基础功能,例如 HTTP 数据压缩,背后依赖的原生代码同样可能成为严重的安全风险来源。
资料核验日期:2026 年 11 月 5 日。
主要参考资料:Google Brotli 官方 GitHub 安全版本公告、Node。js 2026 年 10 月安全公告、GitHub Advisory Database GHSA-9v8h-qqgm-4m35、微软 。NET 安全公告、Express 官方安全公告、CISA KEV、Imperva Red Team、ELLIO Threat Research Lab、Tenable、Red Hat 及 Ubuntu 安全公告。
- 点赞
- 收藏
- 关注作者
评论(0)