图1|TeamPCP事件全景拼图,涵盖FBI通告、GitHub界面与嫌疑人社交账号

2026年3月的短短五天里,一枚被盗走的服务账号token让一个黑客组织同时污染了五个软件生态,其中一个被投毒的包每月下载量高达9500万次。攻击的起点只是一个配置不当的GitHub Actions工作流,终点却是遍布全球的CI/CD流水线里躺着带后门的代码。

就在最近,这起攻击背后的两名核心成员被澳大利亚警方逮捕。一份详细调查报告完整还原了他们如何从一个看似普通的别名出发,借助公开情报、泄露凭证和跨平台账号关联,把号称软件供应链攻击之王的TeamPCP核心成员去匿名化deanonymization的全过程。

很多人以为黑客躲在网络假名背后就无从查找,但TeamPCP的案例恰恰说明,只要攻击者在多个平台留下痕迹,复用了头像、用户名、密码或者域名,安全研究员就能像拼拼图一样把这些碎片串成一条完整证据链,最终把网络上的代号对应到现实世界里的具体自然人。

TeamPCP是谁:从云扫描小团伙到供应链攻击之王

前言:TeamPCP:正在以前所未有的规模污染开源代码的黑客组织

TeamPCP最早在2025年末浮出水面,当时它还只是一个机会主义的云漏洞利用团伙。他们用自动化扫描器在互联网上大范围搜寻暴露在外的Docker API、Kubernetes控制平面、Ray仪表盘和Redis实例,一旦拿下一台主机就往里面部署容器,被攻陷的服务器会自动变成新的扫描节点和代理节点,整个感染过程像蠕虫一样自我传播。

Flare的蜜罐直接观测到了这一阶段的活动,单轮攻击里就记录下185台Docker主机遭到入侵。这个阶段团伙的收入来源有三块,XMRig门罗币挖矿赚得最少,出租代理网络收入更高,剩下一部分来自窃取数据之后的泄露和敲诈售卖。

2025年12月,TeamPCP借着React2Shell漏洞对Next.js应用发起大规模攻击,他们自己控制服务器的后台面板显示,不到48小时就有超过59000台服务器被攻陷,这也是团伙第一次真正进入公众视野。

转型:把枪口对准软件供应链

2026年初,TeamPCP调整了攻击重心,把全部火力转向软件供应链,专门瞄准其他公司广泛信任的安全类开源工具。2026年2月底,他们利用Aqua Security旗下Trivy中一个配置不当的GitHub Actions工作流窃取了服务账号token,Trivy是目前部署最广泛的开源漏洞扫描器。Aqua随后轮换了凭证,但漏掉了一部分,残留的访问权限就这样保留了下来。

3月19日,TeamPCP同时在所有分发渠道发布了一个带恶意的Trivy版本,这个版本把凭证窃取器credential stealer植入了成千上万条CI/CD流水线。访问权限随之产生连锁反应,AI代理库LiteLLM在自己的构建流水线里运行了被投毒的Trivy,攻击者顺势拿到了LiteLLM的PyPI发布token,3月24日他们发布了两个带后门的LiteLLM版本,而这个包每月下载量大约9500万次。

一枚从未被彻底吊销的token,让一个团伙在大约五天里毒化了五个软件生态,这就是TeamPCP被称为软件供应链攻击之王的原因。

别名体系与高调行事风格

图2|TeamPCP核心组织对应的多个别名映射图

这个组织在不同场景使用不同代号,核心身份是TeamPCP,早期对外行动叫PCPcat,发布泄露数据时用ShellForce,GitHub上存放攻击工具的账号叫DeadCatx3,Telegram通讯账号则用过Persy_PCP和PCPsh。

团伙行事风格非常高调,运营Telegram频道,在X平台用@pcpcats账号发帖公开嘲讽受害者,还接受过Forbes的媒体采访,对外自称是一群找不到正式工作的青少年和年轻人,因此走上网络犯罪道路。也正是这种热衷于对外炫耀、索要功劳的习惯,不断留下可供溯源的数字痕迹,成为安全团队破开匿名伪装的突破口。

溯源起点:一个独特的用户名DeadCatx3

Flare的Threat Flow人工智能威胁分析工具显示,TeamPCP在之前的行动中使用过几个用户名,其中一个叫DeadCatx3,这个名字足够独特,是一个理想的调查切入点,也成为了整个溯源分析的锚点。

研究人员把这个名字输入OSINT Industries,这是一个可以在数百个社交媒体平台上搜索用户名的工具,返回结果里有几个账号引起了注意,包括HackerOne、Hugging Face、Scratch、eBay和Twitter。

图3|以DeadCatx3为锚点在多平台搜索到的关联账号分布

其中一个结果来自HackerOne,这是一个为企业提供众包漏洞赏金bug bounty和渗透测试的平台,这个账号关联的真实姓名是Ruben Thomson。事情会这么简单吗,显然还需要更多证据来确认这不是重名或者被盗用的身份。

图4|HackerOne平台上用户名deadcatx3对应的账号资料,姓名显示为ruben thomson

初始搜索中找到的另一个账号是Hugging Face上的个人资料,名字缩写是RT,很可能就是Ruben Thomson的缩写。

图5|Hugging Face上用户名为DeadCatX3的个人主页,显示姓名缩写RT

更关键的是,这个Hugging Face资料里列出了一个域名masscan[.]cloud,而这个域名正是TeamPCP在今年5月发布的Mini-Shai-Hulud蠕虫所使用的C2命令与控制服务器域名。用户名、姓名缩写、团伙基础设施三者在同一个账号上交汇,这条线索的分量一下子重了起来。

图6|Mini-Shai-Hulud蠕虫恶意代码中硬编码的C2地址api.masscan.cloud

名字深挖:从学校邮箱到泄露密码

为了进一步确认这个身份,同时排除身份被盗用的可能,研究人员围绕Ruben Thomson这个名字继续挖掘,找到了几个关联邮箱,包括一个.edu.au结尾的学校邮箱和一个.org.au结尾的邮箱。用学校邮箱在Flare的Credentials Browser凭证浏览器工具里搜索,得到了一个密码。

图7|Flare凭证浏览器中以密码反查得到的关联邮箱列表

研究人员在Flare平台里对这个泄露密码做了反向关联,发现同一个密码还绑定了另一个邮箱surfinup8@gmail.com。密码复用是整个溯源链路里最关键的一环,它把一个看似正式的学校邮箱和一个私人Gmail直接连在了一起。

图8|PredictaGraph工具展示的surfinup8@gmail.com关联账号全景图

继续用这个Gmail地址在凭证浏览器里搜索,能找到17条历史泄露记录,时间跨度从2020年一直到2026年,来源包括Combolists、Aimware、Dubsmash、Coinmama、MyHeritage等多个数据泄露事件,这说明这个邮箱在过去多年里被广泛使用,也反复出现在各类凭证泄露库中。

图9|surfinup8@gmail.com在凭证浏览器中的17条历史泄露记录

社交账号拼图:TikTok、Steam与十年前的VAC封禁

围绕surfinup8这个Gmail继续查找关联账号,研究人员找到了一个TikTok账号yolosolo17,资料页显示的姓名正是Ruben Thomson,账号里唯一发布的视频是他自己的Steam账号界面,Steam用户名是YolocrownZ。

图10|TikTok账号yolosolo17的资料页,姓名显示Ruben Thomson,唯一视频是Steam账号截图

找到对应的Steam账号费了一些周折,因为有一系列邮箱共享同一个域名,有可能是家庭成员共用,研究人员翻遍泄露凭证才从其中一个邮箱关联到一个Steam账号。这里有个细节,TikTok视频里展示的那个Steam账号有VAC封禁记录,而通过熟人邮箱找到的这个账号没有VAC封禁。

图11|Ruben Thomson熟人的Steam账号资料页,所在地显示澳大利亚珀斯

在这个没有封禁的Steam账号评论区里,有一个叫Ellis的账号留下了评论,而这个Ellis账号恰好有一条VAC封禁记录,封禁日期和TikTok视频里那个账号显示的日期完全一致,都是2016年9月13日。两个账号在评论区互动,封禁日期又完全对得上,这说明TikTok视频里的YolocrownZ和这个Ellis账号属于同一个人。

图12|TikTok视频中展示的Steam账号与右侧视频元数据对比,VAC封禁日期均为2016年9月13日

图13|Ellis账号的Steam详细资料,显示2016年9月13日有一条VAC封禁记录

Thomson的Steam账号头像是一只坐在几台电脑显示器前的猫,用反向图片搜索没有找到任何结果,这说明这张图很可能是Ruben Thomson本人独有的,不是从网上随便找的通用图片。

图14|Thomson的Steam账号头像,一只坐在电脑前的卡通猫

证据闭环:Telegram头像与Steam头像完全一致

为了把所有碎片拼到一起,研究人员在Flare平台上搜索Telegram账号PCP.sh,找到了一张TeamPCP Telegram账号的截图,这个账号使用的头像和Thomson的Steam账号头像完全相同。到这一步,整条证据链终于闭环,研究人员以高置信度判定Ruben Thomson就是TeamPCP的领导者。

图15|Flare平台搜索到的Telegram相关记录,涉及MayaTheFox账号与恶意软件分发

图16|Telegram中./PCP.sh账号的聊天截图,头像与Steam账号一致

完整证据链:七个环节环环相扣

图17|Flare整理的完整归因链,从DeadCatx3别名到TeamPCP Telegram频道共七个确认环节

单独看每一个证据都可以有别的解释,重名、巧合的密码、头像相似都有可能,但把它们放在一起就形成了一条没有断点的完整链条。DeadCatx3这个用户名关联到HackerOne上Ruben Thomson的实名资料,同一个用户名在Hugging Face上的账号列出了TeamPCP自己的C2域名,复用的密码把他的学校邮箱和个人Gmail连在一起,这个Gmail又指向一个实名TikTok账号,TikTok里展示的Steam账号使用的头像,和TeamPCP Telegram频道的头像完全是同一张图。

这已经不再是间接证据,而是同一个人、同样的使用习惯、在他双重生活的每一个层面都留下了相同指纹的直接证明。Flare最终以高置信度评估,DeadCatx3身份背后以及TeamPCP本身的运营者就是居住在澳大利亚珀斯的Ruben Thomson,这些发现随后也得到了执法部门的确认。

给防守方的五条可落地建议

TeamPCP的攻击手法本身并不高深,真正值得警惕的是他们选择的目标和攻击路径,以下五条控制措施任意一条都有可能打断TeamPCP的攻击链。GitHub Actions工作流要固定到完整的commit SHA,而不是用tag标签。tag引用会解析到维护者仓库当前指向的任何内容,这正是TeamPCP替换掉的东西。

把凭证轮换credential rotation当成一次资产清点来做,而不是事件发生后的临时任务。Aqua在2月入侵后轮换了凭证,仍然漏掉了三周后用来发布带后门版本的那个访问权限,只有掌握完整资产清单,轮换才能真正生效。

发布token要严格限制范围并设置短有效期。一个可以永久发布任何包的PyPI token,会把一次构建流水线失陷直接升级为整个软件供应链事件。

对安全工具产生的出站连接建立告警。漏洞扫描器在构建过程中发起异常网络调用是一个高信噪比的检测信号,Trivy和LiteLLM的攻击载荷都依赖这一点。

在窃取日志stealer logs和组合列表combolists中监控自己的域名。让研究人员能从学校邮箱一路走到Telegram头像的那种凭证复用,同样也是攻击者走进你企业环境的入口。

TeamPCP的技术故事谈不上复杂精巧,团伙早期行动就是纯粹的机会主义,扫暴露服务、扔容器、挖门罗币。真正发生变化的是目标选择,他们想通了一件事,运行在构建流水线里的漏洞扫描器手里掌握的凭证,比他们直接攻陷的绝大多数主机都要多,而且对安全工具的信任是会传递的,LiteLLM并没有被直接攻破,但它运行了Trivy。

这就是值得所有安全团队内化的模式,两个月后Mini Shai-Hulud蠕虫能起作用靠的也是同一个逻辑。一个被攻陷的构建工具,影响半径是所有运行它的流水线,而每一条流水线的影响半径,又是它能看到的所有凭证。

TeamPCP用猫和笑话打造了自己的品牌,日志里的名片、傻乎乎的猫个人简介、用MIT许可证发布还附带一句俏皮话的蠕虫源代码,这种渴望观众的本能把一个机会主义扫描团伙变成了过去一年最有影响力的供应链攻击者之一,也正是同样的本能,让一个独特的头像在Steam资料页上静静躺了十年,等着有人去看一眼。

本文基于Flare官方调查报告《Unmasking TeamPCP, King of Software Supply Chain Attacks》整理改写

声明:本文来自黑鸟,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。