v0.1.0 to v0.1.0

1 added, 1 removed. Audit A to A.

---
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: 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`を返す。
- [ ] 差分に `.github/workflows/` 配下の追加変更が含まれている
- [ ] diff コンテキストが利用可能である
- ゲート不成立時の出力: `NO_REVIEW: rr-downstream-gha-workflow-security-001 — workflow の変更なし`
+ ゲート不成立時の出力: `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 / 根拠の取り方
- 指摘は `<file>:<line>` で差分に紐づけ、出典(securitylab.github.com / docs.github.com の secure-use)を 1 行で添える。
- 重要度: untrusted input の `run:` 直挿し / `pull_request_target` + head checkout = critical、permissions 過剰 / public self-hosted = major、tag ピン / persist-credentials = minor。
## Output / 出力(短文版の推奨)
コメントは日本語で返す。
- Finding: インジェクション / pwn request / 過剰権限 / 未ピンのどれか(1文)
- Impact: RCE / secrets 漏えい / 権限昇格
- Fix: env 経由 / トリガー分離 / job 単位 permissions / SHA ピンの最小案
## Sources / 出典
- GitHub — Secure use of GitHub Actions: <https://docs.github.com/en/actions/reference/security/secure-use>
- GitHub Security Lab — Preventing pwn requests: <https://securitylab.github.com/resources/github-actions-preventing-pwn-requests/>
- GitHub Security Lab — Untrusted input: <https://securitylab.github.com/resources/github-actions-untrusted-input/>
- OpenSSF Scorecard checks: <https://github.com/ossf/scorecard/blob/main/docs/checks.md>