GitHub Actionsワークフローインジェクション攻撃の防止:検出と緩和ガイド
GitHub Actionsワークフローインジェクション攻撃の脅威と対策を解説。不正入力の拡張や権限昇格を防ぐセキュリティベストプラクティスを紹介します。
GitHub Actionsワークフローインジェクション攻撃の防止
GitHubの2024 Octoverseレポートによると、GitHub Actionsワークフローインジェクションは、GitHubリポジトリで最も一般的なセキュリティ脆弱性の一つです。これらの攻撃は、ワークフロー内の信頼できない入力を悪用し、脅威アクターがワークフロー権限で悪意のあるコマンドを実行できるようにします。セキュリティ専門家は、GitHubの組み込みツール、セキュアコーディングプラクティス、自動スキャンを活用して、これらのリスクを軽減できます。
ワークフローインジェクションの技術的詳細
GitHub Actionsワークフローインジェクションは、攻撃者が悪意のある入力(例:Issueのタイトルやブランチ名)を送信し、それがワークフローによって実行される際に発生します。この脆弱性は、${{}}構文に起因し、信頼できない入力が前処理中に展開され、ワークフローの動作を変更する可能性があります。例えば:
- name: print title
run: echo "${{ github.event.issue.title }}"
攻撃者は、 touch pwned.txt のようなIssueタイトルを作成することで、ワークフロー実行時にコマンドとして実行される可能性があります。ワークフローはしばしば高い権限を継承するため、これにより不正アクセスやデータ流出につながる恐れがあります。
主要な攻撃ベクター
- 信頼できない入力の展開:
runコマンド内での${{}}の直接使用。 - 権限昇格:過剰な権限(例:
writeアクセスやシークレットの露出)で実行されるワークフロー。 pull_request_targetトリガー:デフォルトのセキュリティ制限をバイパスし、フォークされたPRにシークレットや書き込み権限を与える。
影響分析
ワークフローインジェクションが成功すると、以下のような影響が生じる可能性があります:
- コード実行:ワークフロー権限で悪意のあるコマンドが実行される。
- データ漏洩:リポジトリのシークレットや機密ファイルが露出する。
- リポジトリの侵害:コードやCI/CDパイプラインへの不正な変更。
リスクはmainブランチに限らず、攻撃者は脆弱なワークフローを含む公開ブランチを標的とすることができます。
緩和策
1. 信頼できない入力には環境変数を使用
runコマンド内で信頼できない入力を直接展開することは避け、代わりに環境変数を介してデータを渡します:
- name: print title
env:
TITLE: ${{ github.event.issue.title }}
run: echo "$TITLE"
この方法では入力はサニタイズされませんが、コマンドインジェクションの攻撃対象を制限します。
2. 最小権限の原則
GITHUB_TOKENのワークフロー権限をpermissionsキーで制限します:
permissions:
contents: read
issues: write
書き込み権限が明示的に必要な場合を除き、デフォルトでread-onlyアクセスに設定します。
3. pull_request_targetの使用を避ける
フォークされたPRがシークレットや書き込み権限にアクセスできないように、pull_request_targetの代わりにpull_requestを使用します。pull_request_targetの使用が避けられない場合は、インジェクションリスクを監査し、権限を制限します。
4. ワークフロー向けCodeQLスキャン
GitHubのCodeQLは、GitHub Actionsワークフローの自動スキャンをサポートしています。以下の方法で有効化できます:
- デフォルト設定:保護されたブランチを自動的にスキャン。
- 高度な設定:CodeQL設定で対象言語に
actionsを追加。
CodeQLのtaint trackingは、信頼できないデータフローを特定し、微妙なインジェクションリスクを発見します。
推奨事項
- すべてのブランチをスキャン:
mainが安全でも、機能ブランチの脆弱性が悪用される可能性があります。 - ツールと手動レビューを組み合わせる:どのツールも100%効果的ではないため、セキュリティファーストの姿勢を維持します。
- チームを教育:GitHubの4部構成のセキュリティシリーズでワークフローの強化方法を共有します。
次のステップ
リポジトリでCodeQLコードスキャンを有効にし、ワークフローインジェクションを積極的に検出します。高度な設定では、CodeQLの対象言語にactionsを追加します。
詳細については、GitHubのワークフローのセキュリティドキュメントを参照してください。