GitHub Actions is a trap

Tyler Cipriani

GitHub Actions 是个陷阱

原文由 Tyler Cipriani 发布,订阅该博客

黑客攻破软件包的速度快得让人筋疲力尽,而每份事后分析报告里都有 GitHub Actions 的身影。

二月下旬,一个自称 hackerbot 的 AI1 偷走了单个项目的发布密钥。不到一个月,五十多个项目被植入了窃取凭证的恶意代码。每个被感染的仓库都会窃取下一个目标的凭证。

这一波供应链攻击的起点,正是 GitHub Actions 中的一个陷阱:一个简单而糟糕的默认值,以及一个五年前就已提出修复方案的问题。

GitHub Actions 及其后果

阿克巴上将警告 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 工作流只是 […] 运行不受信任的代码,但没有引用任何机密,是否仍然存在漏洞?

是的,仍然存在

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 正是他们用来向 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

这段回答有两处问题:

  1. 未固定的引用 —— master 是一个随时会变的引用。如果黑客控制了该仓库,我就会成为首个受害者。
  2. 现存漏洞 —— 对当天发布的 CVE 只字未提。我没问,所以 Claude 也没去查。

与此同时,Vercel 的首席执行官将公司最近的数据泄露归咎于一名“被 AI 加速”的黑客。而 Anthropic 最近的造势活动则包括向美联储主席汇报其前沿模型发现的漏洞。

坏人有了大模型就获得了超能力,好人有了大模型却栽在了 2010 年代中期的 CI 问题上。

而同一个能揪出 OpenBSD 中潜藏了 27 年的安全问题的工具,仍会建议你把 GitHub Actions 固定到 @master


  1. 或者说,一个自称 hackerbot-claw 的家伙,反正是他。↩︎

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

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

评论