ChainDrop蠕虫:npm投毒窃取云端令牌,软件供应链暗角全面失守
Unit 42揭示ChainDrop npm蠕虫攻击链:通过恶意preinstall脚本窃取OIDC令牌和开发者凭证,感染超400个npm包。本文深入分析SDLC供应链的端点、CI/CD和云运行时攻击面,提供缓解建议,帮助安全团队构建全面的供应链防护策略。
⛓️ Critical 供应链攻击
ChainDrop蠕虫通过恶意npm预安装脚本,在开发者执行npm install时静默感染,攻击GitHub Actions runner进程内存窃取OIDC令牌和开发者凭证,并利用窃取令牌自我传播,同时篡改VS Code等工具实现持久化。该攻击覆盖SDLC的端点、CI/CD和云运行时,凸显供应链安全的盲区。
来源:Palo Alto Unit42 | 2026-08-21 | 原文链接
🔍 关键发现
- ChainDrop感染超过400个npm包,包括keyv和cacheable-request等流行库,利用preinstall脚本执行恶意负载。
- 攻击者通过读取GitHub Actions runner进程内存窃取OIDC令牌和临时密钥,并扫描本地开发者凭证。
- 蠕虫使用以太坊区块链交易管理C2基础设施,并通过篡改VS Code和Claude Code配置实现长期持久化。
- 现代应用80-90%代码来自开源组件,但SBOM仅在构建结束时生成,无法捕获构建期间执行的恶意行为,需要PBOM和容器SBOM。
⚔️ 攻击链分析
1. 攻击者修改npm包清单,插入恶意preinstall脚本;2. 用户执行npm install时,脚本下载Bun运行时并加载混淆的727KB负载;3. 负载读取GitHub Actions runner内存中的OIDC令牌和密钥,并收集本地开发者凭证;4. 使用窃取的令牌将恶意包重新发布到npm,传播蠕虫,并在VS Code等工具中设置持久化钩子。
🚩 失陷指标 (IOC)
恶意npm包:keyv(被篡改版本)恶意npm包:cacheable-request(被篡改版本)可疑行为:npm preinstall脚本引用外部URL下载Bun运行时
🛡️ 缓解建议
- ✅ 禁用npm生命周期脚本:在CI/CD和开发环境中设置 npm config set ignore-scripts true,或使用 --ignore-scripts 标志安装依赖。
- ✅ 实施包冷却期,避免立即使用新发布或刚更新的依赖包,并固定依赖到确切commit SHA,而非版本范围。
- ✅ 限制CI/CD管道出口流量,使用临时/短暂构建服务器,确保构建环境不包含持久化凭证。
- ✅ 在端点、管道和云端运行时收集并关联遥测数据,检测异常行为,如进程内存访问或工具配置篡改。
- ✅ 使用SBOM、PBOM和容器SBOM的组合,全面映射第三方包在不同阶段的接触点。
涉及漏洞:[]
⚠️ 本文仅供安全研究与学习,IOC 信息请勿用于非法目的。
🤖 常见问题解答(FAQ)
❓ 如何检测开发环境中是否存在ChainDrop恶意活动?
监控npm install时的异常子进程(如启动Bun运行时)、检查VS Code tasks.json等配置文件是否被篡改、审计进程对GitHub Actions runner内存的读取行为。
❓ ChainDrop如何窃取OIDC令牌?
恶意Python脚本读取GitHub Actions runner进程的/proc/<pid>/mem(Linux)或等效机制,扫描未加密的OIDC临时令牌和密钥,无需访问文件系统。
❓ 企业如何防范npm预安装脚本攻击?
全局禁用脚本执行(--ignore-scripts),仅允许白名单中的脚本;对依赖包进行来源验证和冷却期;使用沙箱运行开发者工具和包管理命令。