TanStack 遭遇“Mini Shai-Hulud”供应链攻击:84 个 npm 包被植入 CI 凭证窃取器,每周千万次下载受影响

前端基础设施巨头 TanStack(旗下拥有 React Query, React Router, Table 等明星项目)近日遭遇了一起严重的供应链攻击。安全公司 Socket 检测到其 npm 命名空间下的 84 个包工件 被篡改,植入了旨在窃取 CI/CD 系统(如 GitHub Actions)敏感凭证的恶意软件。(来源

TanStack 遭遇“Mini Shai-Hulud”供应链攻击:84 个 npm 包被植入 CI 凭证窃取器,每周千万次下载受影响插图

此次攻击是持续进行的 “Mini Shai-Hulud” 恶意活动的一部分。由于受影响的包(如 @tanstack/react-router)每周下载量超过 1200 万次,且在生态系统中被广泛依赖,此次事件对全球前端开发社区构成了巨大威胁。

🚨 攻击详情:隐蔽且致命的恶意负载

1. 🕷️ 恶意文件:router_init.js

  • 高度混淆:攻击者在包中添加了约 2.3 MB 的 router_init.js 文件,使用 javascript-obfuscator 进行深度混淆(字符串数组旋转、控制流扁平化、死代码注入),以逃避静态分析。
  • 守护进程化:该脚本通过 spawn 创建守护进程,具备重入防护 (_DAEMONIZED) 和分离的 stdio,确保持久运行。
  • 凭证窃取:专门针对 CI 环境,读取 GITHUB_* 环境变量(包括 OIDC Token、PAT、Actor 身份),并将数据远程流式传输至攻击者控制的服务器(如 filev2.getsession[.]org)。

2. 🎣 诱导机制:Git 依赖陷阱

  • 可疑依赖:恶意版本在 package.json 中添加了 optionalDependencies"@tanstack/setup": "github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c"
  • 生命周期钩子执行:该 Git 提交是一个无父历史的“孤儿提交”,包含一个 prepare 钩子,执行 bun run tanstack_runner.js && exit 1。当 npm/yarn/pnpm 安装基于 Git 的依赖时,会自动触发此钩子,从而在开发者机器或 CI 环境中执行任意代码。

3. 🕵️‍♂️ 攻击源头:被接管的 GitHub 账户

  • 攻击者身份:提交由账户 voicproducoes 发起,其仓库名为“A Mini Shai-Hulud has Appeared”,直接关联到近期的规模化 npm 攻击活动。
  • 入侵路径:TanStack 事后分析表明,攻击者利用了 GitHub Actions 的 pull_request_target 漏洞(Pwn Request),结合 Actions 缓存投毒 和 运行时内存提取 OIDC 令牌,最终通过项目的 OIDC 可信发布者绑定,直接向 npm 注册表发布了恶意包。值得注意的是,TanStack 的 npm Token 并未泄露,攻击者是利用了 CI 环境的信任机制。

🛡️ 紧急响应指南:立即行动!

如果你或你的团队使用了任何 @tanstack/* 包,请立即执行以下操作:

1. 🔍 立即分类与检测

  • 检查哈希:在依赖树中搜索 router_init.js,并计算其 SHA-256 哈希值。若匹配 ab4fcadaec49c03278063dd269ea5eef82d24f2124a8e15d7b90f2fa8601266c,则确认感染。
  • 审计提交记录:运行 git log --all [email protected],查找非合法的 Claude Code GitHub App 发起的可疑提交,如有发现立即还原。

2. 🔑 凭证轮换(最高优先级)

在任何安装了受影响版本的系统上,立即轮换以下秘密:

  1. npm Tokens
  2. GitHub PATs / OIDC 信任配置
  3. AWS 凭证(静态密钥、实例角色)
  4. Vault Tokens / Kubernetes Service Account Tokens

3. 🏗️ GitHub Actions 加固

  • 撤销 OIDC 联邦授权:针对从受影响仓库发布的 npm 包,暂时撤销其 OIDC 信任,待工作流彻底清理后再重新建立。
  • 限制权限:在所有非发布工作流中设置 permissions: id-token: none,仅在特定的发布作业中启用 id-token: write
  • 清理缓存:清除所有 GitHub Actions 缓存条目,防止缓存投毒持续生效。

4. 🧹 本地环境清理

  • 审计配置目录:检查开发者主目录和项目根目录下的 .claude/ 和 .vscode/,删除陌生的 router_runtime.jssetup.mjs 或 settings.json/tasks.json 中的异常钩子。
  • 网络阻断:在防火墙或 DNS 层面阻止出站连接至 filev2.getsession[.]org 及相关 Session 基础设施 IP。

5. 🔒 长期防御策略

  • 锁定完整性:在 package-lock.json 或 pnpm-lock.yaml 中固定 @tanstack/* 包的 integrity 哈希,CI 中强制校验,不匹配即失败。
  • 不再盲目信任 Sigstore:此次攻击证明,能在 CI 中执行的攻击者可生成有效的 Sigstore 证明。需结合来源验证、行为监控等多层防御。

💡 行业启示

TanStack 事件再次敲响了软件供应链安全的警钟:

  1. CI/CD 是新的攻击面:攻击者不再仅盯着 npm Token,而是转向利用 CI 环境的 OIDC 信任和内存状态。
  2. 开源维护者需警惕“Pwn Request”pull_request_target 等高风险触发器必须严格限制权限和合并条件。
  3. 依赖锁文件至关重要:固定哈希值是抵御此类篡改的最后防线。