“每个恶意版本都是一个加载器(loader)。”安全公司StepSecurity在分析报告中这样描述,为代号SleeperGem的供应链攻击定了调。安全研究人员近日揪出一起专门盯上Ruby生态的新型攻击,三个被投毒的RubyGems包已悄然潜入官方仓库,目标直指开发者的本地机器,而非通常的持续集成环境。
时间线往回拨,最早出现异常的竟是两个“沉睡”多年的老包。2017年10月14日,名为Dendreo的gem首次发布了恶意版本1.1.3和1.1.4;四个月后,fastlane-plugin-run_tests_firebase_testlab在2018年2月6日发布了0.3.2版。这两个包原本都有正当用途,但此后长期保持静默——Dendreo上一个正常更新要追溯到2020年10月24日,fastlane插件则自2019年3月9日后就再无动静。直到多年后的今天,它们突然以恶意更新的面貌复活,而且新版本没有任何对应的代码提交或标签,直接从注册表推送。
真正引人注目的是2026年7月18日登场的git_credential_manager,它的名字明目张胆地冒充了微软官方出品的Git Credential Manager。这个工具包一口气发布了2.8.0、2.8.1、2.8.2和2.8.3四个版本,恶意代码就藏在看似正常的更新里。更危险的是,git_credential_manager被添加为另外五个包的依赖,包括前面提到的Dendreo和fastlane插件,以及slackHtmlToMarkdown、seo_optimizer和array_fast_methods。这意味着,哪怕开发者只是安装或更新了这些间接依赖的包,恶意加载器也会被顺带引入他们的工程项目。
除了fastlane插件由“pinkroom”账户维护,其余四个问题包都归属于同一账号“LR-DEV”,这暗示着多个RubyGems维护者账号很可能已经遭到入侵。攻击者通过控制这些普通开发者的身份,把看似无害的gem变成了跳板。
这些恶意包到底在做什么?当开发者的Ruby应用require了被污染的库,攻击流程就自动触发。以git_credential_manager为例,一旦被加载,它会立刻连接到一个公共的Forgejo实例(git.disroot.org上的git-ecosystem仓库),下载两个文件:一个shell脚本deploy.sh和一个与冒充工具同名的原生二进制文件。在Windows系统上,下载的payload会通过PowerShell直接执行。
StepSecurity的分析指出,这套攻击设计了精巧的环境检测逻辑。恶意代码会扫描受感染系统上的大约30个环境变量,涵盖GitHub Actions、GitLab CI、CircleCI、Travis CI、Jenkins、Vercel等主流CI/CD平台。一旦发现任何CI特征,程序就立即退出,避免在短暂的构建容器里留下痕迹。只有确认运行在开发者的实体机器上时,它才会继续下一步:执行安装脚本拉起后台守护进程,实现持久化驻留。
在git_credential_manager的2.8.2版本中,攻击还停留在“准备阶段”——仅将payload下载并暂存;到了2.8.3版,危险的下一步终于落地:部署脚本正式启动二进制文件,以后台daemon的形式长期潜伏,为后续的远程控制或数据窃取打开通道。虽然目前公开的信息里还没有透露最终payload的具体行为,但这种“先侦察再投放”的多阶段手法,加上对CI环境的刻意回避,已经让安全社区意识到,攻击者的目标极有可能是窃取开发者凭据、源码或者植入更深层的后门。
SleeperGem的命名本身就折射出这次攻击的特点:恶意包像休眠的种子一样躺在仓库里,等待时机发芽。供应链安全的警钟又一次被敲响,开发者在引入任何依赖时,哪怕是此前一直可信的旧包,也要对新版本保持警惕。
热门跟贴