GitHubは2026年9月10日、GitHub Actionsのキャッシュ権限をワークフローまたはジョブ単位で制限できるcache-modeを全プランで一般提供しました。
新しい設定値はread、write、write-only、noneの4種類です。信頼度の低いPull Requestでは読み取り専用にし、成果物を作る信頼済みジョブだけに書き込みを許可できます。
狙いは速度ではなく、CI/CDのキャッシュを経由したサプライチェーン攻撃の範囲を狭めることです。既存ワークフローは安全な既定値で動き続けますが、明示設定により意図をレビュー可能にできます。
GitHub Actionsのキャッシュには、依存パッケージ、コンパイル結果、ツールの中間ファイルなどが保存されます。後続の実行は同じキーの内容を復元するため、ビルド時間と通信量を減らせます。
一方、信頼度の低いジョブが共有キャッシュへ書き込めると、改変したバイナリや依存物を保存し、後から実行される信頼済みジョブへ読み込ませる余地が生まれます。これがキャッシュ汚染(cache poisoning)です。秘密情報を持つリリース処理やデプロイ処理が汚染済み成果物を使えば、影響はPull Requestの検証範囲を超えます。
cache-modeは、キャッシュサービス側で復元と保存の権限を分離します。YAML上の慣習ではなく、サービスにより強制される点が重要です。
ジョブ単位の指定はワークフロー単位を上書きします。再利用ワークフローへも権限上限が引き継がれ、呼び出された側は呼び出し元より強いキャッシュ権限を受け取れません。
GitHubの公式発表では、pull_request_targetのような低信頼イベントはread、pushのような信頼済みイベントはwriteが既定です。設定を追加していない既存ワークフローも、この安全な既定値を利用します。
ただし、明示したcache-modeは既定値を上書きします。低信頼イベントへwriteまたはwrite-onlyを与えると、GitHub Actionsは警告アノテーションを表示します。警告が出る設定を正当化できない場合は、権限を戻すべきです。
次はワークフロー全体を読み取り専用にし、信頼済みのpushジョブだけ書き込み可能にする考え方です。実際の構文は利用中のGitHub Actions仕様を確認してください。
name: test-and-build
cache-mode: read
on:
pull_request:
push:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci && npm test
trusted-build:
if: github.event_name == 'push'
cache-mode: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci && npm run build
機密度の高い署名ジョブでは、速度より分離を優先してnoneを検討します。依存物を必ず新規取得し、検証済み成果物だけをArtifact Attestationsなどの来歴情報とともに渡す設計が向きます。
キャッシュを復元・保存する全ジョブと再利用ワークフローを列挙。
外部PR、bot、fork、push、releaseを分類。
原則read。保存が必要なジョブだけwriteへ。
警告、ヒット率、実行時間、失敗率を比較。
最初に組織内の共通ワークフローへ設定すると、多数のリポジトリへ一貫した上限を配布できます。ただし、呼び出し元のイベントと権限を再利用ワークフロー側だけで推測しないことが重要です。
cache-modeだけでサプライチェーン攻撃を防げるわけではありません。次の対策と組み合わせます。
pull_request_targetでPull Request側のコードを実行しない。GITHUB_TOKENとOIDCクラウド権限をジョブ単位で最小化する。GitHubは同じ週に、Pull Requestが新しいSecret Scanningアラートを導入した場合、マージをブロックするrulesetも公開プレビューとして追加しました。キャッシュ権限は成果物経路、Secret Scanningは資格情報経路を守るため、両方を使うと防御範囲が広がります。
開発者にとっては、Pull Requestのテスト速度を維持しながら、共有キャッシュへの書き込みだけを止められます。従来の「キャッシュを使う/使わない」という二択より移行しやすい設計です。
企業では、監査時に「どのイベントがキャッシュを書けるか」をYAMLで確認できます。特に、OSSのfork、外部委託、依存更新botを受け入れるリポジトリで有効です。
編集上の推論として、今後のCI権限はトークンだけでなく、キャッシュ、成果物、ログ、モデル、ランナーなど共有状態ごとの能力として分割されていくと考えられます。
readでも、すでに汚染されたキャッシュを読む危険は残る。noneを増やすと通信量とビルド時間が増えるため、実測が必要。writeを設定すると安全な既定値を弱める。導入後は、キャッシュヒット率、ジョブ時間、保存回数、イベント種別ごとの警告を追跡します。組織rulesetと同様に、キャッシュ権限を組織全体で強制・監査する機能がどこまで拡張されるかも注目です。
まず外部Pull Requestをread、署名・公開をnoneへ固定し、信頼済みmainビルドだけにwriteを与える構成から始めると安全です。
最終確認日:2026年9月14日