概要
GitHubはCI/CDで広く使われる公式アクションactions/checkoutに、サプライチェーン攻撃「Pwn Request」を防ぐ安全なデフォルト動作を追加し、既存の主要バージョン全体へバックポートした。対象となるのはpull_request_targetやworkflow_runイベントで動作するワークフローで、フォークリポジトリの未レビューなプルリクエストのコードをチェックアウトしようとすると、ワークフローを失敗させる仕様に変わった。この変更はactions/checkout@v4のようにfloatingタグ(メジャーバージョンのみを指定するタグ)を使っているワークフローには自動的に適用される。当初は7月16日の適用開始が予定されていたが、実際の全面適用は7月20日にずれ込んだ形となった。
Pwn Requestとは何か
pull_request_targetイベントは、通常のpull_requestイベントとは異なり、ベースリポジトリのGITHUB_TOKENや各種シークレット、デフォルトブランチのキャッシュへのアクセス権を持った状態でワークフローが実行される。ここで従来のactions/checkoutは、指定さえすればフォークPRのヘッドコミットも無条件にチェックアウトしていたため、悪意ある投稿者がPRを送るだけで、レビューされていない攻撃者制御下のコードが昇格した権限で実行されてしまう危険があった。GitHub自身も「未レビューのフォークPRのヘッドをこうしたワークフロー内でチェックアウトすると、通常は攻撃者制御のコードがワークフローの全権限で実行されてしまう」と説明しており、この攻撃パターンは近年、Nx、PostHog、TanStack、Emacsパッケージなどを巻き込んだ複数の実際のサプライチェーン侵害の原因となっていた。
技術的な仕組みと対象範囲
新しいデフォルト動作は、pull_request_targetまたはworkflow_run(後者はworkflow_run.eventがpull_request系イベントの場合に限る)のワークフロー内で、以下の条件が同時に満たされる場合にチェックアウトを拒否する。
repository:がフォークリポジトリを指し示しているref:がrefs/pull/<番号>/headなど、PRのヘッドやマージ参照に該当する- 実際に解決される参照がフォークのヘッドまたはマージコミットSHAである
同一リポジトリ内のPRや通常のpull_requestイベントは影響を受けない。GitHubは6月18日にactions/checkout v7としてこの保護機能を一般公開した後、v1を除く既存の主要バージョン(v2〜v6系統など)にも同等の安全策をバックポートし、フォーク由来の危険なコードチェックアウトを塞いだ。
開発者への影響と対応方法
昇格権限が本当に必要な特殊なワークフロー(例えば、レビュー済みのラベルが付いたPRのみを対象とするデプロイパイプラインなど)のために、GitHubはallow-unsafe-pr-checkoutという入力パラメータを用意しており、これを明示的に指定すればこれまで通りの動作に戻せる。あえて警告的な名前を付けることで、コードレビュー時にこのオプトアウトが目立ち、レビュアーが気づきやすいよう配慮されている。一方で、actions/checkoutを特定のSHAやマイナー・パッチバージョンにピン留めしているワークフローは自動的には保護を受けないため、Dependabotなどの仕組みを使って明示的にアップグレードする必要がある。今回の変更はCI/CDのデフォルト設定をより安全な方向に倒す取り組みの一環であり、他のGitHub Actions関連ツールでも同様の「secure by default」の流れが今後広がることが予想される。