跳到正文
原文
Permission Protocol · AI Agent Incident Tracker·· 2026/05/11精选AI 评分88

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

AI 导读

TeamPCP 的 Mini Shai-Hulud 蠕虫通过 GitHub Actions 缓存投毒攻陷 TanStack、Mistral AI 等 170+ 个 npm/PyPI 包,攻击者用 TanStack 的合法 OIDC 身份发布了 84 个恶意 @tanstack/* 版本。

推荐理由

复盘了攻击者如何借 GitHub Actions 缓存投毒窃取 OIDC 令牌并写入 Claude Code Hook 实现持久化,可了解供应链攻击的新手法。

正文 · AI 翻译

返回事件追踪

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 行为。

事件分析

时间线与技术解读

时间线

  1. 2026-05-11

    UTC 19:20–19:26:攻击者利用 GitHub Actions 缓存投毒后,以 TanStack 的合法 OIDC 身份发布了 84 个恶意 @tanstack/* 版本。

  2. 2026-05-11

    UTC 19:56:StepSecurity 在 30 分钟内发现并报告了此次入侵;Socket AI Scanner 更是在发布后不到 6 分钟内就标记出了所有软件包。

  3. 2026-05-11

    UTC 21:30:GitHub 发布安全公告 GHSA-g7cv-rxg3-hmpx。TanStack 弃用受影响版本,并联合 npm 安全团队移除恶意 tarball。

  4. 2026-05-12

    攻击范围扩大:Socket 确认 Mistral AI、Guardrails AI、OpenSearch、UiPath 和 Squawk 等软件包中还有更多被攻陷的制品,涉及 npm 和 PyPI 两个平台。

  5. 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