TanStack被投毒!84个npm包遭供应链攻击,每周1200万下载沦陷
bitbot 2026-05-13 11:28 北京

2026年5月11日,安全研究团队Socket披露了一起严重的npm供应链攻击事件——TanStack命名空间下84个npm包被植入恶意代码。受影响的包每周总下载量超过1200万次,波及整个前端生态。
| 警告:这是正在进行中的"Mini Shai-Hulud"供应链攻击活动的一部分。攻击者通过污染GitHub Actions工作流,利用OIDC联邦认证机制将恶意包发布到npm注册表。 |
事件概况
Socket威胁研究团队检测到tanstack命名空间下84个npm包被篡改,攻击者向其中注入了针对CI系统的凭证窃取恶意软件,目标包括GitHub Actions、AWS、HashiCorp Vault和Kubernetes。
其中@tanstack/react-router等热门包每周下载量超过1200万,在npm生态中被直接和间接广泛使用。这意味着数以万计的项目可能已在不知情的情况下安装了恶意版本。
| 亮点:所有被篡改的包版本都在发布后6分钟内被Socket AI Scanner自动标记。 |
攻击链:从PR到npm投毒
TanStack的事后分析将此次入侵归因于一条精心设计的GitHub Actions攻击链,包含三个关键环节:
第一步:pull_request_target "Pwn Request"攻击
攻击者利用GitHub Actions中pull_request_target事件的信任边界缺陷。该事件会在目标仓库的上下文中运行(拥有secrets访问权限),但可以被外部PR触发——这是一个经典的安全陷阱。
第二步:跨Fork缓存投毒
攻击者利用GitHub Actions缓存在fork和base仓库之间共享的特性,通过缓存投毒将恶意代码注入到CI工作流中。
第三步:OIDC Token窃取
攻击者在GitHub Actions Runner进程中通过运行时内存提取技术窃取OIDC Token。恶意发布通过项目的OIDC trusted-publisher绑定认证——攻击者控制的代码在工作流的测试/清理阶段执行后,直接向npm注册表发布。
恶意载荷分析
所有被篡改的包都包含一个新添加的router_init.js文件,约2.3MB,使用javascript-obfuscator进行重度混淆。
混淆特征
● 字符串数组轮转(string-array rotation)
● 十六进制编码标识符查找(如_0x253b)
● 控制流平坦化(while(!![]){}状态机)
● 死代码注入
● 与正常压缩工具(Terser、esbuild、swc)输出明显不同
恶意功能
● 基于spawn的守护进程化,带_DAEMONIZED重入保护
● 访问GITHUB*环境变量(Actions/CI专用的secrets、tokens、actor身份)
● 临时目录暂存,读写删除完整生命周期
● 远程数据外传(exfiltration)
此外,package.json中添加了optionalDependencies字段,指向TanStack/router仓库中一个高度可疑的commit。这个commit没有任何父提交历史(standalone/root commit),只包含package.json和tanstack_runner.js载荷,通过prepare生命周期钩子在安装时自动执行恶意代码。
蠕虫式传播
router_init.js不仅是一个凭证窃取器,还具有蠕虫传播能力。
恶意载荷会窃取npm OIDC Token,然后利用被盗身份自主地将自己重新发布到npm注册表,以被入侵维护者的名义传播恶意包。
| 持久化机制:恶意代码将自身写入Claude Code的钩子目录(.claude/)和VS Code的任务运行器(.vscode/tasks.json),在开发者工作站重启后仍然存活,将蠕虫从CI环境扩展到开发者机器。 |
数据外传通过Session去中心化P2P网络(filev2.getsession.org),使用嵌入的signalservice protobuf和洋葱路由的snode服务节点,使C2流量几乎无法与加密消息应用的流量区分。
攻击者身份
恶意commit由GitHub账号voicproducoes提交,该账号的公开仓库中包含名为"A Mini Shai-Hulud has Appeared"的项目,表明该账号已被接管。
"We've been online over 2 hours now stealing creds— With Love TeamPCP" |
攻击范围持续扩大
截至5月12日,攻击仍在持续扩散。已确认的受害包:
平台 | 受影响包 |
npm | @tanstack/*(84个)、@opensearch-project/opensearch(3.5.3~3.8.0)、@squawk/*、UiPath、Mistral AI |
PyPI | mistralai@2.4.6、guardrails-ai@0.10.1 |
其中guardrails-ai@0.10.1的恶意代码更加直接——import即执行,检查Linux系统后从git-tanstack.com下载远程Python载荷并直接执行。
紧急应对措施
1. 立即排查 对依赖树中所有router_init.js执行SHA256校验匹配哈希:ab4fcadaec...01266c |
2. 轮换所有凭据 优先级:npm tokens > GitHub PATs/OIDC > AWS凭据 > Vault tokens > K8s SA tokens |
3. 其他关键措施 撤销受影响仓库的GitHub Actions OIDC Federation Grants 审计.claude/和.vscode/目录,删除可疑文件 在边界防火墙DNS级别阻断.getsession.org域名 在package-lock.json中实施Subresource Integrity校验 收紧OIDC权限:permissions: id-token: none 不要盲目信任Sigstore认证——攻击者可生成合法认证 |
启示
这次攻击展示了供应链攻击的进化方向:从简单的包名抢注,到利用CI/CD信任链的复杂攻击。攻击者不需要窃取npm token——他们直接利用OIDC联邦认证机制,通过污染CI工作流实现合法发布。
| 核心教训:锁定依赖版本、校验包完整性、最小化CI权限——已经从"最佳实践"变成了"生存必需"。 |
觉得有用?点个赞支持一下 收藏本文,下次用得上 |