文章总结: 文档分析2026年5月TeamPCP团伙发起的供应链攻击事件,核心攻击链始于TanStackCI被劫持,通过GitHubActions漏洞传播Shai-Hulud恶意软件,并蔓延至NxConsole扩展及@antv等生态。关键发现包括攻击者利用高信任发布通道、IDE扩展权限及OIDC令牌窃取技术,导致数千开发者凭据泄露。可操作建议包含检查受影响软件版本、清理持久化进程、轮换凭据及加固CI/CD流程。 综合评分: 87 文章分类: 供应链安全,漏洞分析,应急响应,安全工具,恶意软件
黑色五月连环劫:GitHub 被黑始末
白帽子
2026年5月23日 04:07 广东
在小说阅读器读本章
去阅读
以下文章来源于慢雾科技 ,作者慢雾安全团队
慢雾科技 .
慢雾科技是一家专注区块链生态安全的公司,成立于 2018 年 1 月,主要通过“威胁发现到威胁防御一体化因地制宜的安全解决方案”服务了全球许多头部或知名的项目,已有商业客户上千家,客户分布在十几个主要国家与地区。
# 背景
2026 年 5 月开始,知名团伙 TeamPCP 开源了 Shai-Hulud 源码之后,Shai-Hulud/Mini Shai-Hulud 在约一周内完成多条供应链支线的联合攻击,核心逻辑是:先劫持「高信任」发布通道,再收割开发者与 CI 凭据,从而向相邻生态扩散。
SlowMist 持续关注事态发展,今日「GitHub 是否因 Nx Console 18.95.0 被黑」进入大家视野,在公开证据下,Nx Console 是高度可疑且正在被联合调查的关键一跳。
关于影响人数:Microsoft Marketplace 向 Nx 反馈的 28 次安装与 Nx 遥测约 6,000 次 VS Code 扩展激活相差约两个数量级 —— 防御与应急应按数千级潜在暴露规划,而非按 28 人处理。
Shai-Hulud 演化:**
**#
我们将 TanStack 与多波事件归于 TeamPCP(别名 DeadCatx3、PCPcat、ShellForce、CipherForce)
时间轴:**
**#
2026-05-10 ~ 11:TanStack — 信任 CI,而非偷 npm Token
入口(三链组合,缺一不可):
- Pwn Request:攻击者 fork zblgg/configuration,PR #7378 触发 pull_request_target 的 bundle-size.yml,在基仓安全上下文中执行 fork 代码。
- Actions 缓存投毒:向与 release.yml 相同的 pnpm store 缓存键写入约 1.1GB 恶意缓存(pull_request_target 与 main 推送共享缓存作用域;permissions: contents: read 无法阻止 cache post-job 写入)。
- Runner 内存提取 OIDC:release.yml 具备 id-token: write 时,从 Runner.Worker 进程内存读出短期 OIDC 令牌(技术源自 2025-03 tj-actions/changed-files 事件),在 workflow 仍 failure 的情况下完成 84 次 发布(19:20–19:26 UTC)。
恶意包特征:
- 根目录 router_init.js(约 2.3MB,三层混淆;内部代号 EveryBoiWeBuildIsAWormyBoi)。
- optionalDependencies → github:tanstack/router#79ac49ee… 单独 commit;prepare: bun run tanstack_runner.js && exit 1(故意失败隐藏日志)。
- Sigstore 验证通过的 SLSA Build Level 3 证明——证明「由 TanStack release workflow 构建」,不证明代码无害。
- 外传:Session P2P(*.getsession.org)、GitHub GraphQL 死信(伪造 [email protected])、注入 codeql_analysis.yml。
- 持久化:.claude/、.vscode/、gh-token-monitor 死手(先卸 monitor 再轮换 Token,否则可能 rm -rf ~/)。
此次攻击波及:
TanStack Router/Start 相关 42 个 @tanstack/* 包;蠕虫二次传播至 Mistral、UiPath 等(约 170+ 包记录在案)
未波及:@tanstack/query*、table*、form* 等家族。
2026-05-18:Nx Console 18.95.0 — IDE 分发面**
**###
官方时间线:**
**####
**
#### 根本原因(5/21更新):
**####
一名 Nx 开发者遭 TanStack 相关供应链攻击,GitHub CLI (gh) 凭据泄露;攻击者得以在 Nx GitHub 仓库以贡献者身份运行 workflow,并发布恶意扩展。
**
#### 攻击链路:
**####
- 扩展 activate() 检查 nxConsole.mcpExtensionInstalledSha,若不匹配则后台 Task:npx -y github:nrwl/nx#558b09d7(任务名伪装 install-mcp-extension,focus: false)。
- 单独 commit 将 monorepo 替换为仅含 package.json + index.js(498KB 混淆) + bun 依赖。
- 载荷:__DAEMONIZED 守护进程;收割 GitHub / npm / AWS / Vault / K8s / 1Password / Claude Code 配置等。
- 外传:HTTPS + GitHub API + DNS;含 Sigstore Fulcio/Rekor 逻辑,可伪造下游 npm provenance。
- 持久化(macOS):~/.local/share/kitty/cat.py + ~/Library/LaunchAgents/com.user.kitty-monitor.plist;C2 轮询 api.github.com/search/commits?q=firedalazer(RSA-PSS 验签后执行远程 Python)。
此攻击与 5/19 @antv 波次同 TTP:kitty-monitor、firedalazer、Runner /proc/*/mem 抽 Actions secrets。
2026-05-19:同日关联分支 — @antv npm 与 PyPI durabletask**
**###
npm:维护者 atool npm 账户被攻陷,发布 547+ 恶意版本,覆盖 @antv 生态; prop 账户也被攻陷并发布 6 个相关包;preinstall: bun run index.js;optionalDependencies: github:antvis/G2#1916faa…;C2 t.m-kosche.com(伪装 OpenTelemetry);GitHub 死信库描述反转:Shai-Hulud: Here We Go Again。
PyPI:durabletask 1.4.1–1.4.3 被投毒,Linux import-time dropper 最初注入 __init__.py,后续版本扩展到更多模块,下载并执行 rope.pyz / /tmp/managed.pyz。该 payload 是此前 transformers.pyz Python 分支的演化。新能力:AWS SSM SendCommand、Kubernetes kubectl exec 横向传播;主动尝试解锁 Bitwarden / 1Password。
变体:@cap-js/openapi 1.4.1 仅通过 optionalDependencies 指向攻击者 GitHub commit,包 tarball 内无恶意文件。
2026-05-19:GitHub 公司内部仓库泄露**
**###
-
GitHub 披露正在调查未经授权访问内部仓库;TeamPCP 声称约 4,000 私有库。
-
报告称向量:员工工作站上的恶意 VS Code 扩展。
- 时间与手法使 Nx Console 18.95.0 成为首要怀疑对象。
- Nx 立场(Jeff Cross):正与 Microsoft、GitHub 联合调查影响;不推测超出已知事实,亦不淡化严重性。
**
## 传播链:
##
**## 核心要点:
- GitHub 公司 breach 不是链条起点;起点是 5/11 TanStack CI 信任边界失守。
- Nx Console 是下游放大器(220 万+ 安装、认证发布者、打开即执行)。
- 5/19 @antv/PyPI 与 Nx 属同一 TeamPCP/Mini Shai-Hulud 活动簇,入口为维护者凭据而非 TanStack CI。
技术同源指纹:**
##
**
为何「官方+证明+认证」集体失效 ?**
**##
- SLSA / Sigstore 证明构建管道身份,不证明 workflow 当时执行的代码可信。
- pull_request_target + Actions Cache 仍是高危组合;需审计 fork 代码与 base 缓存是否隔离。
- IDE 扩展 = 本地高权限代码;npx -y github:官方仓#单独SHA 极难被传统依赖扫描发现。
- 开关颠倒 IR:先清除 gh-token-monitor / kitty-monitor 等持久化或监控进程,再吊销和轮换 Token。
- 分钟级窗口足够:Nx 在架 ~18 分钟;模型针对 自动更新 + 打开工作区,不依赖长期上架。
处置清单:
1. 确认暴露**
###
# Nx Console 版本code --list-extensions --show-versions | grep angular-console# 18.95.0 = 高危;升级到 >= 18.100.0
# Nx / Shai-Hulud 持久化ls ~/.local/share/kitty/cat.py 2>/dev/nullls ~/Library/LaunchAgents/com.user.kitty-monitor.plist 2>/dev/nullls /var/tmp/.gh_update_state 2>/dev/nullls -d /tmp/kitty-* 2>/dev/nullpkill -f __DAEMONIZEDpkill -f "kitty-"pkill -f "cat.py"
# TanStackfind . -name "router_init.js" -exec shasum -a 256 {} \;# Compromised hash: ab4fcadaec49c03278063dd269ea5eef82d24f2124a8e15d7b90f2fa8601266cfind node_modules/@tanstack -name "package.json" | \ xargs grep -l "voicproducoes\|79ac49eedf"
# @antv 波次(lockfile / package.json)find node_modules -name "index.js" -size +400k -type f 2>/dev/nullgrep -r "1916faa365f2788b6e193514872d51a242876569\|7cb42f57561c321ecb09b4552802ae0ac55b3a7a" \package-lock.json node_modules/ 2>/dev/null
2. containment(先隔离与清持久化;确认恶意进程停止后再轮换/吊销凭据)
# macOS kitty-monitorlaunchctl unload ~/Library/LaunchAgents/com.user.kitty-monitor.plist 2>/dev/nullrm -f ~/Library/LaunchAgents/com.user.kitty-monitor.plistrm -f ~/.local/share/kitty/cat.py
# gh-token-monitor(TanStack / @antv)launchctl unload ~/Library/LaunchAgents/com.user.gh-token-monitor.plist 2>/dev/nullsystemctl --user stop gh-token-monitor.service 2>/dev/nullsystemctl --user disable gh-token-monitor.service 2>/dev/nullrm -f ~/.config/systemd/user/gh-token-monitor.servicerm -f ~/.local/bin/gh-token-monitor.sh
# 杀进程pkill -f 'cat\.py' 2>/dev/nullpkill -f __DAEMONIZED# 检查 __DAEMONIZED 环境变量后结束对应进程
**3. 升级与清理
- Nx Console → ≥ 18.100.0
- 移除恶意 @tanstack/*、@antv/*、durabletask 恶意版本;从可信元数据重生成 lockfile
- 检查 VS Code globalState 键 nxConsole.mcpExtensionInstalledSha 是否为 558b09d7…
- 删除攻击者注入的 .github/workflows/codeql_analysis.yml(若并非己方添加)
4. 凭据轮换(持久化清除后)**
**###
优先级建议:npm 发布 / OIDC → GitHub PAT 与 gh 会话 → AWS / GCP → Vault → K8s SA → SSH → 密码管理器 → ~/.claude/projects/*.jsonl
5. 组织级加固**
**###
- npm Trusted Publisher:绑定具体 workflow + 分支(勿仅 repository: owner/repo)
- workflow 级 id-token: none,仅在 publish job 授予 id-token: write
- 审计 pull_request_target + cache;清理 Actions 缓存
- 扩展/包 最小发布龄(如 48h);终端扩展恶意检测
- DNS:封禁 *.getsession.org、t.m-kosche.com、check.git-service.com 等(不能替代主机侧 IoC 清理)
Indicators of Compromise(速查)
Nx Console 18.95.0:**
**###
**
### TanStack 5/11:
###
### @antv / 5/19:
###
###
## 最终建议:
**##
- GitHub 公司 breach ↔ Nx Console 18.95.0:强时间关联 + 载荷目标一致;Nx/Microsoft/GitHub 调查进行中;Jeff Cross:事实确认前不猜测,按严重事件响应。
- Nx 不是根本原因:链条起点是 TanStack CI + Actions 缓存 + OIDC 内存提取;不修 CI 信任边界,换 IDE 无法止血。
- 目前状态:5/19 @antv + PyPI 表明同一工具链仍在演进;需同时覆盖 npm、VS Code/Cursor 扩展、PyPI、云控制面。
鉴于攻击链成熟度高、扩散范围广的原因,我们预测后续还会有更多企业和项目被爆出攻击,请尽快自查以免资损。
本文由 SlowMist 威胁情报团队结合 MistEye 威胁情报系统、SlowMist Agent AI驱动分析编写,有任何问题欢迎咨询反馈。
往期回顾
威胁情报|Shai-Hulud 供应链投毒:云凭据窃取与自我扩散分析
威胁情报|node-ipc 遭供应链入侵投毒攻击分析
威胁情报|Mistral AI 官方 SDK 供应链投毒分析
被黑分析 | ShapeShift FOX Colony 授权信任链缺陷
Shai-Hulud 恶意软件深度剖析:开源即失控 ?
慢雾导航
慢雾科技官网
https://www.slowmist.com/
慢雾区官网
https://slowmist.io/
慢雾 GitHub
https://github.com/slowmist
Telegram
https://t.me/slowmistteam
https://twitter.com/@slowmist_team
Medium
https://medium.com/@slowmist
知识星球
https://t.zsxq.com/Q3zNvvF
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:白帽子 《黑色五月连环劫:GitHub 被黑始末》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论