安全
GhostAction 不再满足于你的 CI 密钥,它现在读完整个 Git 历史
GitGuardian、Socket 与 StepSecurity 本周各自发布了关于一场自 2025 年延续至今的 GitHub Actions 供应链攻击的调查。新版本不只取走已登记的 CI 密钥,还会翻查完整的提交历史——这正是去年那套轮换建议已经不够用的原因。
MAI
本周约三十小时之内,三支研究团队先后发布了针对同一场 GitHub 供应链攻击的调查。GitGuardian、Socket 和 StepSecurity 讲的都是 GhostAction——这场活动最早在 2025 年 9 月被披露,而 GitGuardian 的数据直截了当地说明它从未真正中断:「我们的数据显示,GhostAction 其实从未停止。」
变的不是攻击抵达的方式,而是被注入的代码带走什么。
2025 年的版本只读取仓库在 GitHub Actions 工作流中已经引用的密钥名称,并把这些值发送出去。现在运行的版本在此之外,还会扫描工作目录和完整的提交历史,寻找符合一组特征的凭据:AWS 访问密钥与会话令牌、GitHub 与 GitLab 令牌、Google / Firebase / GCP 密钥、Slack 与 SendGrid 密钥,以及 Anthropic、OpenAI、OpenRouter 的 API 密钥。文件名为 security-audit.yml 或 github_actions_security.yml,以维护者本人的身份直接提交到默认分支——这正是它绕过评审的原因。用 Socket 的话说:
这个工作流没有任何安全功能。
三组数据,数的是三件不同的事
| 研究团队 | 报告时段 | 范围 |
|---|---|---|
| GitGuardian | 2026 年 8 月 31 日至 9 月 30 日 | 工作流被推入 373 个用户与组织所拥有的 772 个公开仓库;被注入文件点名的密钥共 2,577 个 |
| Socket | 2026 年 10 月 8 日 | 通过两个被攻陷的维护者账号触及 346 个仓库(henrywoo 名下 318 个,其中源仓库 39 个、派生 279 个;kitao 名下 27 个),另有 uber/athenadriver |
| StepSecurity | 截至 2026 年 10 月 9 日 | 378 个仓库的默认分支上仍有存活的恶意工作流,其中约 182 个属于翻查历史的变种 |
这些数字计量的对象不同——某一时段内的注入次数、单日清扫中触及的仓库数、默认分支上仍然存活的文件数——不应简单相加。The Hacker News 在 10 月 9 日综述 Socket 的调查时报道,自 10 月 7 日以来已有超过 500 个账号把该工作流提交到数万个仓库;这比各家厂商自己文章中的任何数字都高出一个量级,是最需要谨慎对待的一项。三份报告给出的初始入口都很平常:维护者泄露的个人访问令牌,很可能来自信息窃取木马的日志。Socket 指出,休眠仓库与活跃仓库一同被卷入,这「与自动枚举相符,而非有选择的定向攻击」。
去年的处置建议覆盖不了今年的攻击
这是能力变化带来的实际后果,Socket 的表述最为精准:
轮换 Actions 密钥对已提交凭据的暴露毫无作用,而扫描工作目录对 Actions 密钥的暴露同样毫无作用。
两种暴露,两份活。读了 2025 年的报告、把 Actions 密钥轮换过一遍的团队,只处理了其中一种。2023 年提交到某个分支、一周后被删除的密钥依然留在历史里,任何能够 checkout 的东西都读得到,而轮换密钥仓库再多次也触不到它。
工作流所瞄准的目标同样值得注意。GitGuardian 对这 2,577 个被点名密钥的拆解中,占首位的是 SSH 密钥与部署服务器凭据(446 个),其后是 Azure 凭据(218 个)、容器镜像仓库凭据(142 个)、数据库凭据(112 个)和 AWS 访问密钥(106 个)。这是基础设施访问权,而不只是软件包发布权限。
决定影响半径的是派生仓库
通过一个账号触及的 318 个仓库中,有 279 个是派生仓库。派生仓库会带着这个工作流文件,并在启用了 Actions 的地方执行它;日后从已被感染的上游派生出来的仓库也会继承它。因此上表中的仓库数都只是下限。
被点名的项目中暴露面最大的是 kitao/pyxel——18,420 颗星、966 个派生,同时通过 PyPI 和 crates.io 分发,其 Actions 密钥中存有发布令牌。Socket 报告称,到目前为止两个注册表上都没有出现恶意版本。这个「到目前为止」是有实际分量的:发布凭据在有人轮换之前一直可用。
uber/athenadriver 是治理层面的案例:一个由组织拥有的仓库,因为某位个人作为项目原作者仍保留写入权限而被触及。组织会继承每一个仍能向它推送的个人账号的安全水位。
检测起作用了,善后没有
GitGuardian 从 605 个仓库收集到 3,669 次工作流运行记录。真正执行的只有 32 个仓库中的 499 次——其余大多被 GitHub 挂起等待批准——其中 336 次完成,从 13 个仓库外传了 26 个密钥。平台的批准闸门大体上发挥了设计中的作用。
然而截至 10 月 5 日,772 个仓库中只有 124 个、即 16% 得到了有效清理。问题从来不是看不见,而是该采取行动的人没有行动。
GitGuardian 还发现,13 个 GhostAction 受害仓库同时被用于通过 Actions 挖矿,涉及至少四场彼此无关的活动;约 6,000 颗星的项目 kuafuai/DevOpsGPT 的 Docker 镜像中嵌入了挖矿程序,提交时间比这一波的首次投放早约一天半,并已在 10 月 4 日被回滚。GitGuardian 并未把挖矿程序归因于 GhostAction 的操作者,而是给出了一个更有用的结论:「一个被攻陷的开发者账号,可以被多个彼此无关的攻击者利用。」
如果你维护或依赖某个公开仓库
回溯到 2026 年 8 月 31 日,在所有分支和派生仓库中检查那两个工作流文件名。只要出现其中之一,就把该仓库当作已被攻陷处理:吊销而不只是轮换那条允许推送的 GitHub 凭据,更换全部 Actions 密钥,然后扫描所有分支和标签的完整历史,并同样更换扫出来的凭据。在发布令牌替换完成之前,暂停向注册表发布版本。入侵指标和需要封堵的外联地址,三份公告中都有记载。
Sources: GitGuardian — The campaign that never stopped: tracking GhostAction from 2025 to 2026 · Socket — New GhostAction Wave Hits Hundreds of Repos, Expanding Beyond CI/CD Secrets to Cloud Credentials · StepSecurity — GhostAction Returns: Malicious "Security Audit" Workflows Now Mine Credentials from Entire Git Histories · The Hacker News — Credential-Stealing GitHub Actions Workflows Planted in Tens of Thousands of Repositories