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.jsonyarn.lock 文件中存在受感染的包,扫描将在流水线和漏洞报告中发出警报。
  • 使用 GitLab Duo Chat: 可以直接向安全分析代理提问,快速检查项目是否受到影响,例如:
      • “我的依赖项是否受到 Shai-Hulud v2 恶意软件活动的影响?”
      • “这个项目是否存在 npm 供应链漏洞?”

结合这两种方法:使用依赖扫描进行持续的自动化检测,并利用聊天代理进行快速的临时调查和响应。