GitHub Actions is a trap

Tyler Cipriani

GitHub Actions 是个陷阱

黑客正以令人疲惫的速度攻陷各种软件包,而每一份事后分析报告里都有 GitHub Actions 的身影。

2 月下旬,一个自称 hackerbot AI 的黑客机器人偷走了单个项目的发布密钥。不到一个月,约五十个其他项目就被植入了凭据窃取程序。每一个被感染的仓库都会窃取下一个仓库的凭据。

这一波供应链攻击始于一个 GitHub Actions 陷阱;一个简单的糟糕默认值,而它的修复提案已经提出了五年。

GitHub Actions 及其后果

阿克巴上将就 GitHub Actions 中的陷阱发出警告
阿克巴上将就 GitHub Actions 中的陷阱发出警告

Trivy 是一款开源安全扫描器。但如果你在 3 月下旬使用了 Trivy,那可就倒了大霉。

3 月 19 日,黑客推送了一个试图从其运行的任何地方窃取机密的 Trivy 版本。Trivy 将原因归结为其持续集成(CI)系统 GitHub Actions 中的“配置错误”。

但这次漏洞利用与其说是配置错误,不如说是 GitHub Actions 的陷阱。

以下是 Trivy 被攻陷过程的简化版本:

# 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@c0ffeec0ffeec0ffeec0ffeec0ffeec0ffeec0ff

乍一看,这段代码似乎没问题:

  • 没有引用任何机密。
  • 第三方 Action 已固定到不可变的哈希。
  • 检出拉取请求。执行静态分析。

但这段代码正是 2021 年一篇题为“preventing pwn requests”的 GitHub 博客文章中逐字提到的反模式:

如果 pull_request_target 工作流只是 […] 运行不受信任的代码,但没有引用任何机密,它是否仍然存在漏洞?

是的,仍然存在。

GitHub Security Lab

问题就出在 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 被用来向 PyPI(Python 软件 registry)发布代码。当 LiteLLM 的 CI 运行了被篡改的 Trivy 时,黑客便窃取了他们的发布密钥。

而在 3 月 24 日,当 Callum McMahon(卡勒姆·麦克马洪)启动他的 IDE 时,他的 MacBook 卡死了。正是通过这次卡死,他发现了 LiteLLM 劫持事件

麦克马洪的 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

有两处问题:

  1. 未固定的引用——master 是一个会不断变化的引用。如果黑客控制了该仓库,我就会成为第一个受害者。
  2. 现存漏洞——完全没有提及当天发布的 CVE。我没问,所以 Claude 也就没去查。

与此同时,Vercel 的 CEO 将公司最近的数据泄露归因于一名“被 AI 加速”的黑客。而 Anthropic 最近的宣传活动,还包括向美国联邦储备委员会主席通报其前沿模型发掘出的漏洞。

拿着 LLM 的坏人获得了超能力。拿着 LLM 的好人却栽在了 2010 年代中期的 CI 问题上。

而同一个能揪出 OpenBSD 中存在了 27 年的安全问题的工具,却仍然会告诉你把 GitHub actions 固定到 @master


  1. 或者说,不管怎样,是某个自称 hackerbot-claw 的人。↩︎

  2. 我的 GitHub Actions 示例是 aquasecurity/trivy #10259 中被移除的那个 Action 的简化版本。↩︎

原文由 Tyler Cipriani 发布

本文章由 muse-spark-1.2-contributor 进行翻译