Free & Open Source · Apache 2.0

Zagware Scanner

Catch security issues before they reach your main branch. Zagware Scanner runs IaC, dependency, and secrets scanning in one container on every pull request — and posts a single comment showing only the findings that PR actually introduces, not the hundreds that may already exist in the codebase.

Read the docs GitHub · GitLab · Bitbucket · Azure DevOps

One comment, only what's new

Your team sees exactly what they need to act on. Existing findings are ignored — the scan diffs base branch against PR branch by content fingerprint, not line number, so refactoring and line shifts never create noise.

github.com › acme-corp/platform-core › pull/482

🏗️ Zagware IaC — Infrastructure Misconfigurations

Comparing mainfeat/add-storage

Base branchThis PRNew
Findings34235917

⚠️ 17 new IaC finding(s) · 🔴 1 CRITICAL 🟠 5 HIGH 🟡 6 MEDIUM 🔵 3 LOW ⚪ 2 INFO

📦 Zagware SCA — Dependency Vulnerabilities

BaseThis PRNew
Vulnerabilities12186

⚠️ 6 new vulnerability(ies) · 🔴 1 CRITICAL 🟠 3 HIGH 🟡 2 MEDIUM

CVEPackageInstalledFixCVSSKEV
CVE-2023-1234lodash (npm)4.17.204.17.219.8No

🔑 Zagware Secrets — Leaked Credentials

BaseThis PRNew
Findings231
🌐 PUBLIC REPOSITORY — any leaked secret here is immediately exposed to the world. Rotate affected credentials before merging.

🔴 1 new secret(s) introduced by this PR

RuleFileLineValidation
stripe-access-tokenconfig/payments.rb5🔴 Valid

Three engines, one container

A single Docker image runs KICS, Syft + Grype, and betterleaks — the wrapper auto-detects what's present in your repo and only runs what's relevant.

🏗️

IaC — KICS (Checkmarx)

Scans Terraform, Kubernetes, Dockerfile, CloudFormation, ARM, Ansible, Helm, OpenAPI, Docker Compose, GitHub Actions, Serverless Framework, and Pulumi for misconfigurations, insecure defaults, open ports, and missing encryption.

📦

SCA — Grype (Anchore)

Syft builds an SBOM, Grype matches it against CVE/GHSA advisories for npm, pip, Go, Maven, Gem, Rust, PHP, .NET, and OS packages in Dockerfiles — with CVSS, EPSS, and KEV catalog status on every finding.

🔑

Secrets — betterleaks

Scans working-tree contents of both branches for leaked API keys, tokens, and private keys. No severity taxonomy — findings are prioritized by repo visibility, since a secret in a public repo is urgent by default.

🎯

Fingerprint diffing

Each finding is fingerprinted by rule, resource, and content — not line number. Existing findings never show up as "new," even after refactoring. Fix one and it drops out of the diff immediately.

📋

Interactive suppressions

Comment /zagware suppress <id> <reason> on a PR to silence a false positive — the scanner commits it to .zagware/suppressions.yaml and re-runs in place. No manual YAML editing required.

🔒

Verifiable supply chain

Every image is cosign-signed with SLSA Build Level 3 provenance and an SPDX SBOM attestation. Every bundled binary (KICS, Syft, Grype, betterleaks) is checksum- and signature-verified at build time.

How it works

1

Clone both branches

The scanner clones your base branch and PR branch using your existing CI token — no extra credentials to configure.

2

Scan in parallel

KICS scans IaC files, Syft + Grype scan package manifests, and betterleaks scans the working tree — all three run concurrently against both branches.

3

Diff by fingerprint

A finding that already existed on the base branch is never reported as new, even after the file was reformatted or moved.

4

Post the delta

One in-place PR comment, updated on every push — never duplicated. Set ZAGWARE_FAIL_ON_NEW: true to block the merge on new findings.

5

Optionally upload to the platform

Set ZAGWARE_PLATFORM_URL / ZAGWARE_PLATFORM_TOKEN to send results to the Git Tracking Platform for scan history, trend charts, and suppression audit trails. Entirely optional — the scanner works standalone with no account.

Runs on your CI, wherever that is

A single Docker image, four platforms. Org-wide enforcement is available on GitHub (org rulesets, Team+) and GitLab (Pipeline Execution Policy, Ultimate) so scanning can't be silently removed.

GitHub Actions

docker://ghcr.io/zagware/zagware-scanner:latest · triggers on pull_request, plus issue_comment for /zagware suppress.

GitLab CI

Runs as an image: job gated on merge_request_event; needs a project/group access token for MR notes.

Bitbucket Pipelines

Runs on every pull request step; needs an Atlassian API token and email as repository variables.

Azure DevOps

Runs via docker run in a PR-triggered pipeline; usually needs no setup beyond mapping $(System.AccessToken).

Free and open source

Zagware Scanner is Apache 2.0 licensed and free to run standalone, forever — no account, no platform token required. Self-host the image or pull it straight from GHCR.

Read full docs View on GitHub

Need scan history, audit trails, or compliance evidence across your whole org? See the Git Tracking Platform.