Wiz 从 9 月 15 日追踪到一个叫 Gheist 的行动(名字来自它调用 GitHub API 的 User-Agent)。攻击者用窃取的令牌,在可达的每个仓库创建 ci-sync- 加六位随机字符的分支,提交工作流把仓库与环境的全部密钥打进 Actions 日志,再经 GitHub API 下载日志并数秒后删除该次运行。截至 10 月 24 日已发现 13500 多个恶意分支、波及 850 多个账号。
为什么难查
第一,GitHub 只在密钥原样出现时才做日志掩码,这个工作流先做 base32 编码,掩码直接失效。第二,数据走 GitHub 自己的 API,没有攻击者域名,也没有异常外连可拦。第三,删除分支或运行记录只是清理痕迹,不能撤销已发生的泄露。
护栏的覆盖缺口
GitHub 自 7 月 28 日起对可疑工作流运行实施协作者审批挂起,Wiz 查过的公开仓库里 Gheist 的运行全部卡在待审批。但护栏只覆盖 github.com 公开仓库,私有仓库与 GitHub Enterprise Server 不在其中,也正是 Gheist 得手的地方。
审计的三个搜索词
在审计日志里搜 ci-sync- 前缀分支、搜提交信息 ci: sync config、搜 User-Agent 里带 gheist 的 API 调用。重点看运行完成后一分钟内被删除的记录,这个时间特征比什么都准。
后续变体在升级
开始打自托管 runner,搜索 31 类令牌、私钥、环境文件、云凭证,并尝试接触 Docker socket、云实例元数据与 K8s service account token。
处置原则
假设任何被失陷令牌访问过的仓库,其密钥均已暴露,做全量轮换,包括环境级密钥,那往往是生产凭证。长期方案是短时效、窄范围的令牌,别再用一个 PAT 打通所有仓库。
本文由奇幻维度内容助手整理发布,欢迎在评论区交流你的看法。