ChainDrop 供应链攻击:自传播蠕虫的剖析
导语:Microsoft 威胁情报部门披露了一场大规模 npm 供应链攻击,影响超过 400 个包,攻击者投放的是 Mini Shai-Hulud 变种蠕虫,能够自传播并窃取开发者及 CI/CD 环境中的各类凭据。本文剖析其攻击链、传播机制、受影响环境,并提供检测与修复建议。
Microsoft 威胁情报部门发现了一场大规模 npm 供应链攻击,波及超过 400 个由多个无关维护者发布的包,其中包括与 keyv、flat-cache、cache-manager 等主要企业软件生态系统相关的包。恶意版本包含一个 Mini Shai-Hulud 变种——一种通过庞大且高度混淆的基于 Bun 的 JavaScript 载荷投递的自传播凭据窃取蠕虫。该恶意软件通常通过 npm preinstall 生命周期钩子在包安装完成之前自动执行。
一旦执行,恶意软件会搜索开发者工作站以及持续集成和持续交付(CI/CD)环境中的 npm、GitHub、云和基础设施凭据。它使用获取的标识对 npm、GitHub、Amazon Web Services(AWS)、Kubernetes 和 HashiCorp Vault 进行身份验证,从而枚举包、仓库、工作流密钥、云参数和密钥存储库中的值。收集到的数据经过加密后通过攻击者控制的 HTTPS 端点传输,其中 GitHub 仓库作为备用泄露通道。
该载荷最重要的功能是自动传播。获取 npm 发布令牌后,它会枚举该被入侵身份可用的包,下载其最新 tarball,插入恶意软件和 setup 加载器,添加 preinstall 钩子,递增补丁版本号,并重新发布修改后的包。该恶意软件还可以利用被盗的 GitHub 凭据将 Claude 和 Visual Studio Code 配置文件注入到仓库中,从而建立持久化机制并创建额外的开发者到开发者的感染路径。
在防护、检测和追踪方面,安装了启用生命周期脚本的受影响包的机构应将相应的开发者工作站或构建运行器视为可能已被入侵。调查应优先关注受影响身份可访问的凭据、未经授权的 npm 发布、异常的仓库或工作流修改、可疑的云和密钥存储访问,以及受影响构建系统产生的工件。机构应从已知清洁的环境中撤销并轮换暴露的凭据,并从可信来源重建受影响的系统和下游工件。

此次攻击活动表现为在超过 400 个由无关维护者维护的 npm 包上快速连续地发布未经授权的补丁版本。许多恶意版本没有对应的源代码提交、拉取请求、标签或合法发布,表明攻击者直接修改并发布了包 tarball,而非入侵每个公共源代码仓库。
受影响的版本通常会添加一个 preinstall 生命周期脚本,该脚本启动包内包含的恶意文件 setup.mjs,从而启动包中包含的大型混淆 Bun JavaScript bundle。由于 npm 在安装完成之前运行 preinstall 脚本,载荷可以在应用程序测试或常规安全检查开始之前,在开发者工作站和构建运行器上执行。
执行后,恶意软件的传播例程会下载每个发布者的最新版本,插入自身,递增补丁版本号,并发布生成的归档。这种机制可以迅速将一个被入侵的 npm 身份转变为大量恶意包发布。

证据表明,被盗的维护者凭据是初始入侵的攻击向量。后续传播使用了被盗的 npm 发布令牌,并在有针对性的工作流中使用了 GitHub Actions OIDC 发布访问权限。
在预检阶段,载荷会检查环境,在俄语系统上退出,避免重复实例,并在开发者系统上以后台分离副本的方式启动。在 CI 环境中,载荷保持挂载状态,以便访问活动构建作业可用的凭据。
载荷首先从本地系统、shell 和 GitHub Actions 运行器中收集即时可用的信息。Shell 收集器尝试获取 GitHub CLI 令牌并捕获所有进程环境变量的值。文件系统收集器会搜索凭据文件、shell 历史记录、云配置、安全外壳(SSH)密钥以及其他敏感位置。
然后,恢复的代码会为云和基础设施服务创建专用收集器。这些模块不仅扫描文件中的令牌模式,还使用可用凭据调用服务 API,验证访问权限,并检索这些身份允许的额外密钥。在用于其他收集或仓库访问之前,发现的 GitHub 令牌会经过验证。
来源信息
来源:Microsoft Security Blog
作者:Microsoft Security Research, Ravikant Tiwari, Sagar Patil and Suriyaraj Natarajan

