GitHub Actions is a trap

Tyler Cipriani

GitHub Actions 是個陷阱

駭客正以令人疲憊的速度入侵套件,而每一份事後檢討報告中都有 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 已固定到不可變的雜湊值。
  • 取出 pull request。執行靜態分析。

但這段程式碼完全照抄了 2021 年 GitHub 部落格文章〈preventing pwn requests(《預防 Pwn 請求》)〉中的反面模式:

如果 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 年起就一直是個未解決的問題(自 2021 年以來)

你的 $HOME 是犯罪現場

駭客取得 Trivy 的金鑰後,便發布了一個新版 Trivy 來竊取更多金鑰。

LiteLLM 在其 CI 中使用了 Trivy。也就是他們用來將程式碼發布到 PyPI(Python 軟體套件庫)的那套 CI。當 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 的執行長將公司近期的資料外洩歸咎於一名「受到 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 進行翻譯