Sha1-Hulud:新型npm GitHub蠕虫的二次进化
一个名为Sha1-Hulud的蠕虫病毒,针对Node包管理器(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随后执行bun_environment.js,这是一个同样嵌入在受感染包中的经过混淆的10MB文件。
凭据捕获组件会搜索特定文件,如npm和GitHub令牌、API密钥以及云凭证。它还使用TruffleHog扫描系统以寻找其他有用的凭据或会话令牌。随后,恶意软件会在受害者的GitHub账户下创建一个名为“Sha1-Hulud: The Second Coming”的公共仓库。所有被窃取的文件都会被转储到这个仓库中,标记出受影响的组织,并使这些文件可被访问。不仅是威胁攻击者,任何人都可以公开访问这些文件。
蠕虫传播
Sha1-Hulud 2.0的另一个特性是感染新npm包的传播过程。利用在凭据捕获过程中发现的npm令牌,它会下载受害者维护的所有包。然后,它将setup_bun.js和bun_environment.js插入这些包中,并以递增的版本号重新发布。这将触发所有使用该包的开发环境自动更新。
惩罚性自我销毁功能
如果受害者发现入侵并试图切断恶意软件的访问,恶意软件会尝试删除受害者主目录中的所有文件。它不仅进行简单的删除。在Windows上,恶意软件还会覆盖磁盘扇区;在Xnix系统上,它使用shred命令。这使得文件恢复的可能性大大降低。
利用GitHub Actions执行远程代码
另一个新特性是Sha1-Hulud 2.0如何利用GitHub Actions在受害者的系统上执行任何他们想要的代码。恶意软件会在受害者的账户下创建一个启用了公共讨论的公共仓库。然后,恶意软件创建一个名为~/.dev-env/的隐藏目录,在其中安装GitHub Actions运行器,并上传一个名为.github/workflows/discussion.yaml的恶意工作流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]