npm供应链蠕虫攻击技术深度分析

26 阅读5分钟

Sha1-Hulud:新型npm GitHub蠕虫的再次来袭

Sha1-Hulud携其供应链攻击的新变种回归,此次攻击通过Node Package Manager (npm) 针对开发环境。npm是Node.js非常流行的包管理器,为数百万JavaScript开发者提供海量预开发的代码包。

基于现有信息,我们确认此次事件未对我们或我们的客户造成任何暴露或影响。作为值得信赖的安全伙伴,我们正为我们的客户和合作伙伴保持高度警惕,并监控任何可疑活动。若有新信息改变此评估,我们将直接提供更新。

此次攻击活动通过恶意代码感染了未受保护的npm包,当使用该包的开发者更新到受感染的版本时,恶意代码会自动执行。迄今为止,已确认有近1000个npm包被感染,进而影响到数万个代码仓库。

首次攻击活动

早在2025年9月,Sha1-Hulud就发起了针对npm包的首次攻击。通过在数百个未受保护的npm包中插入木马化代码,这些包在所有依赖它们的本地开发环境中被自动“更新”。该恶意软件有两个主要组件:一个凭证窃取器和一个允许蠕虫行为传播的组件。

再次来袭

本周发现的最新攻击活动在原始攻击的基础上进行了多方面扩展。除了凭证捕获器和传播工具外,这个新变种还增加了一个惩罚性的“自毁”功能。它同时增加了跨平台支持,可在Linux、macOS和Windows上运行,并滥用GitHub Actions来实现远程代码执行能力。

安装与凭证捕获

受感染的npm包的package.json中包含一个名为setup_bun.js的预安装脚本。这个加载器脚本试图通过伪装成安装Bun JavaScript运行时来隐藏其行为。接着,setup_bun.js会执行同样嵌入在受感染包中的、经过混淆处理的10MB文件bun_environment.js。

凭证捕获组件会搜索特定的文件,如npm和GitHub令牌、API密钥和云凭证。它还使用TruffleHog扫描系统以寻找其他有用的凭证或会话令牌。随后,恶意软件会在受害者的GitHub账户下创建一个名为"Sha1-Hulud: The Second Coming"的公开仓库。所有被窃取的文件都会被转储到这个仓库中,标记受影响的组织,并使文件对所有人公开可访问,而不仅仅是威胁行为者。

蠕虫传播

Sha1-Hulud 2.0的另一个特性是感染新npm包的传播过程。利用在凭证捕获过程中发现的npm令牌,它会下载受害者维护的所有包。接着,它将setup_bun.js和bun_environment.js插入到这些包中,并以递增的版本号重新发布。这将触发所有使用该包的开发环境的自动更新。

惩罚性自毁功能

如果受害者发现系统被入侵并试图切断恶意软件的访问,恶意软件会尝试删除受害者主目录中的所有文件。它不仅进行简单的删除。在Windows系统上,恶意软件还会覆盖磁盘扇区;在Unix类系统上,它使用shred命令。这使得文件恢复的可能性大大降低。

利用GitHub Actions执行远程代码

另一个新特性是Sha1-Hulud 2.0如何利用GitHub Actions在受害者系统上执行任意代码。恶意软件会在受害者账户下创建一个启用公开讨论功能的公开仓库。接着,恶意软件会创建一个名为~/.dev-env/的隐藏目录,在那里安装GitHub Actions运行器,并上传一个恶意的YAML工作流文件,命名为.github/workflows/discussion.yaml。这个YAML文件将仓库中的任何讨论帖子都解释为要在本地执行的命令。由于讨论论坛是公开的,任何人都可以在讨论中发布类似 powershell -noexit "& ""C:\My Scripts\MyEvilScript.ps1""" 的命令,并在受害者的系统上执行。

缓解措施

  • 持续对相关的威胁指标进行威胁狩猎,以发现任何正在进行的入侵,特别是在您的开发和CI/CD系统中。
  • 在此次攻击活动的全部范围更加明确之前,暂时冻结任何npm包的更新。
  • 假设恶意软件的存在意味着该系统上的所有凭证都已泄露,并据此重置凭证。
  • 重新审视您的供应链安全策略,包括对第三方供应商进行盘点和审计,以及记录您的组织可能因这些关系而面临的风险。

威胁指标

bun_environment.js

  • 62ee164b9b306250c1172583f138c9614139264f889fa99614903c12755468d0 [SHA256]
  • f099c5d9ec417d4445a0328ac0ada9cde79fc37410914103ae9c609cbc0ee068 [SHA256]
  • cbb9bc5a8496243e02f3cc080efbe3e4a1430ba0671f2e43a202bf45b05479cd [SHA256]

setup_bun.js

  • a3894003ad1d293ba96d77881ccd2071446dc3f65f434669b49b3da92421901a [SHA256]