ChainDrop蠕虫肆虐npm生态:窃取云凭证与CI密钥,400+热门包沦陷
ChainDrop是Palo Alto Unit42发现的npm自传播蠕虫,感染400余个包,窃取云凭证、npm/GitHub令牌、SSH密钥,并能从GitHub Actions内存中提取OIDC令牌。本文深度分析攻击链、行为特征及检测缓解方案,帮助组织防御npm供应链威胁。
⛓️ Critical 供应链攻击
ChainDrop是一种自传播npm蠕虫,已感染400多个软件包,包括keyv、cacheable-request等每周下载量达数亿次的热门包。攻击者利用恶意preinstall脚本和Bun运行时执行混淆载荷,窃取云凭证、GitHub/npm令牌、SSH密钥等敏感数据,并能从GitHub Actions内存中提取OIDC令牌,通过区块链交易动态切换C2基础设施。
来源:Palo Alto Unit42 | 2026-08-06 | 原文链接
🔍 关键发现
- 感染400余个npm包,含keyv、cacheable-request等高下载量包,恶意版本每周合计下载量达数亿次
- 攻击者利用Bun作为合法运行时执行混淆后的JavaScript载荷,规避检测并实现跨平台持久化
- 通过区块链(以太坊)交易动态重构C2基础设施,无需更新已部署恶意代码即可切换控制端
- 蠕虫能读取GitHub Actions Runner进程内存,窃取OIDC令牌和runner secrets,并利用npm发布令牌继续感染其他包
- 设置俄语环境检查,在俄语系统上自动退出,疑似规避特定地区追踪
⚔️ 攻击链分析
1. 恶意npm包通过生命周期钩子(preinstall)触发setup.mjs 2. setup.mjs检测/下载Bun,并使用Bun执行混淆的math_init.js 3. 载荷启动后台进程,收集凭证、令牌、配置文件并扫描CI runner内存 4. 窃取的npm/GitHub令牌被用于发布恶意版本包,形成自传播循环,并通过区块链交易更新C2
🚩 失陷指标 (IOC)
setup.mjsmath_init.jsBun 1.3.13github.com/Oven-sh/Bun (被滥用,非恶意)ethereum transaction (C2更新通道)
🛡️ 缓解建议
- ✅ 立即检查并移除受影响npm包版本,重点关注keyv、cacheable-request及其依赖链
- ✅ 调查开发者工作站和CI runner中的异常进程、文件及运行日志,寻找ChainDrop执行痕迹
- ✅ 轮换并撤销可能暴露的npm、GitHub、云IAM、SSH及自动化凭据
- ✅ 阻断基于域名和GitHub的C2外传通道,并监控区块链交易相关地址
- ✅ 使用Koi Agentic Endpoint Security、Cortex XDR等产品进行行为检测和响应
- ✅ 审查npm发布活动和GitHub仓库异常变更,启用强MFA和条件访问策略
涉及漏洞:[]
⚠️ 本文仅供安全研究与学习,IOC 信息请勿用于非法目的。
🤖 常见问题解答(FAQ)
❓ ChainDrop如何实现自传播?
窃取开发者机器上的npm发布令牌和GitHub令牌,利用这些令牌将恶意修改后的包版本发布到npm仓库,保留原包功能但注入preinstall钩子。
❓ 攻击者如何动态控制C2?
攻击者通过以太坊交易修改C2解析配置,被感染的存量恶意代码无需更新即可自动指向新的C2地址,增强了抗追踪和持久化能力。
❓ 如何检测开发环境是否被感染?
查找package.json中的preinstall脚本指向setup.mjs、进程中存在Bun执行math_init.js、异常外联流量、GitHub Actions日志中出现调试输出,以及未授权的npm发布记录。