TanStack npm 供应链遭攻击:42 个包 84 个恶意版本,HN 710 分热议
2026 年 5 月 11 日,TanStack(知名 React Query 作者)发布安全公告:攻击者利用 GitHub Actions 设计缺陷,通过 Pwn Request + 缓存投毒 + OIDC 令牌窃取,在 42 个 npm 包上发布了 84 个恶意版本。这起攻击不仅影响了 TanStack 生态,还波及了 MistralAI 等上游项目,引发开发者社区对 npm 安全体系的广泛讨论。
2026年5月12日 · 阅读约 6 分钟
核心结论
2026 年 5 月 11 日 19:20-19:26 UTC,TanStack(React Query、React Table、React Router 等知名库的维护者)遭遇了一次精心策划的 npm 供应链攻击。攻击者利用 GitHub Actions 的三个设计缺陷链,成功在 42 个 @tanstack/* 包上发布了 84 个恶意版本。
该攻击的复杂程度和影响范围在开源 npm 包管理历史上极为罕见,直接威胁到所有使用 TanStack 生态的开发者。仅 20 分钟就被外部研究者发现,但攻击者的恶意代码已经具备自我传播能力,甚至波及了 MistralAI 等非 TanStack 项目。
关键要点
- 事件发生时间:2026-05-11 19:20-19:26 UTC(北京时间次日凌晨)
- 影响对象:所有 npm/Node.js 开发者,尤其是使用 TanStack 生态的项目
- 核心变化:npm 供应链安全的 GitHub Actions 信任模型出现系统性漏洞
- 热度评分:92/100(HN 710 分 + 社区广泛讨论)
攻击手法:三个漏洞链
这次攻击最大的特点是攻击者利用了 三个 GitHub Actions 设计缺陷的链式组合,缺一不可:
| 攻击环节 | 利用的缺陷 | 作用 |
|---|---|---|
| 入口 | pull_request_target 触发器(Pwn Request 模式) | 绕过 fork 仓库的限制,在原生仓库上下文中运行 |
| 跳板 | GitHub Actions 缓存投毒(fork↔base 跨仓库缓存污染) | 将恶意代码注入到合法仓库的缓存键中 |
| 出口 | 从 runner 进程内存中提取 OIDC 令牌 | 用合法仓库的身份认证发布恶意 npm 包 |
攻击链的每一步都非常巧妙:攻击者先创建一个看起来人畜无害的 fork 仓库(改名为不易察觉的名字),提交一个包含 ~30,000 行混淆 JS 代码的"孤儿提交"到该 fork,然后向主仓库发起 PR。由于 pull_request_target 触发器的设计缺陷,这个 PR 被自动在原生仓库上下文中运行,从而绕过了 fork 仓库的限制。
关键时间线(UTC)
- 19:20 — 攻击者向 TanStack/router 创建 fork,提交恶意负载(~2.3 MB 混淆 JS),从 fork 发 PR
- 19:21 — 恶意生命周期脚本执行:窃取凭据(AWS/GCP/K8s/Vault)、通过 Session/Oxen 端到端加密消息网络外传、自我传播到受害人所在组织的其他包
- 19:22 — GitHub Actions 测试阶段触发:恶意代码用 workflow 的 OIDC 身份向 npm 注册表发布恶意版本
- 19:26 — 完成 42 个包 × 2 版本的全部发布
- 19:46 — 外部研究者发现并提交 Issue #7383,完整公布恶意指纹和包列表
自我传播机制:不只是 TanStack
最值得警惕的是,这个恶意负载具备 自我传播能力。它在受害者的机器上运行时,会:
- 通过
registry.npmjs.org/-/v1/search?text=maintainer:<user>枚举受害者维护的所有 npm 包 - 创建一个"dead-man's switch"守护进程(Linux systemd / macOS LaunchAgent),每分钟轮询 GitHub API 检查令牌是否被吊销
- 如果令牌被吊销,执行
rm -rf ~/.的清除操作——这意味着即使受害者及时发现了问题,恢复过程也可能面临数据损失
该恶意负载最终证实也影响了 @mistralai/mistralai npm 包,说明攻击者构建的是一个跨项目的供应链蠕虫,而非针对特定目标。
对开发者的影响
如果你是 npm/Node.js 生态的开发者,这次攻击暴露了几个必须正视的安全隐患:
1. Trusted Publishing ≠ 安全屏障
GitHub 的 Trusted Publishing(OIDC 信任发布)被广泛宣传为 npm 安全的最佳实践,但这次攻击证明:一旦攻击者进入你的 CI 流水线,OIDC 令牌反而成为他们发布恶意包的便利渠道。相比之下,本地发布 + 2FA 反而更安全。
2. postinstall 脚本是双刃剑
这次攻击的恶意负载就是通过 npm install 的 postinstall 生命周期脚本执行的。评论区的开发者已经呼吁:所有人应该切换到 pnpm,因为只有 pnpm 默认禁止 postinstall 脚本的自执行。
3. GitHub Actions 信任模型需要重新审视
pull_request_target 触发器的设计允许 fork PR 在原生仓库上下文中执行——这个设计本身就存在安全隐患。攻击者利用它绕过了首次贡献者审批机制。Chris Weekly 在 HN 上的评论一针见血:"一个恶意 fork 的提交可以通过 GitHub 共享对象存储在 URI 中获取,且无法与合法仓库区分,这太疯狂了。"
修复与建议
TanStack 团队在发现问题后反应迅速:
- 19:46 — 外部报告后立即启动应急响应
- 立即移除团队其他成员的 GitHub push 权限(防范用户机器已沦陷)
- 开始 npm deprecation 流程(所有 84 个恶意版本)
- 发布官方 GitHub Security Advisory(已申请 CVE)
给开发者的具体建议:
- 如果是 TanStack 用户且 2026-05-11 之后 pull 过依赖,立即检查依赖版本
- 将 CI 流水线中的第三方 action 引用锁定到 SHA(而非 tag/分支)
- 考虑为每个项目使用独立的 CI VM 隔离(Docker 可能不够)
- 使用 pnpm 替代 npm——更严格的生命周期脚本管控
- 审查自己的 GitHub Actions 工作流中是否使用了
pull_request_target
工具词条(触发工具悬浮卡)
这次攻击涉及的工具和技术栈,在安全分析工具如 n8n(自动化监控)、GitHub Actions(CI/CD 安全)、OpenAI/Claude(可能的代码审计辅助)等领域都有应用场景。开发者可以使用自动化工具来增强供应链安全监控。
内链引导
- 想了解如何用 AI 自动化工具构建安全的 CI/CD 流水线?看:如何用 n8n + OpenAI 搭建自动化内容采集与发布工作流
- npm 供应链安全不只是大型项目的事:每个使用 AI 自动化工具的开发者都应该了解的风险场景,参考:零代码AI小程序:Wegic 帮你一周上线月入5000元的小程序
- 用自动化监控守护你的项目:掌握 如何用 n8n + ChatGPT 搭建自动化内容分发工作流 一样的自动化思维来构建安全告警管道
参考来源
- TanStack Postmortem 原文:Postmortem: TanStack npm supply-chain compromise
- HN 讨论帖:710 分热议
- MistralAI 相关 Issue:@mistralai/mistralai 包受影响