HTTP2Shell 漏洞 CVE-2026-111497:5 分钟排查 Node.js/Python/Bun/Envoy 是否受影响

2026-10-25 · 安全 · 排查指南 · 阅读约 10 分钟

10 月 21 日,Node.js 项目发布安全更新,修复了一个 Brotli 解码器中的严重内存安全漏洞。这个漏洞(CVE-2026-111497,CVSS 9.2)影响范围远超 Node.js——Python 的 Brotli/brotlicffi 包、Bun、Envoy 代理、Istio 服务网格,以及任何内嵌受影响 Brotli 解码器的 HTTP 客户端或服务端,都可能被攻击者通过特制的压缩数据触发越界写入,导致内存泄露、进程崩溃甚至任意代码执行。

本文提供一组可直接复制的排查与修复命令,帮你在 5 分钟内确认你的服务是否受影响并完成修复。

一、30 秒了解漏洞

Google Brotli 压缩库(版本 1.0.3 至 1.2.0)的解码器在 DecodeBlockTypeAndLength() 函数中存在返回值语义混淆:调用方无法区分「输入耗尽」与「数据流非法」。攻击者构造一条特制的 Brotli 压缩流,即可触发越界写入,破坏相邻内存数据。

由于 Brotli 是 HTTP/1.1 和 HTTP/2 的通用压缩标准(Content-Encoding: br),任何解压不可信 Brotli 数据的服务都可能受影响。

二、你的服务受影响吗?

组件受影响版本修复版本影响等级
Google Brotli(C 库)1.0.3 – 1.2.0≥ 1.2.1⚠️ 高
Node.js22.x / 24.x / 26.x(< 10-21 补丁)22.23.4 / 24.22.1 / 26.12.1⚠️ 高
Bun< 1.4.4≥ 1.4.4⚠️ 高
Python brotli / brotlicffi依赖系统 Brotli 库版本升级系统库至 ≥ 1.2.1⚠️ 中
Envoy Proxy启用 Brotli 解压的配置升级至含修复的 Envoy 版本⚠️ 中
Istio(内置 Envoy)依赖 Envoy 版本升级 Istio 至含修复版本⚠️ 中

三、5 分钟排查命令

3.1 检查系统 Brotli 库版本

# macOS
brew list --versions brotli

# Ubuntu / Debian
dpkg -l | grep brotli

# CentOS / RHEL
rpm -qa | grep brotli

# 输出版本号 < 1.2.1 → 需要升级

3.2 检查 Node.js 项目

# 检查 Node.js 版本(< 10-21 安全版本需升级)
node --version

# 检查项目中是否有 Brotli 依赖
grep -r "brotli" package.json package-lock.json 2>/dev/null

# 升级 Node.js 到安全版本
# 使用 nvm
nvm install 22.23.4 && nvm use 22.23.4

# 使用 Docker
docker pull node:22.23.4-alpine

3.3 检查 Python 项目

# 检查 Brotli 包版本
pip show brotli brotlicffi 2>/dev/null

# 使用 pip-audit 扫描(注意:自动工具可能不会标记此 CVE)
pip list | grep -i brotli

# 手动升级
pip install --upgrade brotli brotlicffi

3.4 检查 Bun 项目

bun --version
# < 1.4.4 → 需要升级
bun upgrade

3.5 检查 Envoy / Istio 配置

# 检查 Envoy 配置中是否启用了 Brotli 解压
grep -r "brotli" /etc/envoy/ 2>/dev/null

# 检查 Istio 中 Envoy 的压缩配置
kubectl get configmap -n istio-system istio-sidecar-injector -o yaml | grep -i brotli

四、修复方案

4.1 升级系统 Brotli 库

# macOS
brew upgrade brotli

# Ubuntu / Debian
sudo apt update && sudo apt upgrade libbrotli1

# CentOS / RHEL
sudo yum update brotli

4.2 升级运行时

# Node.js:升级到 10-21 安全版本
nvm install --lts

# Bun:升级到 ≥ 1.4.4
bun upgrade

# Python:升级 brotli 包(确保底层系统库也已更新)
pip install --upgrade brotli brotlicffi

4.3 临时缓解(无法立即升级时)

# Nginx:拒绝 Brotli 压缩的入站请求
if ($http_content_encoding ~* "br") {
    return 406;
}

# 在反向代理层剥离 Content-Encoding: br 头
proxy_set_header Accept-Encoding "";

五、验证修复

# 确认 Brotli 库版本 ≥ 1.2.1
brew list --versions brotli  # macOS
dpkg -l | grep brotli        # Ubuntu

# 确认 Node.js 版本
node --version

# 确认 Bun 版本
bun --version

# 确认无 Brotli 解压配置暴露
grep -r "Content-Encoding: br" /etc/nginx/ 2>/dev/null

六、影响范围与背景

这次漏洞最初因 Node.js 利用路径被称为「Node2Shell」,后因影响面扩大(覆盖 Python、Bun、Envoy、Istio 等)而演变为「HTTP2Shell」。OpenAI Codex Security 团队的 Khai Tran 和 Sylvie Mayer 发现了根解析器缺陷,Node.js 维护者 Matteo Collina 和 Antoine du Hamel 完成了修复。

Google 将漏洞评为 CVSS 9.2(严重),Red Hat 评为 8.1,Node.js 标注为 high。截至目前,尚未报告在野利用——但这不意味着安全,修复前攻击面是开放的。

七、给开发者的预防建议