agentleFS
s977043s977043/river-review/skills/downstream/gha-workflow-security/SKILL.md

GitHub Actions Workflow Security Review

Skill7 starsChanged 5 months agoMITView on GitHub

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.

  • Reads credentials

The file

Files
SKILL.md

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: 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 / 出典

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.