GitHub Actions、pull_request_target で fork PR checkout をデフォルト拒否
pull_request_target はベースリポジトリの GITHUB_TOKEN・シークレット・デフォルトブランチのキャッシュで動く。fork 由来の未レビュー pull request の head を checkout して実行すると、攻撃者制御のコードがワークフロー権限で走る pwn request になりうる。actions/checkout v7 はこの典型パターンを既定で拒否する。fork 以外の同一リポジトリ pull request と pull_request イベントは対象外である。
v7 は一般提供開始済みである。7月16日にはサポート中の全メジャー版へ同じ強制をバックポートする。actions/checkout@v4 のような浮動メジャータグは自動で追従する。特定 SHA・minor・patch に固定したワークフローはバックポートの対象外で、Dependabot 等でのアップグレードが必要である。
pull_request_target および workflow_run(workflow_run.event が pull_request* のとき)で、fork pull request について次のいずれかに当てはまる checkout を拒否する。
repository:が fork pull request のリポジトリに解決されるref:がrefs/pull/number/headまたはrefs/pull/number/mergeに一致するref:が fork pull request の head または merge コミット SHA に解決される
次のような入力は失敗する。
ref: refs/pull/${{ github.event.pull_request.number }}/merge
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}run 内の git や gh で untrusted な ref を取得して実行する経路、issue_comment など他イベントの pwn request、無関係な第三者リポジトリへの repository: 指定はブロック対象外である。
カバレッジ取得など fork pull request コードの checkout が必要な正当な用途向けに、actions/checkout ステップへ allow-unsafe-pr-checkout 入力でオプトアウトできる。利用前に pull_request_target の安全な使い方を確認し、コードレビューで目立つ名前であることを踏まえて意図的な判断とする。