10 月 21 日,Node.js 项目发布安全更新,修复了一个 Brotli 解码器中的严重内存安全漏洞。这个漏洞(CVE-2026-111497,CVSS 9.2)影响范围远超 Node.js——Python 的 Brotli/brotlicffi 包、Bun、Envoy 代理、Istio 服务网格,以及任何内嵌受影响 Brotli 解码器的 HTTP 客户端或服务端,都可能被攻击者通过特制的压缩数据触发越界写入,导致内存泄露、进程崩溃甚至任意代码执行。
本文提供一组可直接复制的排查与修复命令,帮你在 5 分钟内确认你的服务是否受影响并完成修复。
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.js | 22.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 至含修复版本 | ⚠️ 中 |
# macOS brew list --versions brotli # Ubuntu / Debian dpkg -l | grep brotli # CentOS / RHEL rpm -qa | grep brotli # 输出版本号 < 1.2.1 → 需要升级
# 检查 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
# 检查 Brotli 包版本 pip show brotli brotlicffi 2>/dev/null # 使用 pip-audit 扫描(注意:自动工具可能不会标记此 CVE) pip list | grep -i brotli # 手动升级 pip install --upgrade brotli brotlicffi
bun --version # < 1.4.4 → 需要升级 bun upgrade
# 检查 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
# macOS brew upgrade brotli # Ubuntu / Debian sudo apt update && sudo apt upgrade libbrotli1 # CentOS / RHEL sudo yum update brotli
# Node.js:升级到 10-21 安全版本 nvm install --lts # Bun:升级到 ≥ 1.4.4 bun upgrade # Python:升级 brotli 包(确保底层系统库也已更新) pip install --upgrade brotli brotlicffi
# 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。截至目前,尚未报告在野利用——但这不意味着安全,修复前攻击面是开放的。
pip-audit、npm audit、bun audit,但注意自动化工具可能不会标记此 CVE(PyPI 包映射缺失)Content-Encoding: br