内容提要
安全研究人员披露了一起npm供应链攻击,影响超400个包,涉及Keyv和Cacheable。攻击者利用窃取的开发者凭据发布恶意版本,植入Mini Shai-Hulud蠕虫,窃取凭据并自动发布感染包。该攻击暴露了可信发布的弱点,建议升级npm CLI 12、固定版本、重建受影响系统,并限制自动化流程权限。
延伸解读
攻击手法:利用可信发布流程
此次攻击并非直接攻破npm仓库,而是通过窃取维护者的凭据,在受信任的发布流程中植入恶意代码。攻击者利用npm的preinstall钩子,在安装时自动执行恶意脚本,从而在开发机和CI环境中窃取更多凭据。这种手法表明,供应链攻击正从直接入侵转向利用开发者已信任的发布环节,使得恶意包甚至能携带有效的来源证明,增加了检测难度。
对CI/CD环境的警示
共享CI系统成为攻击的放大器,因为GitHub Actions会缓存依赖,且这些缓存未签名或验证。攻击者利用CI作业中的活动连接,访问工作流密钥和发布权限。这提醒工程团队,应避免在安装依赖的流水线部分保留发布权限,并限制自动化流程的权限范围,以降低被恶意利用的风险。
缓解措施与局限
微软建议升级npm CLI 12、固定已知良好版本,并利用min-release-age设置发布时间门槛,以便团队在安装前有时间审查新版本。然而,一旦恶意包运行了生命周期脚本,仅轮换被盗令牌可能不够,还需重建受影响的机器和基础镜像、清除共享缓存,并从可信依赖重新创建软件工件。这些措施强调了纵深防御的重要性。
Q&A
这次npm供应链攻击影响了多少包?
超过400个包,包括与Keyv和Cacheable相关的项目。
攻击者是如何实施这次npm供应链攻击的?
攻击者使用窃取的开发者凭据发布恶意版本,植入Mini Shai-Hulud蠕虫,该蠕虫会搜索开发者机器和CI环境中的其他凭据,一旦发现有效的npm发布令牌,就会下载账户可访问的每个包的最新版本,注入恶意预安装钩子,提升补丁版本号并发布受感染的包。
Mini Shai-Hulud蠕虫在CI环境和工作站上分别有什么危害?
在CI环境中,它会保持与活动作业的连接,从而访问工作流机密、运行器凭据和发布权限;在工作站上,它会在后台运行,并向Visual Studio Code和Claude注入启动文件,如.vscode/tasks.json和.claude/settings.json。
为什么这次攻击暴露了可信发布的弱点?
因为攻击者利用的是受信任的开发者凭据,并且恶意软件在授权工作流内运行,可以请求自己的短期令牌,而不是窃取长期凭据,甚至生成的恶意包可以带有有效的来源证明。
微软建议如何防范此类npm供应链攻击?
微软建议升级到npm CLI 12,固定已知良好的版本,并使用min-release-age给团队时间审查新版本。此外,可能需要重建受影响的机器和基础镜像,清除共享缓存,并从可信依赖重新创建软件工件。
为什么仅轮换被盗令牌可能不够?
因为一旦受感染的包运行了生命周期脚本,恶意软件可能已经持久化或窃取了其他凭据,仅轮换令牌无法清除已存在的感染,需要重建系统和清理环境。
这次攻击对工程团队有什么教训?
工程团队应将发布访问权限与安装依赖的管道部分分离,并限制自动化流程的权限,因为共享CI系统(如GitHub Actions)会重用依赖,且缓存文件未签名或验证,增加了风险。