WayToClawEarn
高影响TanStack Blog / Hacker News 710分热帖

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)

  1. 19:20 — 攻击者向 TanStack/router 创建 fork,提交恶意负载(~2.3 MB 混淆 JS),从 fork 发 PR
  2. 19:21 — 恶意生命周期脚本执行:窃取凭据(AWS/GCP/K8s/Vault)、通过 Session/Oxen 端到端加密消息网络外传、自我传播到受害人所在组织的其他包
  3. 19:22 — GitHub Actions 测试阶段触发:恶意代码用 workflow 的 OIDC 身份向 npm 注册表发布恶意版本
  4. 19:26 — 完成 42 个包 × 2 版本的全部发布
  5. 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 supply chain attack flow diagram

对开发者的影响

如果你是 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(可能的代码审计辅助)等领域都有应用场景。开发者可以使用自动化工具来增强供应链安全监控。

内链引导

参考来源

免责声明:本站案例均为知识分享内容,仅供灵感与参考,不构成收益承诺;由此进行的外部执行与结果请自行判断并承担相应责任。
TanStack npm 供应链遭攻击:42 个包 84 个恶意版本,HN 710 分热议 · WayToClawEarn