GitHub Actions の pull_requestpull_request_target イベントの存在についてわかりにくいのでメモ。

GitHub の詳しい解説は下記。

Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests | GitHub Security Lab

pull_request_target の間違った使用は危険だよ、と警鐘を鳴らす。

  • pull_request_targetは fork repoにも書き込み権限・Secretsを渡す
  • pull_request は fork repo に書き込み権限・Secretsは渡さない

下記のワークフローfork先をチェックアウトした後に実行しているnpm install or npm buildが危険。なぜなら npm install or npm build の実行時に untrusted なコードが実行されるリスクがあるから。

# INSECURE. Provided as an example only.
on:
  pull_request_target

jobs:
  build:
    name: Build and test
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
      with:
        ref: ${{ github.event.pull_request.head.sha }}
    - uses: actions/setup-node@v1
    - run: |
        npm install
        npm build
    - uses: completely/fakeaction@v2
      with:
        arg1: ${{ secrets.supersecret }}
    - uses: fakerepo/comment-on-pr@v1
      with:
        message: |
          Thank you!

ただ、fork先のコードをチェックアウトしてコードをフォーマットする、diffを取る、grep検索する、などのユースケースにおいてはuntrustedなコード実行は伴わないので使用してOK。

  • Secret にアクセス不要な場合はpull_request_target を使うのは避けること
  • pull_request and workflow_run の組み合わせで権限を渡すワークフローを切り分けること