Read-only auditor for risky or injected GitHub Actions workflow config
Project description
Actions Warden
Read-only auditor for risky or injected GitHub Actions workflow config.
After the 2026 wave of repository-theft attacks, a common post-compromise move
is: steal a token, then inject or tamper with a repo's .github/workflows/ so
CI exfiltrates secrets or runs attacker code. Actions Warden scans those workflow
files for the patterns that enable it.
It does not execute workflows, contact GitHub, modify files, or prove a pipeline is safe.
Install
pipx install actions-warden
# or
pip install actions-warden
Python 3.9+. No runtime dependencies.
Usage
actions-warden /path/to/repo
actions-warden /path/to/repo --json
actions-warden /path/to/repo --report report.json
It scans .github/workflows/*.yml|*.yaml and composite action.yml|action.yaml
files. You can also point it at a single workflow file.
Exit codes:
0: no blocking workflow risks found1: usage or runtime error2: blocking workflow risks found (suitable as a CI gate)
What It Flags
| Rule | Severity | What it catches |
|---|---|---|
secret-exfiltration |
critical | a secret reference alongside an outbound network command |
untrusted-input-injection |
high | attacker-controllable github.event.* / head_ref interpolated into the workflow (shell injection in run steps) |
remote-code-in-run |
high | a downloaded script piped straight into a shell |
pull-request-target-head-checkout |
high | pull_request_target running with secrets while checking out PR-controlled code ("pwn request") |
self-hosted-on-untrusted |
medium | self-hosted runner reachable by external pull requests |
permissions-write-all |
medium | write-all token permissions |
oidc-with-write |
medium | OIDC id-token: write combined with contents: write |
unpinned-action |
low | third-party action pinned to a mutable tag/branch instead of a commit SHA |
The rules are conservative. A finding means "review this workflow," not "this repo is compromised."
Why text-based, not YAML-parsed
A hostile workflow can be written to parse in surprising ways. Actions Warden
inspects what is actually on disk rather than a parser's normalized view, and
stays dependency-free. The tradeoff is coarser context: some file_all rules
flag co-occurrence within a file rather than within a single job.
Scope Limits
This is a narrow CI/CD config scanner. It does not scan dependencies or packages (see a dependency/supply-chain scanner for that), does not resolve reusable or remote workflows, and will not catch every possible injection or obfuscated payload.
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 actions_warden-0.1.0.tar.gz.
File metadata
- Download URL: actions_warden-0.1.0.tar.gz
- Upload date:
- Size: 12.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aa9764bbe943059a4eb697d51887c09a6c2bc701591067faea10d3102786e2a6
|
|
| MD5 |
49a57a33c7a84d9a9f3f76b3111d3c5f
|
|
| BLAKE2b-256 |
0d8419ced0e2d690fbbb6141f8840d2de0e16f5d5d1652b02117b473a7ae8035
|
Provenance
The following attestation bundles were made for actions_warden-0.1.0.tar.gz:
Publisher:
publish.yml on Dragon-Lady/actions-warden
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
actions_warden-0.1.0.tar.gz -
Subject digest:
aa9764bbe943059a4eb697d51887c09a6c2bc701591067faea10d3102786e2a6 - Sigstore transparency entry: 1786008587
- Sigstore integration time:
-
Permalink:
Dragon-Lady/actions-warden@522df2963e4571e4b35efca3de726f677ea9a062 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Dragon-Lady
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@522df2963e4571e4b35efca3de726f677ea9a062 -
Trigger Event:
release
-
Statement type:
File details
Details for the file actions_warden-0.1.0-py3-none-any.whl.
File metadata
- Download URL: actions_warden-0.1.0-py3-none-any.whl
- Upload date:
- Size: 10.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
775c92c42c6bd71170e997091012561439c73d5d56729bbad2721d39d870b9cf
|
|
| MD5 |
b7e2e5872a595727e5e7f838046f6d05
|
|
| BLAKE2b-256 |
bd24bd1509ec3fa309e58080b2196f5a7edb5fb022905294065b704017df8b00
|
Provenance
The following attestation bundles were made for actions_warden-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on Dragon-Lady/actions-warden
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
actions_warden-0.1.0-py3-none-any.whl -
Subject digest:
775c92c42c6bd71170e997091012561439c73d5d56729bbad2721d39d870b9cf - Sigstore transparency entry: 1786008852
- Sigstore integration time:
-
Permalink:
Dragon-Lady/actions-warden@522df2963e4571e4b35efca3de726f677ea9a062 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Dragon-Lady
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@522df2963e4571e4b35efca3de726f677ea9a062 -
Trigger Event:
release
-
Statement type: