-
Notifications
You must be signed in to change notification settings - Fork 0
GitHub Actions
github-actions[bot] edited this page Aug 5, 2026
·
1 revision
scan statically inspects your .github/workflows/*.yml files for the risky
patterns behind the CI supply-chain incidents (tj-actions, Codecov, the
poisoned-pipeline class). It's a pure text/line analysis — no YAML parse — so
templated or unusual workflows don't break it, and it needs nothing but the
files already in your repo.
This runs automatically as part of scan (and system inspect --deep);
there is no separate flag.
| Check | Severity | Why it matters |
|---|---|---|
Action pinned to a mutable branch (uses: x@main) |
Medium | a branch is trivially repointed — the tj-actions vector (CVE-2025-30066) |
| Third-party action not pinned to a commit SHA (tag) | Low | tags are repointable; pin a full SHA |
pull_request_target / workflow_run trigger |
Medium | runs in a privileged context with repo secrets |
| …the same trigger + a checkout of the PR head | High | runs untrusted PR code with secrets — poisoned-pipeline execution |
Untrusted ${{ github.event.* }} in a run: step |
High | expression injection into a shell step |
permissions: write-all |
Medium | the GITHUB_TOKEN is over-scoped |
runs-on: self-hosted |
Medium | untrusted workflow code runs inside your network |
curl … | sh in a step |
High | pipes a remote script straight to a shell (the Codecov pattern) |
An official action on a version tag (actions/checkout@v4), a local action
(./…), a docker:// image, or a commit-SHA-pinned action is not flagged.
-
Pin actions by commit SHA, not a tag or branch:
uses: actions/checkout@11bd719…(a comment can note the version). - Avoid
pull_request_targetunless you understand the risk; never check out and execute the PR head in that context. - Never interpolate
${{ github.event.<user-controlled> }}intorun:; pass it through anenv:variable and reference"$VAR"instead. - Set least-privilege
permissions:per job. - Prefer GitHub-hosted runners; isolate self-hosted ones and make them ephemeral.
Findings appear in the scan report under the sensitive_api category
and feed the same CI gate as every other finding.