官方摘要
5月11日,网络安全机构Socket通报,TanStack等开源组织旗下超160个NPM软件包被植入恶意版本,含@tanstack/react-router等高下载量包。攻击者利用GitHub Actions三重漏洞组合,通过伪造OIDC发布权限向NPM注册表推送恶意包。被篡改包内含混淆的router_init.js及恶意prepare钩子,安装时自动窃取AWS、GCP、Kubernetes、Vault等凭据,并加密外传。所有恶意版本已被弃用并下架。官方敦促开发者立即轮换密钥、审查本地文件及Git提交记录。


攻击链由三个漏洞串联而成。5月10日,攻击者fork了TanStack/router,命名为zblgg/configuration以避开fork列表搜索。一个pull request触发了pull_request_target工作流,检出fork代码并执行构建,攻击者由此获得TanStack runner上的代码执行权限。GitHub Actions缓存被投毒。
这个被称为"Shai-Hulud"的蠕虫在开发者机器上收割100多个路径的凭证:AWS密钥、SSH私钥、npm令牌、GitHub PAT、HashiCorp Vault令牌、Kubernetes服务账户、Docker配置、shell历史、加密货币钱包。SecurityWeek指出,这是TeamPCP行动首次针对1Password和Bitwarden等密码管理器。它还窃取Claude和Kiro AI代理配置,包括MCP服务器对外部服务的认证令牌。
更棘手的是持久化机制。蠕虫在Claude Code的.claude/settings.json和VS Code的.vscode/tasks.json中植入自执行代码,每次打开项目即触发;同时部署系统守护进程(macOS LaunchAgent/Linux systemd),重启后仍然存活。这些文件位于项目树中,而非node_modules。卸载包不会清除它们。
CI runner上的行为更为激进。Linux runner上,蠕虫直接读取/proc/pid/mem提取进程内存中的密钥,包括已被掩码的。Wiz分析发现,若在隔离机器前撤销令牌,一个破坏性守护进程会擦除整个home目录。
关于TanStack
TanStack 是一套为现代 Web 开发打造的强大、无头且类型安全的库集合 ,由 Tanner Linsley 创建,涵盖数据请求、表格、路由、表单及全栈开发等多个领域,其官方站点为 tanstack.com 。该工具集旨在解决前端开发中常见的数据管理和 UI 交互痛点,提供框架无关的解决方案,支持 React、Vue、Solid、Svelte、Angular 等主流框架 。
它旗下最著名的项目包括:
- TanStack Query(原 React Query)
- TanStack Router
- TanStack Table
- TanStack Virtual
- TanStack Form
核心功能库与用途
TanStack 生态系统包含多个专注于特定功能的库,开发者可根据项目需求灵活组合使用。
- TanStack Query :原 React Query,用于异步状态管理和数据请求,提供自动缓存、后台同步、重试机制及窗口聚焦重新获取等功能,可替代手写的 axios + useState + useEffect 组合 。
- TanStack Table :无头表格逻辑库,提供排序、过滤、分页、分组及虚拟滚动等核心功能,不渲染任何 HTML,允许开发者100% 掌控 UI 样式和结构 。
- TanStack Router :专为 React 设计的类型安全路由库,支持文件系统路由、预加载、延迟加载及类型安全的 URL 参数管理,适用于复杂单页应用或全栈项目 。
- TanStack Start :基于 TanStack Router 的全栈 React 框架,集成了服务器端渲染 (SSR)、流式传输和服务器函数,支持 Vite 构建,适合构建类似 Next.js 的全栈应用 。
- TanStack Virtual :列表虚拟化解决方案,通过仅渲染可视区域内的 DOM 元素来优化大型数据集的渲染性能,适用于长列表或滚动视图 。
- TanStack Form:无头表单状态管理和验证工具,支持复杂验证逻辑和标准 schema 集成,提供类型安全的 API 。
- TanStack AI :2025 年推出的 AI 工具链,采用类型驱动 + 适配器架构,支持 OpenAI、Anthropic 等多种后端模型,提供端到端类型安全 。
攻击范围
因此这次事件不仅影响 React、Vue、Solid 等多个生态,还可能导致:
- 开发者机器被植入恶意代码
- CI/CD 凭证泄露
- 云服务 Token 被窃取
- npm 包进一步被自动传播污染
42 个 @tanstack/ 包被污染
大量 @tanstack/* npm 包被发布了恶意版本。

攻击者在极短时间内:
- 污染了 42 个包
- 发布了 84 个恶意版本
- 覆盖 React / Vue / Router 等核心生态
其中包括:
- @tanstack/react-router
- @tanstack/vue-router
- @tanstack/history
- @tanstack/router-core
- @tanstack/start
- @tanstack/react-start
攻击流程及危害
攻击者利用 GitHub Actions CI/CD 工作流漏洞,而不是简单的 npm Token 被盗。这是典型的 供应链 + CI/CD 联合攻击。
1、GitHub Actions 缓存投毒利用 pull_request_target workflow 和 cache poisoning(缓存污染)注入恶意代码。
2、在 CI Runner 中执行恶意代码恶意脚本会扫描环境中各种敏感凭证,包括:
- GitHub token
- npm token
- 云服务凭证(AWS、GCP、Azure)
- Kubernetes / Vault 凭证
- SSH Key
- .npmrc 配置文件
3、自动发布恶意 npm 包利用 CI 权限将受污染版本推送到 npm registry,无需真正窃取维护者密码。
4、自传播恶意代码会继续扫描新环境,传播到更多仓库和包。
Dead-man's switch
如果攻击检测到 被窃取的 GitHub token 被撤销,恶意脚本可能触发 删除用户主目录 (rm -rf ~/)。
理论上,它能破坏开发者机器或 CI 容器,防止凭证被撤销或打断传播链。
自查与防护
如果你在2026年5月11日晚间安装或更新过@tanstack/*包,执行npm install的机器可能已被入侵。
你需要:
1、检查依赖
npm ls @tanstack/*
pnpm ls @tanstack/*
yarn list --pattern @tanstack
2、检查 lock 文件: 查看 2026-05-11 发布的版本
- package-lock.json
- pnpm-lock.yaml
- yarn.lock
3、排查恶意脚本: 检查 package.json 中是否存在异常 postinstall / preinstall 脚本。
注意:仅删除node_modules或重装依赖是不够的。恶意代码在postinstall阶段已经执行,可能留下了持久化后门。
停止在宿主机操作系统上直接开发。使用Docker开发容器或虚拟机,确保即使postinstall脚本执行恶意代码,其影响也被限制在容器内。这是防范供应链攻击的第一道防线,也是成本最低的一道。
4、修改 Token / 密钥,包括
- AWS访问密钥和会话令牌
- GitHub个人访问令牌(包括classic和fine-grained)
- npm访问令牌
- SSH私钥(尤其是无密码保护的)
- 该机器环境变量中存在的任何机密信息
5、检查CI/CD 环境与本地机器,从架构层面隔离风险
- 删除受影响依赖
- 重建 CI Runner
- 检查是否存在异常进程、网络连接或 shell 脚本
6、依赖安装监控
使用--ignore-scripts标志安装依赖,手动审查postinstall脚本后再执行。对于大型团队,可以建立内部镜像仓库,所有包经过自动化扫描和人工抽检后才进入可用列表。
npm install --ignore-scripts
总结
现代开发工具链的复杂性已经超出了大多数团队的安全建模能力。我们习惯于快速采纳新特性来提升效率,却很少评估这些特性在对抗性场景下的交互风险。这次事件表明,即使是最谨慎的维护者------没有密码泄露,没有钓鱼中招------也可能在精心设计的攻击面前失守。我们的防御策略需要从"信任但验证"转向"默认不信任,分层隔离"。