GitHub Actions、pull_request_target で fork PR checkout をデフォルト拒否

407文字
2分
編集

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_runworkflow_run.eventpull_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 に解決される

次のような入力は失敗する。

yaml
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 内の gitgh で untrusted な ref を取得して実行する経路、issue_comment など他イベントの pwn request、無関係な第三者リポジトリへの repository: 指定はブロック対象外である。

カバレッジ取得など fork pull request コードの checkout が必要な正当な用途向けに、actions/checkout ステップへ allow-unsafe-pr-checkout 入力でオプトアウトできる。利用前に pull_request_target の安全な使い方を確認し、コードレビューで目立つ名前であることを踏まえて意図的な判断とする。

#参考文献