文章总结: 文章分析了TeamPCP黑客团伙利用GitHubActions的OIDC信任配置漏洞发起的供应链攻击,通过孤立提交和pullrequesttarget触发恶意代码,获取OIDCtoken后伪造npm发布凭证,使得恶意包带有合法SLSA签名。攻击涉及npm和PyPI生态,包含隐蔽通信、持久化后门及死亡开关机制。建议收紧OIDC权限、谨慎使用高权限触发器并加强行为监控。 综合评分: 85 文章分类: 漏洞分析,供应链安全,威胁情报,恶意软件,WEB安全
突破CI/CD防线:黑客如何利用OIDC劫持在GitHub Actions里“合法”投毒?
原创
Hankzheng Hankzheng
技术修道场
2026年5月19日 08:05 广东
在小说阅读器读本章
去阅读
大家好,最近大家在 npm install 或者 pip install 的时候,有没有觉得心惊肉跳?如果没有,那你今天看完这篇文章,可能得赶紧去自查一下本地环境了。
最近安全圈出了个大案子,知名黑客团伙 TeamPCP 搞出了一波代号为 Mini Shai-Hulud 的新型供应链攻击。这可不是什么小打小闹的“脚本小子”操作,人家直接把魔爪伸向了 TanStack、UiPath、Mistral AI 甚至是 Guardrails AI 这些顶流开源库。
根据最新数据,这次事件横跨 npm 和 PyPI 两大生态,影响了超过 170 个包,累计下载量破 5.18 亿次。今天,我就带大家硬核拆解一下,这帮黑客到底用了什么神仙级别的“骚操作”,能把防线撕得粉碎。
01 / 颠覆认知的投毒手法:自带SLSA签名的“合法”病毒
我们先来看看重灾区 TanStack(漏洞编号:CVE-2026-45321,CVSS评分高达 9.6)。
以前的供应链投毒,通常是简单粗暴地在 package.json 里加个 preinstall 钩子。但这次,TeamPCP 的手法堪称教科书级别的 CI/CD 渗透。他们没有去盗取维护者的 npm token,而是利用了一条极为复杂的 GitHub Actions 攻击链:
-
孤立提交 (Orphaned Commit)
黑客先在 GitHub Fork 仓库中构造了一个包含恶意 Payload 的孤立提交。
-
利用
pull_request_target通过触发合法的
TanStack/router工作流,利用这个高权限的 trigger 执行恶意代码。 -
缓存投毒与内存提取
在 GitHub Actions 的 Runner 进程中,黑客直接从运行时内存里硬生生提取出了 OIDC token!
技术高光
由于仓库的 OIDC 信任配置(Trusted Publisher)是给到了整个仓库级别,而不是细粒度限制在特定受保护分支,黑客用这枚 OIDC token 现场“伪造”了一个短效的 npm 发布 token。
这意味着什么?这意味着黑客走的是官方合法的自动发布流水线!这导致被感染的恶意包居然带有完全合法的 SLSA Build Level 3 来源证明。这是业内有史以来记录的首个自带合法证明的 npm 蠕虫。防病毒软件查起来,连签名都是真的,这招可谓是“杀人诛心”。
02 / 令人发指的隐蔽通信与持久化
代码混入包的 tarball 后,黑客通过添加一个指向 GitHub 托管包的可选依赖,利用 prepare 生命周期钩子唤醒基于 Bun 运行时的 JavaScript 恶意代码 router_init.js。
这玩意儿跑起来后,简直是个全能的“吸尘器”,专门收割:
- 云服务商凭证
- 加密货币钱包
- AI 工具密钥
- CI 系统(如 GitHub Actions)Token
重点来了,数据怎么偷出去不被发现?
企业内网通常会拦截大量可疑域名,但 TeamPCP 用了 Session Protocol(一个去中心化、主打隐私的通讯服务)的基础设施 filev2.getsession[.]org。企业防火墙大概率不会封锁这个域名,完美绕过流量监测。如果这条路不通,它还会用你被盗的 GitHub Token,通过 GraphQL API 把加密数据提交到攻击者控制的仓库(甚至还会把锅甩给 [email protected])。
不仅如此,它还会给你的 VS Code 和 Claude Code 植入持久化后门。哪怕你重启电脑,只要一打开 IDE,木马就再次复活。
03 / “死亡开关”:敢吊销Token,我就删你库!
这是整个恶意软件中最让我倒吸一口凉气的设计。
这不仅是个木马,它还是个自我繁殖的“蠕虫”。它会去寻找那些开启了 bypass_2fa=true 的 npm token,然后利用 GitHub OIDC 越权获取发布凭证,继续感染同一个维护者名下的其他包。
如果你是一名开发者,发现自己中招了,第一反应是什么?肯定是去 npm 后台把 token 吊销掉,对吧? 千万别急!!
恶意脚本里植入了一个“死亡开关(Dead-man’s switch)”。它会每隔 60 秒轮询一次 api.github.com/user,检查它自己创建的一个名为 IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner 的 Token 是否还有效。
一旦检测到 Token 被开发者手动吊销,脚本会立刻触发自毁/破坏程序——在你的机器上执行 rm -rf ~/。直接让你本地家目录灰飞烟灭,瞬间化身数据擦除器 (Wiper)。
防坑指南
如果你怀疑系统被感染,首要任务是断网隔离并对系统做镜像取证,千万不要一上来就去吊销 Token!
04 / PyPI 战场同样惨烈,甚至加入了“地理围栏”
除了 npm,Python 生态(PyPI)里的顶流 AI 库也没能幸免。包含 mistralai 和 guardrails-ai 在内的多个库均被植入恶意后门。
在 Python 环境下,木马表现得更加直接:
-
导入即执行
不需要你调用特定函数,只要你
import了被污染的包,它就会悄悄判断是不是 Linux 系统,然后去git-tanstack[.]com(一个极具迷惑性的钓鱼域名)下载 Python payload 直接运行,完全没有完整性校验。 -
地理围栏杀伤逻辑
微软的安全分析指出,这套 PyPI 木马甚至包含了国家级别的判断逻辑。它会刻意避开俄语环境;但如果检测到系统位于以色列或伊朗,它会有 1/6 的概率直接触发
rm -rf /级联删除。好家伙,这玩起概率论来了是吧?
📝 总结与技术反思
TeamPCP 的这波操作,标志着供应链攻击已经完成了从“孤立的包投毒”向“基于 CI/CD 身份基础设施信任链传播”的致命演进。
作为技术人,我们必须反思目前的工程实践:
-
收紧 OIDC 权限
千万不要把 Trusted Publisher 的权限给到 Repo 级别,务必细化到特定的 Branch 和 Workflow 文件。
-
谨慎使用 trigger
像
pull_request_target这种能获取高权限 Secrets 的触发器,面对来自 Fork 的代码时,必须加上极其严苛的安全校验。 -
行为监控的必要性
面对带有合法 SLSA 签名的恶意包,传统的静态扫描已经失效,安装和构建阶段的动态行为可见性(Behavioral Visibility)变得前所未有的重要。
大家最近赶紧查查自己的依赖树吧,看看有没有 router_init.js 或者可疑的进程在跑。技术在进步,黑客的手段也在迭代,安全这根弦,永远不能松!
如果你觉得这篇文章对你有帮助,欢迎点赞、在看、转发给你的技术群,让更多开发者避开这个大坑。我们下期技术干货再见!
供应链攻击 #网络安全 #OIDC劫持 #npm投毒 #GitHubActions漏洞 #漏洞分析 #CI/CD
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:技术修道场 Hankzheng Hankzheng《突破CI/CD防线:黑客如何利用OIDC劫持在GitHub Actions里“合法”投毒?》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。







评论