TanStack NPM攻击 揭秘及应对方案

官方摘要

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 生态系统包含多个专注于特定功能的库,开发者可根据项目需求灵活组合使用。

  1. TanStack Query ‌:原 React Query,用于‌异步状态管理‌和数据请求,提供自动缓存、后台同步、重试机制及窗口聚焦重新获取等功能,可替代手写的 axios + useState + useEffect 组合 。‌‌‌
  2. TanStack Table ‌:无头表格逻辑库,提供排序、过滤、分页、分组及虚拟滚动等核心功能,不渲染任何 HTML,允许开发者‌100% 掌控 UI 样式和结构‌ 。‌‌‌
  3. TanStack Router ‌:专为 React 设计的‌类型安全路由库‌,支持文件系统路由、预加载、延迟加载及类型安全的 URL 参数管理,适用于复杂单页应用或全栈项目 。‌‌‌
  4. TanStack Start ‌:基于 TanStack Router 的‌全栈 React 框架‌,集成了服务器端渲染 (SSR)、流式传输和服务器函数,支持 Vite 构建,适合构建类似 Next.js 的全栈应用 。‌‌‌
  5. TanStack Virtual ‌:列表虚拟化解决方案,通过仅渲染可视区域内的 DOM 元素来‌优化大型数据集的渲染性能‌,适用于长列表或滚动视图 。‌‌‌
  6. TanStack Form‌:无头表单状态管理和验证工具,支持复杂验证逻辑和标准 schema 集成,提供类型安全的 API 。‌‌‌
  7. 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

总结

现代开发工具链的复杂性已经超出了大多数团队的安全建模能力。我们习惯于快速采纳新特性来提升效率,却很少评估这些特性在对抗性场景下的交互风险。这次事件表明,即使是最谨慎的维护者------没有密码泄露,没有钓鱼中招------也可能在精心设计的攻击面前失守。我们的防御策略需要从"信任但验证"转向"默认不信任,分层隔离"。

相关推荐
恋猫de小郭2 小时前
终于,Flutter 修复 Android 中文字体异常,但是很草台,不知怎么吐槽
android·前端·flutter
Cobyte2 小时前
11.响应式系统演进:深入剖析 computed 实现原理与性能优化实践(Vue3.3)
前端·javascript·vue.js
_Evan_Yao2 小时前
计算机大一新生如何选择方向(前端/后端/AI/运维)?
运维·前端·人工智能·后端
ZC跨境爬虫2 小时前
跟着MDN学HTML_day_46:(HTMLCollection与NodeList)
前端·javascript·ui·html·音视频
码途漫谈2 小时前
Scrapling:让爬虫在现代 Web 里“活下来”的自适应抓取框架
前端·爬虫·ai·开源
极梦网络无忧2 小时前
我开源了一个 Vue 3 动态表单组件库 —— real-vue3-easy-form
前端·vue.js·开源
ShyanZh2 小时前
【Claude基础】多代理协作:Agent Teams 与编排模式
前端·chrome·ai
下载居2 小时前
Google Chrome(谷歌浏览器64位) 148.0.7778
前端·chrome
MXN_小南学前端2 小时前
Vue + Quill:富文本的添加、传输、展示逻辑,以及 csReplyQuill 组件封装
前端·vue.js