TanStack被投毒!84个npm包遭供应链攻击,每周1200万下载沦陷

· 2026-05-13 11:28 · 0 阅读

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权限——已经从"最佳实践"变成了"生存必需"。

觉得有用?点个赞支持一下

收藏本文,下次用得上

跳转微信打开