WFX Phantom 利用被盗 GitHub 令牌在 CI 中运行凭据窃取脚本
攻击者利用被盗的开发者和机器人令牌向 GitHub 仓库植入 shell 窃取脚本,随后回退提交并删除运行记录。脚本可读取运行器内存,并用 OIDC 令牌换取云端访问权限。较新的样本通过 Telegram 上传。
- 披露时间
- 2026年11月11日
- 公开披露日期
- 严重程度
- 化粪池炸了
- 无 CVE:这是入侵事件,不是漏洞
- 波及范围
- 被盗开发者或机器人令牌可写入,且植入的工作流、脚本或包钩子可执行的 GitHub 仓库。
- GitHub Actions · CI/CD · credential theft
- 在野利用
- 已发现
- StepSecurity 观测到载荷执行。WebdriverIO 记录了未经授权的机器人提交。
发生了什么
攻击要求有可写入仓库的有效令牌,以及一条可执行载荷的路径。攻击者可修改现有工作流、新建工作流、在 CI 已调用的脚本末尾追加代码,或添加隐藏脚本并挂到 npm 生命周期、构建或测试命令上。工作流变体可显式传入密钥。脚本变体可在任务有权限时读取运行器内存和凭据存储。云端权限扩展取决于运行器所持凭据及对应权限和信任。载荷具备伪造必需检查结果的功能,但 StepSecurity 检查的样本均未启用该功能。
StepSecurity 发现 GitHub 将部分探测 PR 标为通过 Fly.io 的 GitHub App 发出,并判断涉及用户到服务器令牌。研究未确定令牌的获取方式,也未发现 Fly.io 基础设施失陷的证据。研究发现此活动与10 月 GhostAction存在重叠,未将两者归因于同一攻击者。
Nextcloud Docker 的第 2675 次运行在自托管运行器上执行了植入后的提交,任务以成功状态结束。StepSecurity 根据日志判断上传成功。日志未列出上传归档的具体内容。
应核查的发布制品
- Packagist 的
digitalelvis/neuronai-studio3.14.3 带有脚本及 npm postinstall 钩子。在包目录中用 npm 安装依赖且启用生命周期脚本时,该钩子可执行。Composer 本身不会调用它。StepSecurity 建议固定到 3.14.2 或更早版本。 - Go 模块
github.com/onuragtas/docker-envv1.0.278 和 v1.0.280,以及github.com/vkuznet/gocurlv0.0.0-20261111095532-8d5aad0cb0da 将载荷放在工作流文件里。常规 Go 构建不会执行 GitHub 工作流文件。检查 go.mod 和 go.sum 中的直接及间接依赖,用独立验证的输入替换上述版本。 - StepSecurity 报告没有 WebdriverIO 发布包受影响。对其他在植入与清理之间生成的发布包,用干净源码和构建记录核对。
需要关联核查的指标
- HTTP 端点
194.150.166[.]244:8080/exfil、18.143.168[.]96:8080/exfil和153.75.82[.]159:8080/exfil。此前被植入的部分 GhostAction 工作流仍含旧端点193.32.204[.]199。HTTP 回调参数值包括b42d70a7aab9140ca19e8249和15f44heehnax8jdf41yx。 - Telegram 的
api.telegram.org和sendDocument,聊天编号-1004340163187,机器人 ID 为8708988906、9196217635、9180059428、8902935164、8876515636。仅使用 Telegram 的样本将 HTTP 回调指向回环地址。 - 探测 PR 标题
docs: dependency audit notes,正文Routine dependency audit notes,分支wfx-docs,文件docs/wfx-audit.md,Git blobee6e5addfe591923fc385553cb66cf0d25634a6b。 - 提交信息
ci: refresh build cache、ci: restore、ci: cleanup、chore: add ci helper、chore: add dependency audit workflow,以及空仓库中工作流之前的chore: initial commit。 - 分支模式
chore/[a-z0-9]{8}、ci-check-[0-9]{4},路径模式.ci-[a-z0-9]{6}.sh、.github/workflows/build-audit-[a-z0-9]{6}.yml,以及现有工作流、shell 脚本或package.json的改动。 - 步骤名
Pass runtime、Restore cache <4 characters>或Run audit,变量WF_CALLBACK、WF_CTOKEN、WF_EXFIL_*、WF_TG_BOTS,暂存路径.wfx-$$,日志字符串memscan_files、archive_bytes、deliver_retry。 - Azure 中名为
wfx-ci-*的联合凭据,AWS 中授予通配 AWS 主体权限的信任变更及名为wfx-*的会话。
案发时间线
2026年11月10日
StepSecurity 追溯到攻击活动开始
攻击者使用被盗的 GitHub 令牌探测仓库并推送恶意改动。
11月11日 12:30 UTC
WebdriverIO 贡献者公开记录两次恶意机器人提交
提交植入 postinstall 钩子。同日稍后,Nextcloud Docker 留存的工作流日志记录另一变体的执行。
11月12日 01:10 UTC
一个样本开始使用 Telegram 作为备用通道
该样本还指向第三个 HTTP 收集端点。
2026年11月12日
StepSecurity 发布攻击活动分析
研究人员从约 05:30 UTC 开始观察到仅通过 Telegram 上传的样本,并在 07:40 UTC 报告搜索结果中有超过 6.3 万个探测 PR。搜索结果数量并不代表成功入侵数量。
各方说法
我们列出每条说法和它的出处,并标出一手来源(厂商、研究人员、软件仓库)。各方说法不一致时,按最坏的可信情况定级。
- StepSecurity WFX Phantom 原始分析一手来源记录观测到的变体、公开执行证据、受影响的发布制品、收集端点和云端持久访问功能。
- WebdriverIO 公开回退 PR一手来源记录机器人的未授权提交、postinstall 钩子和建议的处置。
- Nextcloud Docker 仓库提交一手来源展示植入 update.sh 的改动。
- Nextcloud Docker 工作流运行 2675一手来源记录 11 月 11 日 12:52 UTC 植入提交中的 update.sh 被执行。