Jiayun's Blog

探索与分享

一条蠕虫潜入了 JavaScript 生态的动脉

2026 年 5 月初,一场代号"Mini Shai-Hulud"(沙丘中的沙虫幼体)的供应链攻击震动了整个 JavaScript 生态。攻击者成功向 TanStack——拥有数百万周下载量的前端基础设施项目——注入恶意代码,并在此过程中窃取了包括 OpenAI 代码签名证书在内的多个高价值凭证。

OpenAI 在其官方博客中发布了紧急响应声明,要求所有 macOS 用户在 2026 年 6 月 12 日前更新 OpenAI 桌面应用。这不是一次普通的软件更新建议——这是因为用于验证 OpenAI 应用真实性的代码签名证书可能已被泄露

攻击链还原:比你想象的更精密

第一阶段:渗透维护者账户

攻击者并没有使用常见的 typosquatting(拼写劫持)手法。根据目前披露的信息,攻击者通过社会工程学手段获取了 TanStack 项目某个具有发布权限的 npm 账户的访问令牌。具体路径可能涉及:

  • 钓鱼邮件伪装为 npm 安全团队通知
  • 利用已泄露的凭证进行撞库攻击
  • 劫持与 npm 账户关联的 GitHub OAuth 令牌

第二阶段:注入恶意载荷

一旦获得发布权限,攻击者在 TanStack 的某个包更新中植入了恶意代码。这段代码被设计为:

  1. 环境探测:检测是否在 CI/CD 环境中运行
  2. 凭证收割:搜索环境变量中的 API 密钥、签名证书、云服务凭证
  3. 静默外传:通过 DNS 隧道将窃取的数据发送到攻击者控制的服务器
  4. 自清除:在下一次 npm install 时自动移除痕迹

第三阶段:横向扩散

这是"Shai-Hulud"名称的由来——蠕虫式传播。被感染的 CI/CD 环境会在构建过程中将恶意代码注入下游依赖,形成感染链。OpenAI 的构建系统可能就是在这个阶段被波及。

1
2
3
TanStack 包 → 开发者 CI/CD → 环境变量泄露 → 代码签名证书外泄
        下游项目 A → 下游项目 B → ...(蠕虫式扩散)

这次攻击为什么特别危险?

攻击面的质变:从"窃取数据"到"窃取信任"

传统供应链攻击的目标通常是窃取用户数据(密码、信用卡号)或植入挖矿程序。Mini Shai-Hulud 的目标完全不同——它瞄准的是信任基础设施本身

代码签名证书是软件世界的"身份证"。当你的操作系统告诉你"这个应用来自 OpenAI Inc.“时,它依赖的就是代码签名证书的验证。一旦攻击者拥有了有效的代码签名证书,他们可以:

  • 分发带有合法签名的恶意软件
  • 绕过 macOS Gatekeeper 和 Windows SmartScreen
  • 在企业环境中绕过应用白名单

npm 生态的结构性脆弱

指标数值含义
npm 注册包数量>300 万世界最大包管理器
平均依赖深度7-12 层攻击只需渗透任一层
启用 2FA 的维护者比例~15%85% 的账户缺乏基本保护
周下载量 >100 万的包~2,000每个都是高价值目标
有已知漏洞的包比例~17%持续积累的技术债

行业反应与反思

OpenAI 的响应

OpenAI 的应急响应相对迅速:在确认证书可能泄露后 48 小时内发布了公告,并采取了以下措施:

  1. 撤销受影响的签名证书并签发新证书
  2. 要求用户更新应用以获取新签名版本
  3. 审计全部 CI/CD 流水线,移除 TanStack 受影响版本
  4. 向 npm 安全团队提交完整的 IOC(入侵指标)

但批评者指出:为什么 OpenAI 的代码签名证书会出现在 CI/CD 环境变量中? 这暴露了即便是最前沿的 AI 公司,在 DevSecOps 实践上也存在基础性漏洞。

npm 生态的治理困境

TanStack 的维护者 Tanner Linsley 是开源社区的知名贡献者。但作为个人维护者,他不可能像企业安全团队那样 24/7 监控账户安全。这引出了一个老问题的新版本:当整个互联网的基础设施依赖于少数个人维护者时,安全责任应该如何分配?

npm 在 2024 年推出了强制 2FA 政策,但仅针对周下载量超过 100 万的包。攻击者正在转向"下一层”——那些下载量在 10 万到 100 万之间、安全要求较低但仍被广泛依赖的包。

供应链安全的下一步

短期:零信任构建环境

企业应立即实施的措施:

  • CI/CD 环境中不存储长期凭证——使用短期令牌(如 AWS STS、GCP Workload Identity)
  • 代码签名使用 HSM(硬件安全模块)——签名密钥永远不离开硬件
  • 依赖锁定 + 完整性校验——package-lock.json + npm audit signatures
  • 构建可重现性——确保任何人都能从源码重建出完全相同的二进制文件

长期:开源安全的经济模型

技术手段终究有限。根本问题是经济性的:谁为开源软件的安全买单?

Linux 基金会的 Alpha-Omega 项目和 OpenSSF(开源安全基金会)正在尝试回答这个问题,但资金规模远远不够。如果 TanStack 有一个全职安全工程师,这次攻击可能在早期就被发现。

我的判断

Mini Shai-Hulud 攻击不会是最后一次,甚至不会是最严重的一次。供应链攻击正在从"脚本小子级别"进化为"APT 级别"——有组织、有耐心、瞄准信任基础设施。

2026-2027 年的预测:

  • 至少还会发生 2-3 起影响范围类似的 npm/PyPI 供应链攻击
  • 主要云厂商将推出"托管签名"服务,取代开发者自行管理签名密钥
  • npm 将被迫对所有维护者强制 2FA,无论包的下载量
  • 代码出处验证(如 SLSA 框架的 Provenance)将成为企业采购开源软件的硬性要求

对开发者的行动建议: 今天就审计你的 CI/CD 环境变量。如果你能在 env | grep -i secret 的输出中看到任何敏感信息,你就和被攻击前的 OpenAI 处于同样的风险水平。


参考来源

  1. OpenAI Blog - Our response to the TanStack npm supply chain attack — OpenAI 官方响应声明
  2. Krebs on Security - Patch Tuesday, May 2026 Edition — 安全社区对供应链攻击趋势的分析
  3. npm Security Advisories — TanStack 相关安全公告
  4. OpenSSF - SLSA Supply Chain Framework — 软件供应链完整性框架
  5. Sigstore - Keyless Code Signing — 无密钥代码签名方案