Product · CI/CD

Your pipelines are code.So we read them.

Static analysis on your workflow files. Injection, unpinned actions, over-privileged tokens, OIDC drift.

What the scanner catches06

Six pipeline flaws in the file.

We parse your workflows into an AST and a dataflow graph, then run our own rule packs.

Workflow injection (CWE-77 / 78)

Any time you interpolate ${{ github.event.* }}, branch names, PR titles or issue bodies into a `run:` block, you're shell-injecting your own pipeline. The scanner taints every untrusted input and follows it through every step until it lands in a shell, even across composite actions.

Unpinned and untrusted actions

@v3, @main, @latest, every floating ref is a future supply-chain incident. The scanner flags every action not pinned to a full SHA, every action from an unverified publisher, and cross-references against the malicious-action feed.

Over-privileged tokens

Default GITHUB_TOKEN scopes are `write` to almost everything. We detect unset `permissions:`, broad scopes you don't use, and recommend the minimal set per job.

OIDC trust misconfigurations

AWS, Azure and GCP federated identity from GitHub, GitLab and CircleCI. We catch overly broad `sub` patterns, missing audience checks and trust policies that any fork can assume.

Secret leakage patterns

`echo $SECRET`, secrets passed as positional args, secrets logged to artefacts, secrets baked into container layers. Detected statically, before the runner emits a single line.

Cache and artefact poisoning

Untrusted PRs writing to caches that protected branches read from. Self-hosted runner reuse without isolation. Artefact uploads from untrusted contexts. The whole class of post-2024 cache-poisoning CVEs.

Why a static scanner

Catch the misconfig before the runner runs.

Most pipeline incidents are already visible in the YAML. We read it the way an attacker does.

Pipelines as a first-class asset

Workflow files get the same scrutiny as your application code: AST parsing, taint propagation, source-to-sink analysis. The threat model is pipeline-specific: untrusted triggers, action sources, token scopes, OIDC trust, runner isolation.

GitHub Actions, GitLab CI, Jenkinsfile

First-class parsers for the CI dialects that ship most pipelines today, including reusable workflows, GitLab `include:` chains and Jenkinsfile (declarative and scripted Groovy). New dialects ship on demand.

Findings flow to the PR

Every finding lands as an inline comment on the offending YAML line, same surface as SAST. No new dashboard to learn, no separate triage queue, no privileged runner step to install.

How the scanner runs

Connect the repo, the rest is automatic.

Connect GitHub or GitLab. Our scanners pull the pipeline files and run on every push (or on demand). Nothing to install in your CI, no privileged runner step. Findings flow into the unified dashboard and into your PR review.

Browse all integrations
FAQ

Frequently asked about the CI/CD scanner.

You scan my pipeline files, not as a step inside my pipeline?

Correct. Connect the repo once. Our scanners read .github/workflows, .gitlab-ci.yml, Jenkinsfile and the rest directly, then report findings as inline comments on the offending line and in the unified dashboard. No step to add to your pipeline, no privileged runner to install.

Which pipeline file formats do you parse?

GitHub Actions workflows (including composite and reusable workflows), GitLab CI YAML (including `include:` chains) and Jenkinsfile (declarative and scripted Groovy). Action definitions (action.yml plus Dockerfile-action wrappers) are read too, so cross-action taint flows are tracked. Other dialects are added on customer demand.

How do you find workflow injection if it only triggers on specific event payloads?

We don't need the payload. We taint every value that comes from `github.event.*`, `inputs.*`, `head_ref`, `pull_request.title/body`, branch and tag refs from a fork, and follow it across `env:`, `with:`, output values and composite-action boundaries. If the tainted value reaches a `run:` block, an `eval` in JavaScript actions, or a shell-substituted command, that is a finding, regardless of whether you've actually been exploited yet.

Do you catch malicious or typo-squatted GitHub Actions?

Yes. Every `uses:` entry is cross-referenced against the OpenSSF malicious-action feed, the verified-publisher list and our own typo-squat heuristics on action names. Unpinned tags flag separately, because even a legitimate action becomes a supply-chain risk if you don't pin to a SHA.

What about secrets in workflow files?

Anything matching the entropy and provider patterns from our Secret Detection rule pack is flagged in CI/CD files too. We also detect secrets passed as positional CLI args (visible in `ps`), secrets logged via `echo`, and secrets baked into reusable workflow inputs. Findings deduplicate with the secrets scanner so you don't get them twice.

Can you scan self-hosted runner configurations?

Yes. We parse `runs-on:` directives, detect runners with shared filesystem state across untrusted PRs, flag missing `actions/cleanup`-type guards, and warn on jobs that elevate to root or mount the Docker socket.

Live · just shipped

Install VibeDefend in 5 seconds.

One command wires every coding agent on your machine to CybeDefend: your business rules, your compliance frameworks, and guards that block destructive calls before they fire.

Install in 5 secondsNode 18.17+
npx -y @cybedefend/vibedefend@latest install
Auto-detects
  • Claude CodeClaude Code
  • CursorCursor
  • OpenAI CodexOpenAI Codex
  • WindsurfWindsurf
  • GitHub CopilotVS Code Copilot
Read the README on npm