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 のセキュリティリスクは?」と聞かれたとき