从 Vercel 到 Tanstack,前端仓库再度遭遇供应链攻击。前端安全不存在了?
对 TanStack 因恶意 PR 利用 GitHub Actions 缓存投毒并诱发 npm 供应链攻击的事件进行深度复盘与影响范围梳理。
好像自从 AI Coding 能力被大范围普及之后,攻击事件在前端生态中简直是超高频出现,前端安全方面的问题几乎就没停过。
先是有 React Server Components 安全漏洞,又有 Vercel 遭遇入侵。
最近 TanStack 也遭到了攻击。
事件经过
2026 年 5 月 11 日,UTC 时间 19 点 20 分到 19 点 26 分之间,有 84 个恶意 npm 包被发布到了 @tanstack 的命名空间下。
These 包并非由盗取凭证的攻击者发布,而是直接通过 TanStack 的合法发布流程发布的。
恶意版本在几小时内就传播到了其他几十个维护者那里。
仅 @tanstack/react-router 这一个包,每周的下载量就超过 1270 万。
简单回顾这次攻击
5 月 10 日,攻击者以账户 zblgg fork 了 TanStack/router 仓库,并故意更名为 zblgg/configuration 避免其出现在 fork 列表中。
5 月 11 日,攻击者向 TanStack/router 的 main 分支提交了一个看似正常的 PR #7378,标题为 “WIP:简化历史构建”。
这个 PR 触发了 TanStack 工作流中使用的 pull_request_target 触发器,并执行了对对应 CI 流程。
PR 中包含了恶意代码,它会在 CI 运行时窃取 GitHub Actions 写缓存的权限,以及 OIDC 令牌,然后将恶意 payload 写入仓库共享的 pnpm-store 缓存。
然后,这个 PR 之后会不会被合并就无所谓了,因为 pnpm 缓存中已经被成功投毒。
后续其它分支再运行 release 等流程,就会从被污染的缓存中拉取依赖,构建出有问题的包,并自动使用窃取的 OIDC 令牌直接发布到 npm。
影响范围
| 包 | 被攻击版本 |
|---|---|
| @tanstack/react-router | 1.169.5, 1.169.8 |
| @tanstack/vue-router | 1.169.5, 1.169.8 |
| @tanstack/solid-router | 1.169.5, 1.169.8 |
| @tanstack/router-core | 1.169.5, 1.169.8 |
| @tanstack/react-start | 1.167.68, 1.167.71 |
| @tanstack/router-plugin | 1.167.38, 1.167.41 |
其它受影响仓库:
| namespace | 被攻击的包本 |
|---|---|
| @mistralai | @mistralai/mistralai 2.2.2–2.2.4; -azure and -gcp variants |
| @uipath | 跨 UiPath 命名空间的 40+ 包 |
| @draftlab / @draftauth | @draftlab/auth, @draftlab/db, @draftauth/client, @draftlab/auth, @draftlab/db, @draftauth/client |
| misc. | safe-action, cmux-agent-mcp, nextmove-mcp, ts-dna, cross-stitch 等 |