Newshot
Account

攻击者劫持4837个GitHub账号,在1806多个仓库植入CI密钥窃取程序

AI summary

据安全公司Aikido Security披露,攻击者从本周二起利用4837个GitHub账号的失窃凭据,向这些账号有写入权限的仓库植入密钥窃取程序。该程序旨在窃取仓库CI工作流可访问的密钥和云凭据,已在至少1806个仓库中运行。

Translation(model translation, not the source's own text)

据安全软件公司 Aikido Security 称,从周二开始,一名攻击者利用 4,837 个 GitHub 账号的窃取凭据,在这些账号有写入权限的仓库中植入了秘密窃取程序。

该窃取程序旨在获取仓库 CI 工作流所能访问的机密和云凭据。该公司表示,它至少在 1,806 个仓库中运行过,攻击者很可能已在其中收集了这些凭据。

每次攻击都始于一个标题为 docs: dependency audit notes 的拉取请求,该请求从名为 wfx-docs 的分支发起,用于测试该账号是否对仓库有写入权限。这些测试性拉取请求在 61,764 个仓库中被发起,窃取程序随后出现在其中部分仓库中。

在另一项分析中,销售软件供应链安全工具的 SafeDep 的研究人员统计出,在周二 12:46 UTC 至今日 04:36 UTC 之间,共有 8,093 个仓库收到了恶意提交。该统计涵盖所有收到恶意提交的仓库,而不仅是窃取程序运行过的仓库。研究人员表示,他们的搜索仅覆盖公共仓库的默认分支,因此真实总数更高。

在这些仓库中,有 7,309 个是将窃取程序添加到现有工作流中。另有 771 个是以 npm postinstall 钩子的形式出现,该钩子也会在开发者机器上执行 npm install 时运行。

推送窃取程序后,攻击者通常会在几分钟内还原更改。在窃取程序运行过的地方,其日志被删除,通常连同运行记录本身一起被删除。在这些仓库中,工作流可访问的每个机密和云角色都应被视为已泄露。

《The Hacker News》的一项检查发现,在该公司自身的 GitHub 搜索于周三结束后,今日早间又出现了更多标题相同的拉取请求。经检查的三个拉取请求于 05:04 至 05:38 UTC 之间发起,均来自 wfx-docs 分支。目前尚不清楚窃取程序是否随之出现。

Aikido 在其技术分析中表示,任何发起过攻击者测试拉取请求的账号都已泄露,即使窃取程序从未运行。该分析未说明攻击者是如何获得这些凭据的。

SafeDep 的研究人员建议受影响仓库的所有者撤销提交作者的令牌、OAuth 应用授权、SSH 密钥和会话,并启用 2FA。所有者还应轮换该仓库可读取的每个机密和变量。任何在受影响提交上运行过 npm install 的人都应将该机器视为已泄露,并轮换其密钥。

在大多数收到测试的其他仓库中,之后没有推送任何内容,或者由于仓库设置或账号权限,窃取程序并未运行。这些数字仅涵盖该公司所能看到的公共仓库。

这些测试还触及了受感染账号并不拥有的仓库。在这些测试性拉取请求中,有 10,431 个是通过协作者或组织访问权限提交的,其中 92% 在该公司检查时仍处于开启状态。

仓库被攻击的迹象

从周二起,在你拥有写入权限的任何仓库中检查以下迹象:

  • 分支:wfx-docs
  • 分支:chore/[a-z0-9]{8},短生命周期
  • 分支:ci-check-[0-9]{4}
  • 拉取请求标题:docs: dependency audit notes
  • 提交信息:ci: refresh build cache,会向现有工作流添加约 1,500 行
  • 提交信息:chore: add ci helper,会添加一个 .ci-xxxxxx.sh 脚本,并在 package.json 中添加一个 postinstall 钩子,在任何 npm install 时运行它
  • 提交信息:chore: add dependency audit workflow,会在 chore/ 分支上添加 .github/workflows/build-audit-xxxxxx.yml
  • 提交信息:chore: initial commit,在空仓库中于新工作流文件之前推送
  • 提交信息:ci: restore
  • Commit message: ci: cleanup
  • SHA-256(窃密脚本):89695abb392d5cfd4972672961e644bb46baa98aa1ed7173c2a2816c762735cf
  • IP:194.150.166[.]244:8080/exfil
  • IP:18.143.168[.]96:8080/exfil
  • IP:153.75.82[.]159:8080

一个仓库可能没有显示任何 wfx-loot 产物、wfx- 缓存条目或 WFX-BEGIN 步骤摘要,但数据仍然已经泄露。攻击者提交上缺失的运行编号,才是窃密脚本运行过的更可靠迹象。

SafeDep 的研究人员发现,该窃密脚本通过 HTTP POST 将数据发送到上述地址或某个 Telegram 聊天。在 200 个载荷提交的样本中,约五分之一仅使用了 Telegram。

据该公司称,该窃密脚本被设计为从运行器上的每一个来源收集凭据。这些来源包括 GitHub Actions 的 secrets 和变量、工作流的 GITHUB_TOKEN、OIDC 和 Actions 运行时令牌、AI 服务的密钥,以及运行器自身进程内存中的机密信息。它会从常见位置读取 AWS、Azure、GCP、Kubernetes、npm、PyPI、SSH 及其他工具的凭据文件。

它还会复制仓库、仓库最近 100 次提交以及近期的工作流产物。在自托管运行器上,它还会从实例元数据中获取云凭据,并获取 Docker 容器状态和 systemd 单元。

该窃密脚本还带有针对私有仓库的设置,该公司表示,这表明它可能正在私有仓库中运行。

该窃密脚本旨在利用这些凭据深入云账户。它会将 GitHub OIDC 令牌兑换为 AWS、GCP 和 Azure 会话,并且在 AWS 上可以为 IAM 用户创建长期访问密钥。

它的某些步骤被设计为能够在凭据轮换后继续存活。它可以重写 AWS 角色的信任策略,使该角色对任意 AWS 账户开放。

它还可以向 Azure AD 应用程序添加前缀为 wfx-ci- 的联合身份凭据。此后,即使所有令牌都已轮换,被入侵仓库中的工作流仍可在不存储密钥的情况下登录 Azure。

为发现这些后门,研究人员建议检查:

  • Entra ID:并非由你创建的、名为 wfx-ci-* 的联合凭据
  • AWS CloudTrail:名为 wfx-* 的 AssumeRoleWithWebIdentity 或 AssumeRole 会话,其后跟随 CreateAccessKey 或 UpdateAssumeRolePolicy
  • GCP:来自你的 GitHub 工作负载身份池的 GenerateAccessToken 和 SignJwt 调用
  • Vault:来自 GitHub OIDC 签发方的 JWT 登录

该窃密脚本通过自动化发布触发器至少触及了一个 Packagist 包和一个 Go 模块。在被入侵的用户中,至少有 50 个似乎会发布 npm、Go、Packagist、PyPI 或 crates 的包。

该公司表示,攻击者似乎意在获取 CI 机密,而非试图通过包进行传播。

Packagist 包 digitalelvis/neuronai-studio 的 3.14.3 版本是恶意的,该公司建议将任何安装或打开过该版本的机器视为已遭入侵。其包列表显示该版本于周三发布。今日早些时候,该版本仍被列出,并附有一则通知,称该包的多个版本已被标记为恶意软件。

研究人员发现,常规的 composer install 不会运行该窃密脚本,但在该包的 vendor 目录内运行 npm install 则会。用户应阻止 v3.14.3,并固定使用 v3.14.2 或更早版本。

Go 模块 github.com/onuragtas/docker-env 的两个版本 v1.0.278 和 v1.0.280 仅在某个 GitHub Actions 工作流文件中携带该窃密脚本。Go 代码和发布二进制文件未发生变化,而 Go 构建从不运行工作流文件,因此该模块的用户可能未受影响。该公司仍建议移除这些版本。

研究人员还在另一个 Go 模块 github.com/vkuznet/gocurl 中发现了该窃密程序,位于伪版本 v0.0.0-20261111095532-8d5aad0cb0da 中,藏在一个从未运行过的工作流里。用户应屏蔽该伪版本。

该窃密程序还通过以机器人账号 wdio-bot 名义提交的 commit 进入了 28 个 WebdriverIO 仓库。没有任何软件包发布受到影响,但该机器人的 token 应被视为已泄露。

该公司发现,本周被使用的账号与 GhostAction 十月行动中受影响的账号存在重叠;在十月行动中,被盗的 GitHub 账号被用来向仓库推送窃取机密的工作流。

十月受影响的账号在本周被使用的可能性,约为其他活跃账号的 1,000 倍。在 100 多个仓库中,新的窃密程序被添加到十月的工作流文件中,同时保留了原先负责向外发送数据的旧步骤。

Aikido 表示:“现阶段我们并不把十一月的事件归因于同一行为者”,因为基础设施、工具和方法均不相同,而被盗凭证往往会落到多个攻击者手中。

更正(2026 年 11 月 12 日):本文早前版本称,该窃密程序仅通过 HTTP POST 向两个地址发送数据,且攻击者在一分钟内还原了每处改动。第二次分析发现了第三台服务器、一个 Telegram 频道,以及留存时间更长的改动。

The translation is machine-generated and individual terms may be off. Nothing is rewritten or cut; the original is authoritative.

Published by The Hacker News
This site only summarises and aggregates; copyright stays with the original author. Headlines and summaries follow the source — where they differ, the original wins.
Read the original ↗