开发者生态
morning
事后分析:TanStack npm 供应链妥协
2026-05-12
1 阅读
varunsharma07
启动 RC 启动 RC 路由器 路由器查询 查询表 DB beta DB beta AI alpha AI alpha Form new Form new Virtual Virtual Pacer beta Pacer beta Hotkeys alpha Hotkeys alpha Store alpha Store alpha Store alpha Devtools alpha Devtools alpha CLI alpha CLI alpha Intent alpha Intent alpha 更多库 更多库 Builder Alpha Builder Alpha 博客 维护者 维护者 合作伙伴 合作伙伴 展示 学习新知识 了解新 统计数据 统计 YouTube YouTube Discord Discord Merch 商品支持 支持 GitHub GitHub Ethos Ethos Tenets 品牌指南 品牌指南博客 本页事后分析:TanStack npm 供应链妥协 由 Tanner Linsley 于 2026 年 5 月 11 日复制页面。最后更新时间:2026 年 5 月 11 日 TL;DR # 2026 年 5 月 11 日 19:20 至 19:26 UTC 期间,攻击者发布了 84 个恶意版本通过组合跨 42 个 @tanstack/* npm 包:pull_request_target“Pwn 请求”模式、跨 fork↔base 信任边界的 GitHub Actions 缓存中毒,以及从 GitHub Actions 运行程序进程中提取 OIDC 令牌的运行时内存。没有 npm 令牌被盗,npm 发布工作流程本身也没有受到损害。 StepSecurity 的外部研究人员 ashishkurmi 在 20 分钟内公开检测到了这些恶意版本。所有受影响的版本均已弃用; npm security 已参与从注册表中提取 tarball。我们没有证据表明 npm 凭证被盗,但我们强烈建议在 2026 年 5 月 11 日安装受影响版本的任何人轮换可从安装主机访问的 AWS、GCP、Kubernetes、Vault、GitHub、npm 和 SSH 凭证。跟踪问题:TanStack/router#7383 GitHub 安全公告:GHSA-g7cv-rxg3-hmpx 影响 # 受影响的软件包 # 42 个软件包,84 个版本(每个软件包两个,发布间隔大约 6 分钟)。请参阅完整表格的跟踪问题。已确认的干净系列: @tanstack/query* 、 @tanstack/table* 、 @tanstack/form* 、 @tanstack/virtual* 、 @tanstack/store 、 @tanstack/start (元包,而不是 @tanstack/start-* )。恶意软件的作用 # 当开发人员或 CI 环境针对任何受影响的版本运行 npm install 、 pnpm install 或yarn install 时,npm 会解析恶意的可选依赖项条目,从 fork 网络获取孤立有效负载提交,运行其准备生命周期脚本,并执行走私到受影响 tarball 中的约 2.3 MB 混淆的 router_init.js。该脚本:从常见位置获取凭证:AWS IMDS / Secrets Manager、GCP 元数据、Kubernetes 服务帐户令牌、Vault 令牌、 ~/.npmrc 、GitHub 令牌(env、gh CLI、.git-credentials )、SSH 私钥 通过 Session/Oxen 信使文件上传网络( filev2.getsession.org 、 Seed{1,2,3}.getsession.org ) — 端到端加密,没有攻击者控制的 C2,因此通过 IP/域进行阻止是唯一的网络缓解措施 自传播:枚举受害者通过registry.npmjs.org/-/v1/search?text=maintainer: 维护的其他包,并使用相同的注入重新发布它们 因为有效负载作为 npm install 生命周期的一部分运行,所以任何安装了受影响版本的人2026-05-11 必须将安装主机视为可能受到威胁。时间线 # 所有时间均为 UTC。来自 GitHub API 和 npm 注册表的本地时间戳。预攻击(缓存中毒阶段) # 时间事件 2026-05-10 17:16 攻击者创建分叉 github.com/zblgg/configuration (TanStack/router 的分叉,故意重命名以逃避分叉列表搜索) 2026-05-10 23:29 恶意提交65bf499d16a5e8d25ba95d69ec9790a6dd4a1f14 由捏造身份 claude 在叉子上创作。添加packages/history/vite_setup.mjs(约30,000行捆绑JS有效负载)。提交以 [skip ci] 为前缀的消息,以抑制推送事件上的 CI 2026-05-11 ~10:49 PR #7378 针对 TanStack/router#main 打开,标题为“WIP:简化历史构建”,由 zblgg 2026-05-11 10:49 开始,bundle-size.yml 和 labeler.yml(均为 pull_request_target )自动运行 PR — 否需要首次贡献者批准,因为 pull_request_target 绕过了该门。 pr.yml(使用 pull_request )不运行,阻止从未到来的待批准 2026-05-11 11:01–11:11 zblgg 多次强制推送到 PR 头,每次触发更多的 pull_request_target 运行 2026-05-11 11:11 强制推送在 PR 头上登陆 65bf499d (恶意提交)。 bundle-size.yml 的 benchmark-pr 作业检查 refs/pull/7378/merge ,运行 pnpm install + pnpm nx run @benchmarks/bundle-size:build — 这会执行 vite_setup.mjs 2026-05-11 11:29 缓存条目Linux-pnpm-store-6f9233a50def742c09fde54f56553d6b449a535adf87d4083690539f49ae4da11 (1.1 GB) 保存到 TanStack/router 的 GitHub Actions 缓存,范围 refs/heads/main — 键入以匹配release.yml 在下次推送到 main 时查找的内容2026-05-11 11:31 攻击者将 PR 强制推回当前主 HEAD ( b1c061af ),使可见 PR 成为 0 文件无操作。 PR 关闭并在同一分钟删除分支。缓存中毒仍然存在。爆炸(公开