コンテンツにスキップ

GitHub Actionsはリリース鍵置き場:OSSサプライチェーン攻撃の実態と対策

概要

GitHub Actions は「テストを自動で回す場所」というイメージがあるが、実態は リリース鍵(secrets)の置き場所 だ。過去 18 ヶ月の主要 OSS サプライチェーン攻撃は、ほぼ全てが .github/workflows/*.yml ファイルに行き着く。

詳細

なぜ GitHub Actions が狙われるか

# 典型的なリリースワークフロー(攻撃者の標的)
- name: Publish to npm
  run: npm publish
  env:
    NPM_TOKEN: ${{ secrets.NPM_TOKEN }}  ← これが狙われる

- name: Deploy to AWS
  env:
    AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
    AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

ここに書かれた secrets を盗み、npmに悪意あるパッケージを公開すれば、そのパッケージを使う全ユーザーに波及する。

実際の攻撃パターン

1. Fork & PR 攻撃
   → 外部の PR が actions を実行できる設定になっている場合
   → 悪意ある PR がワークフローを改変して secrets を盗む

2. Supply Chain の upstream 汚染
   → uses: some-action@v2 で参照する外部アクションに悪意あるコードを混入

3. cache poisoning
   → GitHub Actions キャッシュを汚染して悪意あるバイナリを注入

対策

# 1. 外部アクションはコミットハッシュでピン留め(タグは書き換え可能)
uses: actions/checkout@v4          # ← 危険(タグが書き換えられる可能性)
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683  # ← 安全

# 2. permissions を最小化
permissions:
  contents: read        # 必要な権限だけ付与
  # packages: write は不要なら書かない

# 3. pull_request_target は使わない
on:
  pull_request:         # ← 安全(fork の secrets にアクセスできない)
  # pull_request_target: ← 危険(外部PRが secrets にアクセス可能)

# 4. OIDC(OpenID Connect)で長期クレデンシャルをなくす
- name: Configure AWS Credentials
  uses: aws-actions/configure-aws-credentials@v4
  with:
    role-to-assume: arn:aws:iam::123456:role/GitHubActionsRole
    # AWS のアクセスキーを Secrets に置かずに済む

Dependabot + GitHub の自動更新

# .github/dependabot.yml
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"

アクションのバージョンを自動的に更新してセキュリティ修正を取り込む。

なぜ重要か / いつ使うか

  • GitHub Actions ワークフローを新たに書くとき
  • OSS プロジェクトのセキュリティレビューのとき
  • 「CI/CD のセキュリティリスクは?」と聞かれたとき