actionsieve
Multi-platform CI/CD pipeline security scanner. Finds injection vulnerabilities, supply chain risks, and misconfigurations across 10 CI/CD platforms using a pattern-driven detection engine.
What it finds
- Expression injection — untrusted PR/issue data interpolated into
shell commands via
${{ }},$CI_*, or platform equivalents - Supply chain risks — unpinned action/orb/pipe/plugin refs, mutable tags, known-compromised components (advisory database)
- Dangerous triggers —
pull_request_targetwith head checkout,issue_commentwith fork access, and platform equivalents - Secret exposure — static cloud credentials where OIDC is available, secrets logged or leaked through env vars
- Privilege escalation — Docker-in-Docker on shared runners, socket mounts, privileged containers
- Cross-step data flow — taint propagation through
GITHUB_OUTPUT, matrix injection, composite action output laundering - Cache poisoning — cache writes reachable from fork PRs
- Hardening gaps — missing
permissions:blocks, checkout with persisted credentials, unpinned container images
45+ detection patterns, validated against a JSON Schema.
Supported platforms
| Platform | Provider | Detection |
|---|---|---|
| GitHub Actions | github |
Workflows, composite actions, reusable workflows |
| GitLab CI | gitlab |
.gitlab-ci.yml, includes, CI variables |
| Azure Pipelines | azure |
YAML pipelines, template expressions |
| Jenkins | jenkins |
Declarative + scripted pipelines (tree-sitter Groovy AST) |
| CircleCI | circleci |
Config, orbs, dynamic config |
| Bitbucket Pipelines | bitbucket |
Pipelines, pipes, deployment variables |
| Buildkite | buildkite |
Pipeline YAML, plugins, dynamic upload |
| Drone CI | drone |
Pipeline YAML, plugins |
| AWS CodeBuild | codebuild |
buildspec.yml, IAM/secret misconfig |
| Google Cloud Build | cloudbuild |
cloudbuild.yaml, service account config |
Platform is auto-detected from repository structure. Use --platform to
force a specific one.
Install
pip install actionsieve
Or for development:
uv venv
uv pip install -e ".[dev]"
Requires Python 3.12+.
Quick start
Scan a repository for CI/CD security issues:
actionsieve scan .
Output as SARIF for GitHub Code Scanning:
actionsieve scan --format sarif --output results.sarif .
Generate a component inventory (bill of materials):
actionsieve inventory .
Check components against the advisory database:
actionsieve inventory --check .
Scanning modes
Static mode (default)
Scans all pipeline files at a point in time. Every pattern fires based on what's in the definitions. This is the default when running locally.
actionsieve scan .
PR mode (diff-aware)
Scans in the context of a specific change. Findings are filtered or elevated based on which files changed in the PR. Auto-activates in CI environments where trigger and base ref can be detected.
# Explicit changed files
actionsieve scan --changed-files "Dockerfile,src/app.py" .
# From git diff output
git diff --name-only origin/main | actionsieve scan --changed-files - .
# Context file (for scripted/corpus use)
actionsieve scan --context context.yaml .
# Force mode
actionsieve scan --mode pr --changed-files "Dockerfile" .
actionsieve scan --mode static . # disable auto-detection in CI
In PR mode, patterns declare how they interact with the changeset:
- Suppress — finding hidden when no relevant file is in the changeset
(e.g.
docker-in-dockersuppressed when no Dockerfile changed) - Elevate — severity bumped when a relevant file IS in the changeset (e.g. expression injection elevated when workflow file is modified)
- Always — fires identically regardless of changeset (default)
CI auto-detection works for GitHub Actions, GitLab CI, Azure Pipelines, Jenkins, CircleCI, Bitbucket Pipelines, Buildkite, and Drone.
Incremental scanning
Scan only pipeline files changed since a git ref:
actionsieve scan --changed-since main .
actionsieve scan --changed-since abc123 .
This is orthogonal to PR mode — it controls which pipeline files enter the scanner, not how findings are filtered.
Output formats
| Format | Flag | Use case |
|---|---|---|
| JSON | --format json |
Default, machine-readable |
| YAML | --format yaml |
Human-readable |
| SARIF | --format sarif |
GitHub/Azure Code Scanning integration |
| Markdown | --format markdown |
Reports, PR comments |
| OCSF | --format ocsf |
GRC platform integration (Detection Finding 2004) |
| CycloneDX | inventory only | SBOM for dependency tracking |
Environment profiles
Profiles adjust severity based on deployment context. A finding on a public repo with self-hosted runners is more severe than the same finding on a private repo with ephemeral runners.
# Built-in presets
actionsieve scan --profile hosted-public .
actionsieve scan --profile hosted-private .
actionsieve scan --profile self-hosted .
actionsieve scan --profile hardened .
# Custom profile file
actionsieve scan --profile my-profile.yml .
# See effective profile after resolution
actionsieve profile resolve --profile hosted-public
Profiles can suppress categories, elevate patterns, and extend presets.
Online checks
Verify that SHA-pinned actions actually point to the claimed repository:
actionsieve scan --online .
actionsieve inventory --online --check .
Reads GITHUB_TOKEN from the environment, or pass --token.
Forge search
Search an organization's repositories for vulnerable CI/CD patterns:
# Scan all repos in an org
actionsieve search my-org --forge github
# Targeted pattern search
actionsieve search --pattern expr-injection-run --forge github
# GitLab group
actionsieve search my-group --forge gitlab --token $GITLAB_TOKEN
CI integration
Ready-made templates for running actionsieve in CI:
- GitHub Actions —
ci/github/action.yml(composite action with SARIF upload to Code Scanning) - GitLab CI —
ci/gitlab/.gitlab-ci-template.yml(include template) - Azure Pipelines —
ci/azure/actionsieve.yml(step template)
PR mode auto-activates in all three — no configuration needed.
Pattern details
Inspect any pattern's full description, attack scenario, mitigations, and references:
actionsieve explain expr-injection-run
actionsieve explain mutable-action-ref
actionsieve explain docker-in-docker
Exit codes
| Code | Meaning |
|---|---|
| 0 | No findings (or all suppressed) |
| 1 | Findings at medium severity or above (or above --fail-on threshold) |
| 2 | Critical findings |
License
MIT
Metadata
Release files for actionsieve 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| actionsieve-0.1.0.tar.gz | 192.6 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| actionsieve-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 284.3 kB
Release files / actionsieve-0.1.0.tar.gz
| Download URL | actionsieve-0.1.0.tar.gz |
|---|---|
| Size | 192.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
48fccd82c79f93f9d9c28ec1ff90f9cd9856a14c5e003ce18fd5b3756eb9ca9c
|
|
BLAKE2b-256 checksum How to use checksums |
c5d23482d9963335ab5a80e5bedbbaf6005b4db1b15c509cacaa085d7c60e361
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.
Transparency logRelease files / actionsieve-0.1.0-py3-none-any.whl
| Download URL | actionsieve-0.1.0-py3-none-any.whl |
|---|---|
| Size | 91.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
25f6e18919a2751de3429460ed0128fbe75ceb6f4518280e3c974d5d2f16f5d7
|
|
BLAKE2b-256 checksum How to use checksums |
7c640444fcdb71637cd3b2b98e694cbcb351461a88f98314770ffcdccb7b2996
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.
Transparency logSecurity for actionsieve 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for actionsieve-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.