| id | gha-workflow-security |
| name | GitHub Actions Workflow Security Review |
| description | Reviews GitHub Actions workflow diffs for script injection of untrusted input, pull_request_target with untrusted checkout, over-broad GITHUB_TOKEN permissions, and unpinned third-party actions. |
| version | 0.1.0 |
| category | downstream |
| phase | ["midstream","downstream"] |
| applyTo | [".github/workflows/**/*.{yml,yaml}"] |
| tags | ["github-actions","security","ci","supply-chain","downstream"] |
| severity | major |
| inputContext | ["diff"] |
| outputKind | ["findings","questions"] |
| modelHint | high-accuracy |
Pattern declaration
Primary pattern: Reviewer
Secondary patterns: Inversion
Why: workflow の意味的なセキュリティ判断(権限の必要性・トリガーの用途)に集中し、決定論ツールが見ない文脈を検査する
Goal / 目的
- untrusted input の式展開によるスクリプトインジェクションと、特権トリガー + untrusted checkout(pwn request)を検出する。
- GITHUB_TOKEN の過剰権限と third-party action の未ピン留めを検出する。
Non-goals / 扱わないこと
- 構文的に決定論で判定できる領域(pinned-dependencies / token-permissions の機械検出)は OpenSSF Scorecard / zizmor / CodeQL に委ねる(重複指摘しない)。
- workflow のロジック・効率(セキュリティ以外)。
Pre-execution Gate / 実行前ゲート
このスキルは以下の条件がすべて満たされない限りNO_REVIEWを返す。
ゲート不成立時の出力: NO_REVIEW: gha-workflow-security — workflow の変更なし
False-positive guards / 抑制条件
- 同一 repo / 自 org 内 action(
./.github/actions/...、自 org reusable workflow)はピン留め不要とする運用が一般的。minor 以下に留める。
actions/* 公式 action の tag 運用は third-party より低リスク。minor 扱い。
if: 条件式内の式展開、github.event.*.number / github.sha / github.actor 等の数値・制約付きフィールドは原則安全。
- checkout なし、または base ref checkout のみの
pull_request_target は安全パターン。
- repo 可視性が不明な self-hosted runner は major でなく warning + 確認依頼にする。
Rule / ルール
- 攻撃者制御フィールド(
github.event.issue.title/.body、pull_request.title/.body/.head.ref、comment.body、commits.*.message、github.head_ref 等)を run: に直接式展開しない。env: 経由で変数化する。
pull_request_target / issue_comment / workflow_run で head.sha / head.ref を checkout して PR 由来コードを実行しない(secrets + write 権限の文脈での RCE)。
permissions は top-level を contents: read にし、write は必要な job 単位で昇格する(write-all を避ける)。
- third-party action は full-length commit SHA でピン留めする(バージョンコメント併記を推奨)。
Evidence / 根拠の取り方
- 指摘は で差分に紐づけ、出典(securitylab.github.com / docs.github.com の secure-use)を 1 行で添える。