Skip to main content

Map the AWS blast radius of GitHub Actions workflows

Project description

ActionScope

Map the AWS blast radius of your GitHub Actions workflows. One command. No AWS credentials required. Instant plain-English results.

PyPI version PyPI downloads CI License: MIT GitHub Marketplace

Your GitHub Actions workflows hold AWS credentials. Do you know what they can do?

ActionScope reads your .github/workflows/ files, Terraform IAM resources, and JSON IAM policies, then tells you in plain English what your CI/CD pipeline can do in AWS if it is compromised.

It also detects:

  • ๐Ÿšจ Known-compromised actions (actions-cool, tj-actions, trivy-action)
  • ๐Ÿ”“ OIDC trust policy misconfigurations (wildcard org subjects, missing sub/aud)
  • ๐Ÿ’‰ Script injection (PR titles, issue bodies in run: blocks)
  • ๐ŸŽญ Artifact poisoning (workflow_run + untrusted artifact execution)
  • ๐Ÿค– AI agent prompt injection surfaces (Claude Code, Copilot in CI)
  • ๐Ÿ“Œ Unpinned actions with SHA resolution

Install

pip install actionscope

Quick Start

# Scan your repo (static analysis: no AWS credentials needed)
actionscope scan .

# Verify live AWS permissions (read-only IAM calls)
actionscope scan . --aws-verify

# Resolve unpinned tags to SHAs
actionscope scan . --resolve-pins

# Save state for PR delta comparison
actionscope scan . --save-state

Example Output

ActionScope โ€” Blast Radius Report
Path: /my-repo  |  Workflows: 2  |  Overall Risk: ๐Ÿ”ด CRITICAL

โ›” KNOWN COMPROMISED ACTIONS (1 found)
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ›” CRITICAL: actions-cool/issues-helper@v3 (issue-triage.yml)
   Compromised 2026-05-18 โ€” mutable tags may run credential-stealing code
   Fix: Remove this action or pin to a verified pre-compromise SHA

โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€

deploy.yml โ†’ deploy โ†’ Configure AWS credentials
  AWS Role: arn:aws:iam::123456789012:role/github-deploy-role
  Auth: OIDC โœ“

  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚ iam:PassRole                โ”‚ Permissions mgmt   โ”‚ ๐Ÿ”ด CRIT  โ”‚
  โ”‚ ec2:TerminateInstances      โ”‚ Write              โ”‚ ๐ŸŸ  HIGH  โ”‚
  โ”‚ s3:GetObject                โ”‚ Read               โ”‚ ๐ŸŸข LOW   โ”‚
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

  ๐Ÿ”ด Privilege Escalation Path: iam:PassRole on * โ€” can escalate to any role

Use as a GitHub Action

name: ActionScope Security Scan
on: [push, pull_request]

permissions:
  contents: read
  security-events: write   # for SARIF upload
  pull-requests: write     # for PR comments

jobs:
  actionscope:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: r12habh/ActionScope@v0
        with:
          fail-on: high          # fail CI if HIGH or above
          comment-pr: true       # post findings as PR comment
          upload-sarif: true     # show in GitHub Security tab
          resolve-pins: true     # suggest SHA pins for unpinned actions

What Makes ActionScope Different

ActionScope answers a question no other tool answers:

"This workflow assumes this IAM role. If the workflow is compromised, what can an attacker actually do in your AWS account?"

Capability actionlint zizmor Scorecard ActionScope
Workflow syntax validation โœ… Partial โŒ Partial
Security pattern detection โŒ โœ… โœ… โœ…
GITHUB_TOKEN permission review โŒ โœ… โœ… โœ…
Unpinned action detection โŒ โœ… โœ… โœ…
Known-compromised action detection โŒ โŒ โŒ โœ…
AWS credential source detection โŒ โŒ โŒ โœ…
Workflow โ†’ IAM role correlation โŒ โŒ โŒ โœ…
Live AWS IAM policy verification โŒ โŒ โŒ โœ…
Blast radius in plain English โŒ โŒ โŒ โœ…
OIDC trust policy analysis โŒ โŒ โŒ โœ…
Script injection detection โŒ Partial โŒ โœ…
SARIF / GitHub Security tab โŒ โœ… โœ… โœ…

How It Works

ActionScope performs static analysis only by default. It never sends your code to an external service and does not require AWS credentials unless you explicitly enable live AWS verification.

.github/workflows/*.yml
terraform/**/*.tf          โ†’  ActionScope  โ†’  Blast Radius Report
policies/**/*.json                              + PR Comment
                                                + SARIF โ†’ GitHub Security Tab
  1. Find aws-actions/configure-aws-credentials in workflows
  2. Extract role ARNs and credential patterns
  3. Match roles to IAM policies in Terraform or JSON files
  4. Classify IAM actions using the policy-sentry action database
  5. Detect privilege escalation paths
  6. Check for known-compromised actions in the bundled database
  7. Output a plain-English blast radius report

Live AWS Verification (--aws-verify)

pip install actionscope[aws]
actionscope scan . --aws-verify

Requires read-only IAM permissions: iam:GetRole, iam:ListAttachedRolePolicies, iam:GetPolicy, iam:GetPolicyVersion, iam:ListRolePolicies, iam:GetRolePolicy.

See docs/aws-verify-permissions.md for the minimal required policy.

Security Detectors

๐Ÿšจ Known-Compromised Actions

Checks workflows against a curated database of GitHub Actions with documented supply chain compromises. Updated with each ActionScope release.

Current entries: actions-cool/issues-helper (2026-05-18), actions-cool/maintain-one-comment (2026-05-18), tj-actions/changed-files (2025-03-19), and aquasecurity/trivy-action (2026-03-19).

๐Ÿ”“ OIDC Trust Policy Analysis

Detects wildcard org subjects, missing sub/aud conditions, and insufficient branch/environment scoping in GitHub OIDC trust policies.

๐Ÿ’‰ Script Injection Detection

Finds direct interpolation of attacker-controlled GitHub context values (github.event.pull_request.title, github.event.issue.body, etc.) into run: shell blocks: the "Pwn Request" attack class.

๐ŸŽญ Artifact Poisoning Detection

Identifies workflow_run workflows that download and execute artifacts from potentially untrusted fork PR workflows with secret access.

๐Ÿค– AI Agent Prompt Injection Surface

Detects Claude Code, GitHub Copilot Agent, Gemini CLI and similar AI coding agents configured with write permissions in untrusted PR contexts.

๐Ÿ“Œ Action Pinning + SHA Resolution

Detects unpinned actions and resolves tags to current SHAs via the GitHub API. Distinguishes full SHAs (safe) from short SHAs (still mutable) and tags.

โšก IAM Privilege Escalation Paths

Detects documented escalation paths including PassRole, CreatePolicyVersion, AttachRolePolicy, CreateAccessKey, Lambda+PassRole, EC2+PassRole, CloudFormation+PassRole, and more.

Research

ActionScope is backed by an empirical study of 493 public GitHub repositories and 3,981 GitHub Actions workflow files using AWS.

Finding Result
Using static AWS keys (not OIDC) 58.2% of repos
Using unpinned external actions 95.5% of repos
pull_request_target + write permissions 8.1% of repos
Exposing role ARNs directly in workflows 44.0% of repos

โ†’ Full research findings | Scanner and anonymized dataset

Output Formats

actionscope scan . --output-format terminal   # default: colored Rich output
actionscope scan . --output-format json       # for CI integration
actionscope scan . --output-format markdown   # for PR comments
actionscope scan . --output-format sarif      # for GitHub Security tab

Documentation

Contributing

See CONTRIBUTING.md for setup instructions.

New to the codebase? Start with a good first issue.

The most impactful contributions right now:

  1. Add IAM actions to the risk database
  2. Add compromised action entries when a new supply-chain attack happens
  3. Add test fixtures from real-world workflows, anonymized
  4. Improve error messages when policies are missing

Built By

Rishabh Singh.

GitHub


ActionScope performs static analysis by default. It does not transmit your code or credentials to any external service.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

actionscope-0.3.0.tar.gz (87.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

actionscope-0.3.0-py3-none-any.whl (81.5 kB view details)

Uploaded Python 3

File details

Details for the file actionscope-0.3.0.tar.gz.

File metadata

  • Download URL: actionscope-0.3.0.tar.gz
  • Upload date:
  • Size: 87.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for actionscope-0.3.0.tar.gz
Algorithm Hash digest
SHA256 08c2a774fd4542926fc4a7ed2b08e6c7ef1082b37c2c775f62d88823572f0b7c
MD5 a804f85b025b96372975cb9b66c5b84c
BLAKE2b-256 c5368598fff8be16ee59d2e39e4e7df9366b734a3934c8eb232938ba811a0d5d

See more details on using hashes here.

Provenance

The following attestation bundles were made for actionscope-0.3.0.tar.gz:

Publisher: release.yml on r12habh/ActionScope

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file actionscope-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: actionscope-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 81.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for actionscope-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 46e2bbe9f5a3e1167eab6690bbe16538ff94ae41ae9fbda65e9e49a482b9f41d
MD5 af40c9dc7543ad65c01a66a045e6f97c
BLAKE2b-256 2be3626e6a0a7e73e05165522a6ee176ed99c174f91657eb33a4ccff8d5daa4b

See more details on using hashes here.

Provenance

The following attestation bundles were made for actionscope-0.3.0-py3-none-any.whl:

Publisher: release.yml on r12habh/ActionScope

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page