GitLab 发现大规模 NPM 供应链攻击
GitLab 的安全团队发现了一场大规模的 npm 供应链攻击。一种名为 “Shai-Hulud” 的恶意软件变种通过感染开发者维护的 npm 包进行蠕虫式传播,窃取 GitHub、云服务和 npm 的凭证。这些数据被上传至攻击者控制的 GitHub 仓库。最危险的是,该恶意软件包含一个“死手开关”,一旦其传播和数据窃取通道被切断,就会触发破坏性的数据删除程序,严重威胁用户的数据安全。
攻击揭秘
GitLab 的内部监控系统扫描开源软件包注册中心时,发现了多个被复杂恶意软件感染的 npm 包。该恶意软件具备以下特点:
- 窃取凭证: 搜刮来自 GitHub、npm、AWS、GCP 和 Azure 的凭证。
- 窃取数据: 将偷来的数据上传到攻击者控制的 GitHub 仓库。
- 自动传播: 自动感染受害者拥有的其他软件包,实现蠕虫式扩散。
- 包含破坏性负载: 如果恶意软件无法访问其基础设施,就会触发数据销毁程序。
由于其蠕虫式的传播机制,很可能有更多软件包已被感染。
攻击的技术分析
初始感染
恶意软件通过一个多阶段加载过程进入系统。受感染的包在其 package.json 文件中包含一个恶意的 preinstall 脚本,该脚本指向一个名为 setup_bun.js 的文件。
- 伪装:
setup_bun.js脚本伪装成安装合法的 Bun JavaScript 运行时的工具。 - 执行: 实际上,它会执行包内一个名为
bun_environment.js的、经过高度混淆的 10MB 恶意文件。
这种分层方法有助于逃避检测,因为初始加载器看起来无害,而真正的恶意代码则被隐藏在一个大文件中。
凭证搜刮
恶意软件一旦执行,会立即从多个来源搜刮凭证:
- GitHub 令牌: 搜索环境变量和 GitHub CLI 配置,寻找以
ghp_或gho_开头的令牌。 - 云服务凭证: 通过官方 SDK 枚举 AWS、GCP 和 Azure 的凭证。
- npm 令牌: 从
.npmrc文件和环境变量中提取用于发布软件包的令牌。 - 文件系统扫描: 下载并运行合法的安全工具 Trufflehog,扫描整个用户主目录以查找隐藏的 API 密钥、密码和其他秘密信息。
数据窃取与传播网络
恶意软件利用窃取的 GitHub 令牌创建公开仓库,并在描述中加入特定标记:“Sha1-Hulud: The Second Coming”。这些仓库被用作存放窃取数据的“投递箱”。
更关键的是,如果一个令牌权限不足,恶意软件会搜索其他带有相同标记的受感染仓库,从而获取其他系统的访问令牌。这形成了一个类似僵尸网络的弹性网络,受感染的系统之间可以共享访问权限。
供应链传播
利用窃取的 npm 令牌,恶意软件会:
- 下载受害者维护的所有软件包。
- 将恶意的
setup_bun.js加载器注入每个包的preinstall脚本中。 - 捆绑恶意的
bun_environment.js负载。 - 增加软件包的版本号。
- 将受感染的软件包重新发布到 npm。
“死手开关”:毁灭性威胁
分析发现,该恶意软件包含一个破坏性负载,旨在对抗下架行动。
恶意软件会持续监控其对 GitHub(用于数据窃取)和 npm(用于传播)的访问权限。如果一个受感染的系统同时失去这两个通道,它会立即触发本地机器上的数据销毁程序。
- 在 Windows 系统上: 它会尝试删除所有用户文件并覆写磁盘扇区。
- 在 Unix 系统上: 它使用
shred命令在删除文件前进行覆写,使数据恢复几乎不可能。
这意味着,如果 GitHub 或 npm 大规模删除恶意仓库或撤销受感染的令牌,可能会导致成千上万的受感染系统同时触发数据自毁,造成灾难性后果。
关键风险指标 (IoCs)
- 文件: 在
node_modules目录中出现bun_environment.js文件。 - 目录: 在用户主目录中出现隐藏的
.truffler-cache/目录。 - 进程 (Windows): 出现
del /F /Q /S "%USERPROFILE%*"或cipher /W:%USERPROFILE%等破坏性命令。 - 进程 (Linux/Mac): 出现
shred -uvz -n 1等破坏性命令。 - 命令: 在 npm 安装过程中出现可疑的 Bun 安装命令,如
curl -fsSL https://bun.sh/install | bash。
如何检测与防护
使用 GitLab Ultimate 的用户可以利用内置的安全功能来发现此攻击。
- 启用依赖扫描 (Dependency Scanning): 自动分析项目的依赖项。如果
package-lock.json或yarn.lock文件中存在受感染的包,扫描将在流水线和漏洞报告中发出警报。 - 使用 GitLab Duo Chat: 可以直接向安全分析代理提问,快速检查项目是否受到影响,例如:
- “我的依赖项是否受到 Shai-Hulud v2 恶意软件活动的影响?”
- “这个项目是否存在 npm 供应链漏洞?”
结合这两种方法:使用依赖扫描进行持续的自动化检测,并利用聊天代理进行快速的临时调查和响应。