← Back

Detection Rules

53 rules across 8 attack classes

Each rule maps to a specific attack pattern against GitHub Actions workflows, ordered by severity within each category.

critical

10

high

17

medium

24

low

2

Injection

6 rules

Shell command injection via expression interpolation in run blocks and reusable workflow inputs.

WRD-101
Expression Injectioncritical

Attacker-controlled GitHub context expressions interpolated in run: blocks allow arbitrary command injection.

Related: WRD-110 (Source variant: composite action inputs) · WRD-111 (Source variant: dispatch inputs) · WRD-113 (Source variant: reusable workflow inputs) · WRD-120 (Source variant: tainted step outputs)
WRD-110
Composite Action Input Injectionhigh

Composite action inputs interpolated directly in run: blocks allow injection when the action is consumed with attacker-controlled values.

Related: WRD-101 (Family: expression injection (composite action source))
WRD-111
Dispatch Input Injectionhigh

workflow_dispatch or repository_dispatch inputs interpolated in run: blocks can be controlled by any user with push access, enabling command injection.

Related: WRD-101 (Family: expression injection (dispatch input source))
WRD-112
GITHUB_ENV/PATH Injectionhigh

Writing attacker-controllable values to GITHUB_ENV or GITHUB_PATH allows environment variable or PATH manipulation in subsequent steps.

WRD-113
Tainted Reusable Workflow Inputshigh

Attacker-controlled values passed as inputs to reusable workflows can cause injection if the called workflow interpolates them unsafely.

Related: WRD-101 (Family: expression injection (reusable workflow source))
WRD-120
Step Output Injectionmedium

Step outputs interpolated in run: blocks may carry attacker-controlled data if a prior step set the output from tainted input.

Related: WRD-101 (Family: expression injection (tainted step output source))

Triggers

3 rules

Dangerous trigger configurations that allow fork-based code execution with elevated privileges.

WRD-201
Dangerous Fork Checkoutcritical

pull_request_target with actions/checkout referencing the PR head checks out untrusted fork code in a privileged context.

WRD-202
Build Tool Execution on Untrusted Codecritical

pull_request_target workflow checks out fork code and executes build tools, allowing arbitrary code execution with write permissions.

WRD-203
Cross-Workflow Privilege Escalationcritical

A workflow_run workflow with write permissions watching a pull_request workflow can be exploited via artifact poisoning for privilege escalation.

Supply Chain

11 rules

Unpinned dependencies, mutable references, and compromised upstream actions.

WRD-301
OIDC Trust Boundary Violationcritical

id-token: write permission with external triggers (pull_request_target, workflow_run, issue_comment) can allow attackers to obtain OIDC tokens and access cloud resources.

WRD-302
Known Vulnerable Actioncritical

Workflow uses a GitHub Action with known security vulnerabilities or that was involved in a supply chain compromise.

Related: WRD-326 (Companion: incident-driven hardcoded denylist (this rule is the CVE-database-driven counterpart))
WRD-310
Impostor Commithigh

Actions pinned to commit SHAs that appear suspicious. Impostor commits can be pushed to a repository via its fork and may not belong to any branch or tag in the original repository.

WRD-320
Unpinned Actionshigh

Third-party actions pinned to mutable tags instead of commit SHAs can be silently replaced with malicious code via tag mutation.

Severity adjusts:mediumGitHub-owned actions (actions/*, github/*)
Related: WRD-322 (Companion: SHA pinned but no version comment) · WRD-323 (Companion: SHA pin with mismatched version comment) · WRD-324 (Companion: pinned to ambiguous branch name) · WRD-326 (Companion: action is on a known-bad denylist)
WRD-326
Forbidden Action Useshigh

Uses an action reference that is on warden's hardcoded denylist due to a known security incident or EOL status.

Related: WRD-302 (Companion: CVE-database-driven check, this rule is the policy/incident-driven counterpart)
WRD-327
Composite Action Internal Unpinnedhigh

A composite or Docker action used by this workflow has unpinned action references inside its own action.yml. SHA-pinning the top-level action does not protect against tag mutation in its internal dependencies, so a compromise of those inner refs still propagates into your workflow.

Related: WRD-320 (Extends: 320 catches unpinned outer uses, 327 descends into pinned composites and flags their unpinned internals)
WRD-321
Archived Action Referencemedium

Detects references to GitHub Actions from known archived or deprecated repositories

WRD-322
Stale Action SHA Pinmedium

Detects actions pinned to a SHA without a version comment, suggesting the pin may be stale or untracked.

Related: WRD-320 (Family: action pinning hygiene) · WRD-323 (Family: SHA pin with mismatched comment)
WRD-323
Ref Version Mismatchmedium

Detects actions where the SHA pin comment version disagrees with the version tag in the uses: reference.

Related: WRD-320 (Family: action pinning hygiene) · WRD-322 (Family: SHA pin missing comment)
WRD-324
Ref Confusionmedium

Detects actions pinned to branch names (main, master, develop, etc.) that are ambiguous and mutable.

Related: WRD-320 (Family: action pinning hygiene)
WRD-325
Runtime Binary Fetchmedium

Detects actions known to download external binaries at runtime. SHA-pinning the action does not protect against compromised upstream binaries or install scripts fetched during execution.

Permissions

4 rules

Overly broad permissions, exposed secrets, and insecure credential handling.

WRD-420
Secrets in Run Blocksmedium

Secrets interpolated directly in run: blocks can leak through process listings, shell history, and error messages. Pass them via environment variables instead.

WRD-421
Network Exfiltration Riskmedium

curl or wget commands in run: blocks that also reference secrets may indicate credential exfiltration.

WRD-422
Debug Logging Enabledmedium

ACTIONS_RUNNER_DEBUG or ACTIONS_STEP_DEBUG is enabled. Debug logging can expose secrets and sensitive information in workflow logs.

WRD-424
Secrets Used Outside Environment Scopemedium

A job references secrets (other than GITHUB_TOKEN) without declaring an `environment:`, so no required-reviewers or deployment protection rules gate the secret access.

AI Security

5 rules

AI tool configuration poisoning, MCP config injection, Dependabot security, and trusted publishing best practices.

WRD-510
AI Config Poisoninghigh

Privileged-context workflow (pull_request_target, workflow_run, or issue_comment) checks out fork code that may contain poisoned AI assistant configuration. Tracks 30+ verified file paths across Claude Code (CLAUDE.md, .claude/rules/), Cursor (.cursorrules, .cursor/rules/), GitHub Copilot (.github/copilot-instructions.md, .github/instructions/), Aider (.aider.conf.yml, CONVENTIONS.md), Continue (.continue/rules/), Windsurf (.windsurf/rules/), Cline (.clinerules/), Gemini CLI (GEMINI.md, .gemini/), OpenAI Codex CLI (.codex/, AGENTS.md), and the cross-tool AGENTS.md standard.

Related: WRD-511 (Family: AI tooling supply-chain (MCP server config variant))
WRD-511
MCP Config Injectionhigh

Privileged-context workflow (pull_request_target, workflow_run, or issue_comment) checks out fork code that may contain malicious Model Context Protocol (MCP) configuration. Tracks 16 verified file paths spanning .mcp.json, mcp_servers.json, .vscode/mcp.json, .cursor/mcp.json, .claude/mcp.json, .claude/mcp_servers.json, claude_desktop_config.json, .continue/mcpServers/, cline_mcp_settings.json and more, enabling detection of tool-server hijacking, secret exfiltration, and silent backdoor injection into AI-generated code.

Related: WRD-510 (Family: AI tooling supply-chain (CLAUDE.md / .cursorrules variant))
WRD-520
Dependabot Cooldownmedium

Detects Dependabot configurations with daily update schedules and no grouping, which can flood PRs

WRD-521
Dependabot Insecure Executionmedium

Detects Dependabot-related workflows that may execute untrusted code from pull requests via pull_request_target

WRD-525
Use Trusted Publishingmedium

Detects PyPI/npm publish workflows using stored API tokens instead of OIDC trusted publishing

Steganography

2 rules

Hidden malicious content using Unicode invisible characters and obfuscation patterns.

WRD-601
Unicode Steganographycritical

Invisible Unicode characters detected in workflow file. These can hide malicious commands, alter string comparisons, or use bidirectional text overrides to disguise code.

WRD-602
Indicator of Compromisecritical

Suspicious patterns that may indicate malicious activity, including obfuscated payloads, reverse shells, and C2 communication.

Integrity

7 rules

Credential persistence, secret inheritance, insecure commands, and remote script execution.

WRD-701
toJSON Secrets Exposurecritical

Detects toJSON(secrets) or secrets.* patterns that expose the entire secrets context, potentially leaking all repository secrets

WRD-711
Secrets Inherithigh

Detects 'secrets: inherit' in reusable workflow calls, which passes all repository secrets to the called workflow

WRD-712
Insecure Commandshigh

Detects ACTIONS_ALLOW_UNSECURE_COMMANDS set to true, which re-enables deprecated set-env and add-path workflow commands

WRD-713
Hardcoded Credentialshigh

Detects hardcoded username or password values in container/services credentials blocks instead of using secrets. Warden checks both username and password fields; some other tools only check password.

WRD-714
Curl Pipe Bashhigh

Detects curl|bash, wget|sh, and similar patterns that execute remote scripts without verification

WRD-710
Artipackedmedium

Detects actions/checkout without persist-credentials: false when artifacts are uploaded. Below checkout v6, the token is stored in .git/config and leaks via uploaded workspaces. v6+ moved it to $RUNNER_TEMP, which is safer but explicit persist-credentials: false is still the recommended hardening.

WRD-720
Unpinned Docker Imagesmedium

Detects container or services image references that are not pinned to a specific @sha256: digest

Logic

15 rules

Conditional logic flaws, self-hosted runner exposure, auto-merge bypasses, and cache poisoning.

WRD-801
Self-Hosted Runner on PRcritical

Detects pull_request triggers combined with self-hosted runners, allowing untrusted PR code to execute on your infrastructure

WRD-810
Confused Deputyhigh

Detects auto-merge or auto-approve patterns without proper authorization checks

WRD-811
Artifact Injectionhigh

Detects workflow_run triggers that download artifacts without verifying the triggering workflow's conclusion

WRD-812
Risky Trigger Default Permissionshigh

Workflow uses a risky trigger (pull_request_target, workflow_run, issue_comment, discussion_comment) without an explicit top-level permissions: block, inheriting the repo default which may grant write access.

Related: WRD-824 (Escalation of: 824 fires medium when any workflow lacks a permissions block, this rule escalates to high when the missing block is paired with a risky trigger)
WRD-820
Unsound Conditionmedium

Detects conditions that are always true: 'if: true', 'if: always()', or self-comparisons like 'github.actor == github.actor'.

Related: WRD-821 (Family: gating-condition flaw (substring match abuse)) · WRD-825 (Family: gating-condition flaw (spoofable identity))
WRD-821
Bypassable Contains Checkmedium

Detects contains() checks on user-controlled input used as authorization gates, which can be trivially bypassed.

Related: WRD-820 (Family: gating-condition flaw (always-true logic)) · WRD-825 (Family: gating-condition flaw (spoofable identity))
WRD-822
Secret Redaction Bypassmedium

Detects patterns that bypass GitHub Actions secret redaction: base64 encoding, character splitting, or file write then cat of secrets

WRD-823
Cache Poisoningmedium

Detects actions/cache usage in release or elevated-permission workflows where a poisoned cache could compromise builds

WRD-824
Excessive Permissionsmedium

Detects write-all permissions, missing permissions blocks, or unnecessary write grants.

Related: WRD-812 (Escalates to high when paired with a risky trigger) · WRD-826 (Companion: undocumented permissions entries)
WRD-825
Spoofable Bot Checkmedium

Detects if-conditions checking github.actor against bot names (dependabot[bot], renovate[bot], github-actions[bot]), which can be spoofed by renaming a user account.

Related: WRD-820 (Family: gating-condition flaw (always-true logic)) · WRD-821 (Family: gating-condition flaw (substring match abuse)) · WRD-810 (Companion: confused-deputy on auto-merge often relies on this same spoofable check)
WRD-826
Undocumented Permissionsmedium

Detects permissions entries that lack an explanatory comment

WRD-827
Superfluous Actionsmedium

Detects setup actions that may be unnecessary because the tool is already pre-installed on GitHub-hosted runners

WRD-828
Obfuscation in Workflowmedium

Detects base64-encoded strings, hex-encoded strings, or decode operations in non-run contexts (env blocks, with: inputs)

WRD-831
Missing Concurrency Limitslow

Detects workflows triggered by push or pull_request that lack a concurrency block, which can lead to resource exhaustion

WRD-833
Anonymous Workflow Definitionlow

Detects workflow files missing a top-level 'name:' key