NPM 投毒分析 — Shai-Hulud 攻击重现
作者:Joker&Ccj背景
近日,NPM社区再次爆发大规模 NPM包投毒事件,本次事件与2025年9月的Shai-Hulud攻击事件高度相关,本次的NPM包中的恶意代码窃取开发者密钥和API密钥以及环境变量等敏感信息,利用密钥创建公开仓库并上传这些窃取的敏感信息。
慢雾(SlowMist)自主研发的Web3威胁情报与动态安全监控工具MistEye第一时间响应,迅速推送相关威胁情报,为客户提供关键的安全保障。

同时,后台会在第一时间保存恶意样本,并计算其对应的SHA-256等特征值。

在package.json中新增了preinstall脚本,使得在依赖安装之前会自动执行setup_bun.js。

经过将恶意脚本的部分代码反混淆后,可知aL0()是整个恶意脚本的主入口函数,大概的可以看出此恶意脚本进行了敏感信息的窃取,会先对运行环境进行检查是否存在NPM或GitHub等凭据,若检测到这些凭据,它会利用NPM凭据进行供应链传播,并且所有收集到的系统信息和敏感数据最终会被打包并上传到攻击者控制的GitHub仓库,用于后续利用。
凭据窃取
AWS:该恶意脚本实现runSecrets()和listAndRetrieveAllSecrets()方法,runSecrets()方法会遍历所有能找到的云访问凭据以及所有可能的区域,最大化扫描范围;而listAndRetrieveAllSecrets()则在指定凭据与区域内进行“深度挖掘”,遍历出所有Secret,并获取其最新明文内容。两者配合后,攻击者能够将受害者AWS账号中可访问的所有SecretString和SecretBinary一次性全部导出。

GCP:该恶意脚本中实现的另一个listAndRetrieveAllSecrets()方法主要是针对GCP模块,它会先根据指定的ProjectID列出该GCP项目下所有的Secret,然后直接定位每个Secret的最新版本,并调用accessSecretVersion读取其明文内容。最终将所有获取到的机密(如APIKey、数据库密码等)逐一收集起来。

在窃取敏感信息的实现中,还使用合法的安全工具来攻击受害者。在extractAndInstall()方法中,解压并提取出TruffleHog的二进制文件,TruffleHog本是用于在代码库中检测和验证泄漏的机密信息,如API密钥和凭证,则被攻击者使用来对受害者的整个文件系统进行扫描。

在窃取完信息后,将利用窃取的GitHubToken在其账号下创建一个随机名称的仓库,并获取注册令牌,将受害者的电脑伪装成该仓库的自托管GitHubActionsRunner。随后,攻击者在仓库中植入恶意工作流,使得任何被触发的Actions任务都会在受害者机器上执行,从而实现远程代码执行。

经过解密后可以看到用户泄漏的敏感数据。

总结
本次的NPM仓库投毒结合了蠕虫和自托管运行程序的长期持久性且利用了TruffleHog进行攻击。慢雾安全团队建议开发者在构建和发布新迭代时,应采用依赖包版本锁定策略。若依赖包存在必要的安全或功能更新,应通过内部严格的安全审计流程进行更新,并同步更新锁定版本,避免盲目更新引入新的风险。
