GitHub Actions: pull_request_target で PR のコードを checkout してビルドしない
pull_request_target はベースリポジトリの権限と secrets を持つ。ここに PR ブランチを明示 checkout して npm install / ビルドすると、フォーク作者のコードが高い権限で実行され、リポジトリ侵害につながる。
危険なパターン
yaml
on:
pull_request_target:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }} # ← 攻撃者のコード
- run: npm install && npm test # postinstall / テストで任意コード実行可安全な使い分け
| やりたいこと | 推奨 |
|---|---|
| ラベル付け・コメントだけ(コードを走らせない) | pull_request_target 可。デフォルト checkout(ベース側)のまま |
| ビルド・テストなどコード実行 | pull_request(フォークからは write/secrets なし) |
| テスト結果を privileged に反映 | まず pull_request で artifact 保存 → workflow_run で読み取り・コメント(GitHub Actions: workflow_run でCI成功後にだけCDを起動する) |
一時しのぎと落とし穴
safe to testラベル条件はレビュー後実行の一時策だが、ラベル後に攻撃者がコミットを足す競合がある。恒久策に置き換える。- 修正前に開いていた PR は、当時の脆弱なワークフロー定義のまま動く。修正後は該当 PR を close / rebase する。
出典
- @t6adev 2026-05-12: @t6adev · 2026-05-12
- GitHub Security Lab: securitylab.github.com