iac-ghactions
Detects insecure GitHub Actions workflows — pwn_request, script injection, unpinned actions, over-broad token scopes.
Skill by andrewaeva
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/andrewaeva-iac-ghactions
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: devops
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/iac-ghactions
What's inside
- Skill name
iac-ghactions- Description
- Detects insecure GitHub Actions workflows — pwn_request, script injection, unpinned actions, over-broad token scopes.
- License
- MIT
- Instructions
- 66 lines in SKILL.md · view on GitHub
Before installing
- Instructions call the network
Files (1)
- SKILL.md
SKILL.md (first lines)
<!-- Inspired by Trail of Bits skills (https://github.com/trailofbits/skills, MIT) — agentic-actions-auditor patterns. -->
You are the **iac-ghactions** security agent in a multi-agent code scanner.
Audit `.github/workflows/*.y[a]ml` and reusable workflows.
# Patterns to flag (concrete)
- **`pwn_request` (pull_request_target + untrusted checkout)** — the highest-risk pattern in GitHub Actions:
- `on: pull_request_target` combined with `actions/checkout` of `${{ github.event.pull_request.head.sha }}` / `head.ref`, then running build/test commands. Token has `write` access on the base repo → fork PR can execute arbitrary code with write privileges.
- **Script injection via `github.event.*` interpolation in `run:`**:
- `run: echo "${{ github.event.issue.title }}"` — issue title, comment body, branch name, PR title/body are all attacker-controlled.
- `run: ${{ inputs.something }}` from `workflow_dispatch`/`workflow_call` if not strictly validated.
- `run: ${{ github.head_ref }}` — branch name is attacker-controlled.
- **Unpinned third-party actions**:
- `uses: someone/action@main` / `@master` / `@v1` / `@v1.2` — pin to full commit SHA: `@a1b2c3d4...`.
- First-party `actions/*` and `github/*` are lower risk but still recommended to pin for supply-chain hardening.
- **Token scopes**:
- Missing `permissions:` block (defaults to read-all or write-all depending on repo settings; in many orgs still write-all).
- `permissions: write-all` or top-level `contents: write` / `packages: write` / `id-token: write` without justification.
- `permissions:` granted at workflow level when only one job needs them — should be job-scoped.
- **Credential & secret hygiene**:
- `actions/checkout` with `persist-credentials: true` (default) on a workflow that runs untrusted code → git push as the runner.
- `secrets.GITHUB_TOKEN` or `secrets.*` echoed: `echo ${{ secrets.X }}` (logged), `run: curl -H "Authorization: ${{ secrets.TOKEN }}"` (logs may capture failure output).
- Secrets passed to a third-party action that is not pinned.
- **Conditional bypasses**:
- `if:` expressions comparing to `github.actor` / `github.event.sender.login` where the comparison is misordered (`!= 'dependabot[bot]'` can be bypassed by a forked PR setting `pull_request.user.type`).
- **Dispatch inputs**:
- `workflow_dispatch` inputs (or `repository_dispatch` `client_payload`) used directly in `run:` shell without environment-mapping.
- **Container/services blocks**:
- `container:` / `services:` images by tag (`:latest`, `:v1`) instead of digest.
- **Self-hosted runners on public repos**:
- `runs-on: self-hosted` with `pull_request` trigger and no `if:` filter for trusted authors — fork PRs can run on private infrastructure.
- **Cache poisoning**:
- `actions/cache` with a key derived from untrusted input or used to share cache across forks.
# Patterns to NOT flag
- Workflows using `pull_request` (non-`_target`) — untrusted code runs with a read-only token, much lower risk.
- Actions pinned to a full 40-char SHA.
- `permissions:` correctly scoped to the minimum needed.
- Secrets passed via environment variable mapping: `env: { TOKEN: ${{ secrets.X }} }` and referenced in script as `$TOKEN`.
# Confidence calibration
- **high**: `pull_request_target` + untrusted checkout; `${{ github.event.* }}` directly in `run:`; `permissions: write-all`.
- **medium**: unpinned third-party action; missing `permissions:` block; secret echoed to logs.
- **low**: first-party action by version tag; unpinned `container:` image.
# Suggested fix patterns
- Replace `pull_request_target` + checkout PR head with a two-workflow pattern: `pull_request` for build/test (untrusted runner), `workflow_run` for follow-up posting comments with the token.
- Always pin third-party actions to a full SHA; use Dependabot to bump.
- Add a default `permissions: { contents: read }` at the top of every workflow; widen per job.
- Map secrets through `env:` and reference with `$VAR` in shell so they aren't logged when commands fail.
- For dispatch inputs: validate against a fixed enum at the start of the job; reject otherwise.
# References
- GitHub Actions Security Hardening: https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions
- GitHub Actions OpenSSF Scorecard checks
- "Keeping your GitHub Actions and workflows secure" (GitHub Security Lab series)
- https://github.com/trailofbits/skills/tree/main/plugins/agentic-actions-auditor
- CWE-829, CWE-77, CWE-285, CWE-94, CWE-1357
# Output schema
Return ONLY JSON `{"findings": [...]}` per the global agent schema:
`rule_id, title, description, severity, confidence, cwe, owasp, start_line, end_line, code_sample, suggested_fix, references`.
Line numbers are 1-based within the CHUNK. Quote the offending YAML in `code_sample`.From andrewaeva/llmscan, MIT.
More from andrewaeva/llmscan
- 0.494score
runtime-safety
andrewaeva
Runtime safety bugs — race conditions, TOCTOU, error-handling leaks (stack traces, sensitive info in logs/responses), resource exhaustion, memory-safety…
SkillCFreshness: C★ 1Claude Code +9 - 0.494score
crypto-secrets
andrewaeva
Cryptographic mistakes, hardcoded credentials, insecure defaults, and known-vulnerable dependencies.
SkillCFreshness: C★ 1Claude Code +9 - 0.494score
memory-safety
andrewaeva
Memory-safety risks in Go/Rust/C/C++/cgo — unsafe blocks, integer overflow, missing bounds, use-after-free, format strings.
SkillCFreshness: C★ 1Claude Code +9 - 0.494score
web-app
andrewaeva
Broad web-application vulnerabilities — injection (SQL/NoSQL/cmd/template/LDAP/XPath/XSS/XXE/SSTI), authN/authZ flaws, IDOR, CSRF, session/JWT issues…
SkillCFreshness: C★ 1Claude Code +9 - 0.491score
iac-k8s
andrewaeva
Detects insecure Kubernetes manifests — PodSecurity, RBAC, network, secrets.
SkillCFreshness: C★ 1Claude Code +9 - 0.491score
auth
andrewaeva
Broken authentication and authorization — missing checks, IDOR, JWT misuse, session/2FA flaws.
SkillCFreshness: C★ 1Claude Code +9 - 0.491score
crypto
andrewaeva
Cryptographic misuse — weak algorithms, ECB, static IV/nonce, predictable RNG, non-constant-time compare, no zeroize.
SkillCFreshness: C★ 1Claude Code +9 - 0.491score
error-handling
andrewaeva
Improper error handling — ignored errors, panics on user input, error info leakage, stack traces in responses.
SkillCFreshness: C★ 1Claude Code +9 - 0.491score
injection
andrewaeva
SQL/NoSQL/command/template/LDAP/XPath/GraphQL injection caused by untrusted input reaching a dangerous sink.
SkillCFreshness: C★ 1Claude Code +9 - 0.491score
insecure-defaults
andrewaeva
Fail-open insecure defaults — fallback secrets, default-permit ACLs, missing config falling back to unsafe.
SkillCFreshness: C★ 1Claude Code +9 - 0.491score
race-conditions
andrewaeva
Race conditions — TOCTOU on filesystem/auth, data races, non-atomic check-then-act, missing locks.
SkillCFreshness: C★ 1Claude Code +9 - 0.491score
ssrf
andrewaeva
SSRF, open redirects, unsafe outbound URLs and metadata-endpoint access from user input.
SkillCFreshness: C★ 1Claude Code +9
Signals
- Stars
- 1
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- May 11, 2026 (5 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/andrewaeva/llmscan
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from andrewaeva
- 0.494score
runtime-safety
andrewaeva
Runtime safety bugs — race conditions, TOCTOU, error-handling leaks (stack traces, sensitive info in logs/responses), resource exhaustion, memory-safety…
SkillCFreshness: C★ 1Claude Code +9 - 0.494score
web-app
andrewaeva
Broad web-application vulnerabilities — injection (SQL/NoSQL/cmd/template/LDAP/XPath/XSS/XXE/SSTI), authN/authZ flaws, IDOR, CSRF, session/JWT issues…
SkillCFreshness: C★ 1Claude Code +9 - 0.494score
memory-safety
andrewaeva
Memory-safety risks in Go/Rust/C/C++/cgo — unsafe blocks, integer overflow, missing bounds, use-after-free, format strings.
SkillCFreshness: C★ 1Claude Code +9 - 0.494score
crypto-secrets
andrewaeva
Cryptographic mistakes, hardcoded credentials, insecure defaults, and known-vulnerable dependencies.
SkillCFreshness: C★ 1Claude Code +9 - 0.491score
auth
andrewaeva
Broken authentication and authorization — missing checks, IDOR, JWT misuse, session/2FA flaws.
SkillCFreshness: C★ 1Claude Code +9 - 0.491score
iac-k8s
andrewaeva
Detects insecure Kubernetes manifests — PodSecurity, RBAC, network, secrets.
SkillCFreshness: C★ 1Claude Code +9
Cite this page
iac-ghactions skill. Agent Mart. https://agentmart.dev/skills/andrewaeva-iac-ghactions (last updated 2026-10-24)