GitHub Actions 是个陷阱
原文由 Tyler Cipriani 于 发布,订阅该博客
黑客攻破软件包的速度快得让人筋疲力尽,而每份事后分析报告里都有 GitHub Actions 的身影。
二月下旬,一个自称 hackerbot 的 AI1 偷走了单个项目的发布密钥。不到一个月,五十多个项目被植入了窃取凭证的恶意代码。每个被感染的仓库都会窃取下一个目标的凭证。
这一波供应链攻击的起点,正是 GitHub Actions 中的一个陷阱:一个简单而糟糕的默认值,以及一个五年前就已提出修复方案的问题。
GitHub Actions 及其后果

Trivy 是一款开源安全扫描器。但如果你在三月下旬用了 Trivy,那就倒大霉了。
3 月 19 日,黑客推送了一个会在任何运行环境中窃取机密的 Trivy 版本。Trivy 方面将其归咎于其持续集成(CI)系统 GitHub Actions 中的“配置错误”。
但与其说是配置错误,不如说是 GitHub Actions 的陷阱。
以下是 Trivy 被攻破过程的简化版本2:
# INSECURE. DO NOT USE.
on:
pull_request_target
jobs:
check:
steps:
- uses: action/checkout@deadbeefdeadbeefdeadbeefdeadbeefdeadbeef
with:
ref: refs/pull/${{ github.event.pull_request.number }}/merge
- uses: ./.github/actions/setup-go
- uses: some/go-static-analysis@c0ffeec0ffeec0ffeec0ffeec0ffeec0ff乍一看,这段代码似乎没什么问题:
- 没有引用任何机密。
- 第三方 Action 已固定到不可变的哈希。
- 拉取一个合并请求,执行静态分析。
但这段代码正是 2021 年一篇题为“preventing pwn requests”的 GitHub 博客文章中逐字列出的反面模式:
如果
pull_request_target工作流只是 […] 运行不受信任的代码,但没有引用任何机密,是否仍然存在漏洞?是的,仍然存在
问题就出在 pull_request_target 上:
pull_request_target—— 会往环境中塞入一个权限充足的GITHUB_TOKEN。actions/checkout—— 有一个可选参数persist-credentials,设为false时会清除机密。但该参数的默认值是true。
将 persist-credentials 参数设为 false 的问题,在 GitHub Actions 上自 2021 年起就一直悬而未决。
你的 $HOME 就是犯罪现场
拿到 Trivy 的密钥后,黑客发布了一个新版 Trivy 来窃取更多密钥。
LiteLLM 在 CI 中使用了 Trivy,而这套 CI 正是他们用来向 Python 软件仓库 PyPI 发布代码的。当 LiteLLM 的 CI 运行了被篡改的 Trivy 时,黑客就窃取了他们的发布密钥。
而在 3 月 24 日,当 Callum McMahon 启动他的 IDE 时,他的 MacBook 卡死了。正是通过这次卡死,他发现了 LiteLLM 被劫持事件。
McMahon 的 MacBook 当时正艰难应对黑客植入 LiteLLM 的恶意代码。而这些恶意代码试图窃取的凭证包括:
~/.netrc~/.aws/credentials~/.config/gcloud~/.config/gh~/.azure~/.docker/config.json~/.npmrc~/.git-credentials~/.kube/
这些文件通常散落在 $HOME 目录各处,里面塞满了令牌和密钥,而且往往是未加密的。
AI 与供应链的死亡螺旋
未加密的凭证、未固定的依赖、CI 的坑人设计——这些问题我们已经应对了无数年。
但 AI 加速了一切,包括对安全错误的重复。
在 Trivy 被攻破当天,我问 Claude:“如何扫描 Docker Registry 镜像中的安全漏洞?”
它的部分回答如下:
CI/CD Integration Example (GitHub Actions with Trivy)
- name: Scan image for vulnerabilities
uses: aquasecurity/trivy-action@master这段回答有两处问题:
- 未固定的引用 ——
master是一个随时会变的引用。如果黑客控制了该仓库,我就会成为首个受害者。 - 现存漏洞 —— 对当天发布的 CVE 只字未提。我没问,所以 Claude 也没去查。
与此同时,Vercel 的首席执行官将公司最近的数据泄露归咎于一名“被 AI 加速”的黑客。而 Anthropic 最近的造势活动则包括向美联储主席汇报其前沿模型发现的漏洞。
坏人有了大模型就获得了超能力,好人有了大模型却栽在了 2010 年代中期的 CI 问题上。
而同一个能揪出 OpenBSD 中潜藏了 27 年的安全问题的工具,仍会建议你把 GitHub Actions 固定到 @master。
或者说,一个自称
hackerbot-claw的家伙,反正是他。↩︎我的 GitHub Actions 示例是 aquasecurity/trivy #10259 中被移除的工作流的简化版本。↩︎
随机一篇博客
评论
登录后参与讨论