这次攻击发生在 UTC 时间 2026 年 5 月 11 日 19:20 至 19:26 之间。攻击者并没有直接盗取 TanStack 团队成员的 npm 账号,而是通过一套精密的“组合拳”绕过了安全防线。
根据 TanStack 官方发布的事故复盘报告,攻击者利用了 GitHub Actions 中 pull_request_target 工作流的信任漏洞。通过向 TanStack/router 提交一个看似无害的 PR,攻击者成功地将恶意代码注入到了 GitHub Actions 的缓存(Cache)中。
当维护者 Manuel 在 19:15 合并了一个正常的 CSS 修复补丁时,自动化发布流程启动并读取了被污染的缓存。恶意脚本在构建环境中通过提取内存中的 OIDC 令牌,直接获得了向 npm 官方仓库发布版本的权限,从而在短短 6 分钟内发布了 84 个包含毒素的受影响版本。
核心杀伤力:窃取、传播与“同归于尽”
安全专家及 TanStack 团队在调查中确认,受影响的包被植入了一个约 2.3 MB 的混淆脚本 router_init.js。其行为具有极强的破坏性:
1. 全方位凭证窃取
一旦开发者或 CI 环境运行了 npm install,恶意脚本会立即扫描环境,收集包括 AWS/GCP 凭证、Kubernetes 令牌、SSH 私钥、GitHub 访问令牌以及包含 npm 认证信息的 ~/.npmrc 文件。
2. 蠕虫式自我传播
这是一种典型的“以战养战”策略。脚本会利用窃取到的权限,自动在 npm 上搜索受害者拥有维护权限的其他项目,并将恶意代码注入后重新发布。这意味着感染会像病毒一样在开发者社区中链式传播。
3. 报复性自毁机制
这是本次攻击中最具毒辣色彩的技术细节。攻击者在 Linux 和 macOS 系统中安装了一个持久化守护进程。该进程会持续监控已窃取 GitHub 令牌的有效性。一旦开发者发现泄露并撤销了令牌,该脚本将视为“被发现”的信号,随即触发 rm -rf ~/ 命令,强制清空用户的家目录作为报复。
应急响应与防护建议
TanStack 创始人 Tanner Linsley 及其团队在收到来自 StepSecurity 的安全研究员 ashishkurmi 的预警后,在 20 分钟内迅速做出了响应。目前,所有受影响的版本均已在 npm 仓库中被标记为弃用(Deprecated)。
在此,圈小蛙提醒广大开发者,如果你在 2026 年 5 月 11 日左右安装或更新过 @tanstack/* 系列包(特别是 Router 和 History 相关包),请务必执行以下操作:
- 检查版本:确认是否安装了受影响的版本(受影响包列表见 GitHub Issue)。
- 断网检查:在撤销任何令牌之前,先断开网络并检查系统是否存在异常的守护进程,防止触发自毁脚本。
- 强制轮换:立即轮换所有可能接触到的云平台凭证、SSH 密钥和 API 令牌。
- 清理缓存:清理本地及 CI 环境的 npm 和 GitHub Actions 缓存。
这次事件再次给开源社区敲响了警钟:即使是拥有严密工作流的大型项目,也可能在 GitHub Actions 的细微配置偏差上翻车。
本报道由 圈小蛙(qxwa.com) 科技资讯站特约撰稿。🐸️