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.
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
- Find
aws-actions/configure-aws-credentialsin workflows - Extract role ARNs and credential patterns
- Match roles to IAM policies in Terraform or JSON files
- Classify IAM actions using the
policy-sentryaction database - Detect privilege escalation paths
- Check for known-compromised actions in the bundled database
- 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
- CLI reference
- OIDC trust policy analysis
- Known-compromised actions database
- SARIF and GitHub Security tab
- AWS verification permissions
Contributing
See CONTRIBUTING.md for setup instructions.
New to the codebase? Start with a good first issue.
The most impactful contributions right now:
- Add IAM actions to the risk database
- Add compromised action entries when a new supply-chain attack happens
- Add test fixtures from real-world workflows, anonymized
- Improve error messages when policies are missing
Built By
Rishabh Singh.
ActionScope performs static analysis by default. It does not transmit your code or credentials to any external service.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
08c2a774fd4542926fc4a7ed2b08e6c7ef1082b37c2c775f62d88823572f0b7c
|
|
| MD5 |
a804f85b025b96372975cb9b66c5b84c
|
|
| BLAKE2b-256 |
c5368598fff8be16ee59d2e39e4e7df9366b734a3934c8eb232938ba811a0d5d
|
Provenance
The following attestation bundles were made for actionscope-0.3.0.tar.gz:
Publisher:
release.yml on r12habh/ActionScope
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
actionscope-0.3.0.tar.gz -
Subject digest:
08c2a774fd4542926fc4a7ed2b08e6c7ef1082b37c2c775f62d88823572f0b7c - Sigstore transparency entry: 1614525971
- Sigstore integration time:
-
Permalink:
r12habh/ActionScope@de0e17af454097705641d9a067e59837abcac0e1 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/r12habh
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@de0e17af454097705641d9a067e59837abcac0e1 -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
46e2bbe9f5a3e1167eab6690bbe16538ff94ae41ae9fbda65e9e49a482b9f41d
|
|
| MD5 |
af40c9dc7543ad65c01a66a045e6f97c
|
|
| BLAKE2b-256 |
2be3626e6a0a7e73e05165522a6ee176ed99c174f91657eb33a4ccff8d5daa4b
|
Provenance
The following attestation bundles were made for actionscope-0.3.0-py3-none-any.whl:
Publisher:
release.yml on r12habh/ActionScope
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
actionscope-0.3.0-py3-none-any.whl -
Subject digest:
46e2bbe9f5a3e1167eab6690bbe16538ff94ae41ae9fbda65e9e49a482b9f41d - Sigstore transparency entry: 1614526005
- Sigstore integration time:
-
Permalink:
r12habh/ActionScope@de0e17af454097705641d9a067e59837abcac0e1 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/r12habh
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@de0e17af454097705641d9a067e59837abcac0e1 -
Trigger Event:
push
-
Statement type: