你以为 CI 工作流只是跑测试?GhostAction 用它偷走了 3325 个凭证
你的工作流在跑测试,GhostAction 在跑你的凭证。
9 月 5 日,GitGuardian 披露了一起代号 GhostAction 的 GitHub Actions 供应链攻击:攻击者向开源仓库注入恶意工作流,在三天内从 327 个开发者账户的 817 个仓库里顺走了 3325 份凭证。
攻击者不需要黑进你的账号——他们只是往仓库里塞了一个看起来人畜无害的 workflow 文件。
第一步枚举:攻击者伪造账号,以安全检查为名提交工作流修改。它会静默遍历仓库里所有工作流的环境变量名,PYPI_API_TOKEN、AWS_SECRET_ACCESS_KEY、NPM_TOKEN,挨个记下来。
第二步注入:把变量名硬编码进新的恶意 step,用 curl 把这些变量的值通过 HTTP POST 发送出去,目的地是攻击者控制的服务器。整个过程在后台跑,没有任何告警。
第三步收获:发布恶意包版本到 PyPI / npm / DockerHub;用 GitHub token 横向读写其他仓库;用 AWS key 访问云资源。所有操作都是合法账号通过合法工作流执行的,GitHub 日志里一切正常。
FastUUID 项目是引爆点。9 月 2 日维护者账号被用于推送恶意 commit;9 月 5 日 GitGuardian 内部告警,FastUUID 被 PyPI 设为只读。但调查人员在至少 5 个公开仓库和约 10 个私有仓库里发现了相同手法——这只是已知范围。
GhostAction 不是孤例。攻击者利用的正是 CI/CD 工作流的本质特征:需要读取环境变量来跑构建和发布。这个读取能力同时也是它成为攻击面的根因。
三道门,一步步把门焊死
第一道,OIDC 代替静态凭证。云厂商都支持 OIDC 联邦身份——你的工作流只需要向云厂商请求一个临时 token,不需要存储任何 static secret。如果你在工作流里还有 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 的 static 配置,现在就可以删掉了。
第二道,声明式权限限制。默认情况下 GITHUB_TOKEN 有读写仓库的宽泛权限,改成最小权限:permissions: contents: read; packages: write; id-token: write。
第三道,SHA1 锁定第三方 action。永远不要用 tag 引用第三方 action,改用完整 SHA1。
立刻做一件事:打开你的仓库,点开 .github/workflows/ 目录,看最近有没有来自陌生账号或者异常 message 的 PR 合并记录。GhostAction 的本质是:你的工作流执行环境,是攻击者的游乐场。凭证只是顺手带走的东西。把 static secrets 从工作流里删掉,是今天就能做的最重要的一件事。
评论区
登录后可评论。