突破CI/CD防线:黑客如何利用OIDC劫持在GitHubActions里“合法”投毒?

admin 2026-05-20 06:15:59 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文章分析了TeamPCP黑客团伙利用GitHubActions的OIDC信任配置漏洞发起的供应链攻击,通过孤立提交和pullrequesttarget触发恶意代码,获取OIDCtoken后伪造npm发布凭证,使得恶意包带有合法SLSA签名。攻击涉及npm和PyPI生态,包含隐蔽通信、持久化后门及死亡开关机制。建议收紧OIDC权限、谨慎使用高权限触发器并加强行为监控。 综合评分: 85 文章分类: 漏洞分析,供应链安全,威胁情报,恶意软件,WEB安全


cover_image

突破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 身份基础设施信任链传播”的致命演进。

作为技术人,我们必须反思目前的工程实践:

  1. 收紧 OIDC 权限

    千万不要把 Trusted Publisher 的权限给到 Repo 级别,务必细化到特定的 Branch 和 Workflow 文件。

  2. 谨慎使用 trigger

    像 pull_request_target 这种能获取高权限 Secrets 的触发器,面对来自 Fork 的代码时,必须加上极其严苛的安全校验。

  3. 行为监控的必要性

    面对带有合法 SLSA 签名的恶意包,传统的静态扫描已经失效,安装和构建阶段的动态行为可见性(Behavioral Visibility)变得前所未有的重要。

大家最近赶紧查查自己的依赖树吧,看看有没有 router_init.js 或者可疑的进程在跑。技术在进步,黑客的手段也在迭代,安全这根弦,永远不能松!

如果你觉得这篇文章对你有帮助,欢迎点赞、在看、转发给你的技术群,让更多开发者避开这个大坑。我们下期技术干货再见!

供应链攻击 #网络安全 #OIDC劫持 #npm投毒 #GitHubActions漏洞 #漏洞分析 #CI/CD


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:技术修道场 Hankzheng Hankzheng《突破CI/CD防线:黑客如何利用OIDC劫持在GitHub Actions里“合法”投毒?》

评论:0   参与:  0