安全厂商 CrowdSec 确认约 170 个私有 GitHub 仓库在 5 月被复制,事件源头是 2026 年 5 月的 TanStack npm 供应链攻击(CVE-2026-45321)。攻击者先用恶意 npm 包感染一名员工笔记本并窃取 GitHub OAuth 令牌,再用该令牌克隆仓库,而这名员工当时已离职、访问权限却仍被保留以便收尾工作。被盗代码直到 9 月 16 日出现在公开论坛,厂商才知情。
事件概述
时间线较为清晰:2026 年 5 月 11 日,攻击者入侵 TanStack 发布流程,发布 42 个包共 84 个恶意版本,安装即执行盗取 GitHub 令牌、SSH 密钥与云凭证的代码;5 月 22 日,攻击者使用一名刚离职员工账号的 GitHub OAuth 令牌复制约 170 个私有仓库;5 月 25 日该账号被移出 GitHub 组织,但此时复制已完成;9 月 16 日盗取的源码出现在公开论坛,厂商于 9 月 18 日发布事件说明。CrowdSec 表示其生产基础设施与数据库未被访问,源码与构建流水线未被修改。同一批供应链事件还波及其他公司,Mistral AI 与 OpenAI 均确认相关开发设备受影响。
技术细节
这不是一次直接面向最终目标的入侵,而是典型的二次影响链:第三方包 → 开发者环境 → 凭证窃取 → GitHub 访问 → 私有仓库 → 源码外泄。攻击者无需正面突破 CrowdSec,只需拿到一条能通过合法方式访问仓库的令牌。本次暴露内容包含 SaaS 控制台代码与 AWS 云操作例程、数据科学脚本与模型,以及决定哪些 IP 进入拦截名单的共识算法阈值——后者此前从未公开。泄露数据还含 83 个产品监控用用户邮箱、51 名 2020 年潜在投资人的姓名与联系信息,以及一个 AWS SNS 通知服务令牌。CrowdSec 称唯一可用的凭证只能向单个 SNS 主题发布消息,8 月 17 日曾有人尝试使用但未成功;其余令牌在泄露代码中已失效或无法从互联网使用。厂商已在 9 月 16 日至 17 日轮换全部暴露凭证。
影响评估
本次事件的核心教训不是「某个包有毒」,而是供应链攻击的边界远超第一受害者。开发者工作站通常同时握有源码仓库、云平台、CI/CD、包注册表、API 凭据与内部文档的访问权,一台机器失陷即可牵动多个系统。第二个问题是离职账号生命周期:CrowdSec 保留该员工 GitHub 访问权限用于收尾工作,且该令牌在其可查的 GitHub 日志中未留下记录,发现时令牌已不存在。对约 15 万用户而言,直接暴露面有限,但共识算法阈值公开后,理论上存在通过大量可信引擎在多个独立网络中制造检测事件、进而污染拦截名单的路径,厂商称成本极高且阈值可随时调整。
修复建议
- 排查 GitHub/GitLab 组织中是否存在离职员工、外包人员或临时协作者仍持有访问权限的账号,立即回收,临时例外必须设定明确到期时间。
- 轮换 2026 年 5 月期间在开发设备上使用过的 GitHub OAuth 令牌、SSH 密钥与云凭证,并审计令牌使用记录。
- 锁定依赖版本并使用 npm ci 与 lockfile 校验,对 CVE-2026-45321 涉及的 42 个 TanStack 包核对安装历史。
- 为开发终端强制部署端点防护,将工程师笔记本纳入与生产同等强度的检测与响应范围。
- 将开发者身份与 AI 编码代理的授权范围纳入特权账号管理,按最小权限授予仓库与云资源访问。