Mini Shai-Hulud 供应链蠕虫通过 GitHub Actions 缓存投毒攻陷 TanStack、Mistral AI 等 170+ npm/PyPI 包
原文标题:Mini Shai-Hulud supply chain worm compromises TanStack, Mistral AI, and 170+ npm/PyPI packages via GitHub Actions cache poisoning
TeamPCP 的 Mini Shai-Hulud 蠕虫通过 GitHub Actions 缓存投毒攻陷 TanStack、Mistral AI 等 170+ 个 npm/PyPI 包,攻击者用 TanStack 的合法 OIDC 身份发布了 84 个恶意 @tanstack/* 版本。
复盘了攻击者如何借 GitHub Actions 缓存投毒窃取 OIDC 令牌并写入 Claude Code Hook 实现持久化,可了解供应链攻击的新手法。
2026-05-11
严重主要
Mini Shai-Hulud 供应链蠕虫通过 GitHub Actions 缓存投毒,攻陷了 TanStack、Mistral AI 以及 170+ 个 npm/PyPI 软件包
TeamPCP 的 Mini Shai-Hulud 蠕虫通过 GitHub Actions 缓存投毒,攻陷了包括 TanStack 和 Mistral AI 在内的 170+ 个 npm/PyPI 软件包,窃取 CI 凭证,并通过 Claude Code Hook 实现持久化。
npm / TanStack / Mistral AI / Guardrails AI凭证泄露npm 供应链被攻破 / CI 凭证被盗npm registry / PyPI / GitHub Actions runner / 开发者工作站 / Claude Code
事件经过
攻击者提交了一个恶意 PR fork,跨 fork 信任边界污染了 GitHub Actions runner 缓存,从 runner 内存中提取出 OIDC token,并以 TanStack 的合法发布身份发布了 84 个恶意版本。随后载荷窃取 CI 凭证,并将自身写入 Claude Code Hook,在开发者工作站上实现持久化。
为何重要
任何在 5 月 11 日对受影响的 @tanstack/* 版本执行过 npm install 的开发者或 CI 环境,都应视为已失陷。泄露的凭证包括 GitHub PAT 和 OIDC 信任、AWS IAM 密钥、HashiCorp Vault token 以及 Kubernetes service account token。一旦被盗的 GitHub token 被撤销,还会触发死亡开关,清空本地磁盘。
缺少授权检查
不适用:此次事件没有跨越任何 agent 授权边界。
PP 能拦住吗?
这次入侵走的是软件包、凭证或供应商基础设施,而不是 agent 工具调用,因此没有可供授权门禁拦截的 agent 行为。
事件分析
时间线与技术解读
时间线
2026-05-11
UTC 19:20–19:26:攻击者利用 GitHub Actions 缓存投毒后,以 TanStack 的合法 OIDC 身份发布了 84 个恶意 @tanstack/* 版本。
2026-05-11
UTC 19:56:StepSecurity 在 30 分钟内发现并报告了此次入侵;Socket AI Scanner 更是在发布后不到 6 分钟内就标记出了所有软件包。
2026-05-11
UTC 21:30:GitHub 发布安全公告 GHSA-g7cv-rxg3-hmpx。TanStack 弃用受影响版本,并联合 npm 安全团队移除恶意 tarball。
2026-05-12
攻击范围扩大:Socket 确认 Mistral AI、Guardrails AI、OpenSearch、UiPath 和 Squawk 等软件包中还有更多被攻陷的制品,涉及 npm 和 PyPI 两个平台。
2026-05-12
TanStack 创始人 Tanner Linsley 发表事后复盘;Mistral AI 项目在 PyPI 上被隔离。此次行动被归因于 TeamPCP 威胁组织。
技术剖析
- 攻击者通过 pull_request_target 的“Pwn Request”模式投毒 GitHub Actions 缓存,让攻击者控制的代码得以在基础仓库的可信上下文中运行,并从 runner 内存中提取出 OIDC token——这一手法与 2025 年 tj-actions 事件如出一辙。
- 这是首个有记录的恶意 npm 软件包携带有效 SLSA 溯源的案例:蠕虫直接劫持了合法的 CI 流水线本身,因此 Sigstore 正确认证了构建过程,却对其中夹带的恶意载荷无从察觉。
- 载荷会把自己写入 Claude Code 的 .claude/settings.json Hook 中,确保每当开发者在受影响目录使用 Claude Code 时都会被重新执行——仅靠 npm uninstall 无法彻底修复。
- 此外还内置了一个死亡开关:它会安装一个系统用户服务,监控被盗的 GitHub token 是否已被撤销;一旦被撤销,就触发一次完整的本地磁盘擦除,把事件响应变成针对受害者的武器。
- 凭证窃取攻击盯上的是 GitHub Actions 环境变量、AWS IMDS 和 Secrets Manager、HashiCorp Vault、Kubernetes 服务账号、SSH 密钥、加密钱包、VPN 配置和 shell 历史记录——跨平台共 100+ 条硬编码凭证路径。
授权边界
授权边界本该设在哪里
本次事件归类为凭证泄露。对应的 Permission Protocol 门禁是凭证门禁。这条读取规则是有条件的:只有当真实操作边界经过门禁时,该限制才生效。
- 若在以下位置强制执行
- GitHub Actions OIDC 发布授权 / Claude Code Hook 配置写入 / CI 凭证访问
- 仍需解决
- npm install 时的供应链完整性;运行器层面的代码执行防护;对构建期代码安全性的 SLSA 溯源验证(而不只是构建流程本身)
- 需要提供收据的操作
- 使用 OIDC 受信任发布者身份执行 npm 发布;修改 Claude Code Hook 配置;从 GitHub Actions 运行器访问 CI/云凭证
本次事件中没有任何 Agent 采取行动。Permission Protocol 约束的是 Agent 的行为,因此当危害无需 Agent 行动就能造成时,它并不适用。
从小处着手
把相关门禁放在这个操作边界上。
本次事件对应凭证门禁。先从控制真实操作的边界入手,再要求在执行前提供已签署的收据。
来源:Permission Protocol · AI Agent Incident Tracker · permissionprotocol.com