TanStack 42 个 npm 包遭供应链攻击,三漏洞链式利用致 84 个恶意版本发布
-
TanStack 创始人 Tanner Linsley 5 月 11 日发布官方事故复盘,披露当日 19:20~19:26 UTC 期间,攻击者通过三个漏洞的链式利用向 npm 发布了涵盖 42 个 @tanstack/* 包共 84 个恶意版本。攻击链分三步:第一步利用
pull_request_target触发器的"Pwn Request"模式,在基础仓库权限上下文中执行了 fork PR 中的恶意代码;第二步通过 GitHub Actions 缓存投毒(Cache Poisoning),将含恶意载荷的 pnpm 存储写入生产发布流程将读取的缓存槽位;第三步在发布工作流运行时,从 GitHub Actions runner 进程内存中提取 OIDC 令牌,绕过正常发布步骤直接调用 npm 注册表 API——全程未窃取任何 npm 访问令牌。恶意版本在安装时会执行约 2.3 MB 的混淆脚本,抓取 AWS IMDS/Secrets Manager、GCP 元数据、Kubernetes service-account token、Vault token、~/.npmrc、GitHub token 及 SSH 私钥,并经 Session/Oxen 端对端加密网络回传;脚本还会通过 npm registry API 枚举受害者维护的其他包并植入同样注入代码,实现自我扩散。恶意版本在发布约 20 分钟后由外部安全研究员发现并公开披露,Socket.dev 随后主动联系 TanStack 团队确认情况;维护团队随即对全部 84 个版本标记废弃,并请 npm 安全团队从服务器端下架 tarball。受影响范围不含 @tanstack/query*、@tanstack/table*、@tanstack/form*、@tanstack/virtual*、@tanstack/store 及 @tanstack/start 元包。复盘指出,此次所用的 OIDC 令牌内存提取脚本与 2025 年 3 月 tj-actions/changed-files 供应链攻击中使用的工具几乎一字不差(含原归因注释),说明攻击者在重新组合已公开的攻击手法而非开发全新工具。TanStack 要求所有在 5 月 11 日安装了受影响版本的开发者或 CI 环境将该主机视为潜在已失陷,并立即轮换 AWS、GCP、Kubernetes、Vault、GitHub、npm 及 SSH 全部凭据。
Postmortem: TanStack npm supply-chain compromise | TanStack Blog
On 2026-05-11, an attacker chained a pull_request_target Pwn Request, GitHub Actions cache poisoning across the fork↔base trust boundary, and OIDC token extraction from runner memory to publish 84 malicious versions across 42 @tanstack/* packages on npm. Full postmortem.
(tanstack.com)