攻击者利用恶意 Terraform Providers 通过 HashiCorp 注册表投递 Go 恶意软件
- 浏览次数 2941
- 喜欢 0
网络安全研究人员披露了通过两个 Go Modules 和两个 Terraform providers 分发的基于 Go 的恶意软件,这是威胁行为者首次将 HashiCorp 托管的集中式仓库用作恶意载荷的分发渠道。
据 Aikido 称,Terraform providers 和 Go modules 的清单如下:
- gocommunity-io/dockerd(222 次下载)
- kreuzwenker/docker(1,449 次下载)
- gocommunity.io/orderedbtree
- gogets.dev/btreex
通过这些包部署的恶意软件与 Graphalgo 存在重叠,后者是 ReversingLabs 今年 2 月首次记录的行动,被归因于朝鲜(又称 DPRK)威胁行为者。
作为这一行动的一部分,潜在的开发者会通过 LinkedIn 和 Facebook 等社交平台或论坛上的招聘信息被接触,对方冒充不存在的 Web3 公司,然后被要求完成一个编程任务,并会提供一个无害的 GitHub 仓库,该仓库通过发布在 npm 或 PyPI 上的依赖引入恶意行为。
值得注意的是,这一最新发现恰逢本周刚识别出一批新的恶意 npm 包用于投递相同的恶意软件。Checkmarx、JFrog 和 SafeDep 标记的部分包列表如下:
- indexed-btree
- mathsbase
- mathmain
- math-universe
- modern-events
- quick-events
- crypto-hasher
- events-router
- sort-btree
- graphcore-js
- graphlib-js
对这些包的分析显示,在某些情况下,恶意软件的执行只在执行特定加密操作时才会触发,展现出一个定向行动的所有特征。
"载荷只有在受害者用某个特定矩阵求解线性方程组时才会解密,它从以太坊 Sepolia 测试网上的一个智能合约接收指令,通过 Slack 保持第二条命令通道畅通,并躲藏在一个由 GitHub Actions 工作节点农场制造的下载量背后,"JFrog 表示。
该攻击链为一个加密载荷铺平了道路,由于它使用非对称加密,其确切功能仍不得而知。该植入体还被设计为联系一个 Slack 频道,每 10 秒轮询一次 "conversations.history" 端点,并根据数据包类型执行下一步操作:
- Start 数据包:开始一次文件传输
- Chunk 数据包:提供文件内容
- End 数据包:合并各分块
"区块链路径还会解密远程数据,写入 subwatcher 并用 Node.js 启动它,"SafeDep 表示。"这些路径让运营者能够在所需设置成功的主机上交付代码执行。我们找回了植入体,但未能获得通过这些渠道交付的后续代码。因此,我们无法说明运营者在受害者上运行了什么任务。"
Aikido 表示,通过 Terraform providers 和 Go Modules 分发的恶意软件是一个 Go 移植版本,与 npm 版本共享区块链和 Slack 基础设施。它具有双命令与控制 (C2) 通道,使用区块链 dead drop 和一个 Slack bot token。
一开始,它会收集系统信息,包括硬件属性、操作系统、主机名,以及节点在受感染系统上是否可用。捕获的数据随后通过 API 传输到攻击者控制的 Slack 频道。
"在完成 check-in 调用后,该恶意软件会生成一个临时公私钥对,"安全研究员 Oliver Smith 表示。"该恶意软件通过将其临时密钥与两个威胁行为者公钥组合来生成共享密钥。共享密钥使恶意软件能够使用共享通道与受感染的客户端通信,而不会暴露 C2 通信或在受感染主机之间泄露消息。"
基于区块链的 C2 使用硬编码的合约地址,从 Arbitrum Sepolia 测试网上的一个以太坊智能合约获取数据,用它每三秒轮询一次加密命令。随后,这些命令以 Go 或 JavaScript 代码的形式被执行。
"这种 C2 机制进一步表明该恶意软件是一个定向行动的一部分,"Smith 表示。"威胁行为者下达命令的能力存在瓶颈,因为所有客户端都会消费所有消息,而在无法解密发给其他客户端的消息时会执行空操作。
"这是一个相当精巧的区块链 dead drop 实现,集成了双向通信,同时将信息泄露或干扰的风险降至最低。"
Socket 安全研究员 Karlo Zanki 告诉 The Hacker News,Graphalgo 延续了同样的操作剧本,很可能使用虚假求职面试作为主要的初始访问载体。
"执行受一个基本检查限制,该检查针对可能由前端组件提供的数据,"Zanki 表示。"尽管这种行为可能暗示范围极窄的定向活动,但它更有可能旨在阻碍分析——如果研究人员在没有对应前端的情况下发现后端载荷。最初的 Graphalgo 行动就表现出同样的特征。"
Terraform Registry 会成为新的供应链攻击渠道吗?
Terraform providers 的出现是一种新颖的战术,但也许完全不足为奇,因为它可以提供一条更直接的通往关键生产凭据的路径,Aikido 补充道。它还表明威胁行为者正在通过超越 npm 和 PyPI 来扩大该行动的影响范围。
然而,这并非朝鲜对手第一次借助 Terraform providers 分发恶意软件。在上周发布的一份报告中,SentinelOne 详细介绍了代号 TraderTraitor 的威胁活动集群如何依赖武器化的 Terraform 锁定文件,以促成从攻击者控制的自定义 Terraform provider 注册表投递基于 Rust 的后门。
"现在就自信地断言与 DPRK 相关的威胁行为者正在将 Terraform 注册表作为一种新的分发战术,还为时过早,"Zanki 表示。"不过,它们最近出现在与这些运营者相关的两个不同行动中,使巧合的可能性降低。这些威胁行为者有引入新感染技术并在多个行动中应用成功方法的历史。"
"与 DPRK 相关的威胁行为者适应能力极强,并不断用能够触及广泛目标的技术扩充其工具集。Terraform 注册表可能代表他们下一个大规模采用的分发渠道。"
恶意 npm 包与 PolinRider 存在关联
这一进展之际,CloudSEK 强调了一个此前未被报道的名为 GHAPPIER 的 JavaScript 加载器,它是在一个合法 npm 包 "@dforge-core/dforge-mcp" 被入侵后分发的。
目前尚不清楚攻击者是如何获得维护者账户的访问权限的,尽管有人怀疑该开发者的机器可能被一个恶意扩展或包感染。
该加载器的主要目标是从运营者控制的服务器获取代码并运行它,使威胁行为者能够在运行时动态更改载荷。
据称,恶意版本 (0.2.21) 在 2026 年 9 月 9 日于 npm 上存活了 35 分 38 秒,之后原始维护者撤销了更改并发布了一个干净版本 (0.2.22)。同一个加载器已在属于 22 个不同账户的 65 个公开仓库中被观察到。
"它在每一种情况下都以相同的方式到达目标:运营者获取了一个开发者存储的凭据,然后用这些凭据写入该开发者能推送到的每一个仓库,"CloudSEK 研究员 Vikas Kundu 表示。
对加载器两个副本——一个来自 npm 包,另一个来自第二位受害者的仓库——的比较显示,该攻击链使用相同的暂存主机和对一个 Vercel 域名的请求,但行动标签不同("ghappier" 与 "g0115")。
有趣的是,第二个载荷被观察到使用 NullReceiver 技术从攻击者钱包获取其 C2 地址("193.247.144[.]38"),并具有相同的尾部字节序列("68656c6c6f6970626f742121"),解码后为字符串 "helloipbot!!"。该活动与一个长期存在的、与朝鲜相关的名为 PolinRider 的行动重叠。
Rust 警告求职面试中暗藏恶意载荷
这些发现还紧随 Rust 项目发出的一项警告:一场正在进行的行动正针对 rust-lang 成员和热门 crate 的所有者,目的是入侵其设备和账户以分发恶意软件。
"一次视频通话会为了某些积极的事情而安排——也许是求职,也许是项目,也许是合同机会——然后它被用作载体,要么让目标在其计算机上安装某些东西(例如一个据称缺失的音频编解码器),要么执行另一条命令(例如,通过把命令放到剪贴板上),"Rust Foundation 的软件开发者 Adam Harvey 表示。
"这些攻击者创建了崭新但看似合法的公司资料,包括看起来可信的 LinkedIn 主页,以便通过粗略检查。"
Rust 项目表示,其手法与同朝鲜相关的 Contagious Interview 行动重叠,并敦促贡献者和 crate 所有者保持警惕,确保启用多因素认证 (MFA),并检查其账户是否存在意外登录。