The EU Cyber Resilience Act’s 24-hour reporting duty starts 11 September 2026. What it actually requires

StackRadar CLI: see which running pods carry known CVEs, from your laptop

stackradar scan is a free, Apache-2.0 CLI that finds known and exploited CVEs in every image running in your Kubernetes cluster — one command, about a minute, no cluster install, no account, no telemetry.

When a CVE lands and someone asks "are we affected?", stackradar scan answers it from what is actually running — the container digests the kubelet reports — not from what a manifest says. It walks every pod your kubeconfig can see, deduplicates the images, matches their OS and language packages against OSV, and flags anything in CISA's Known Exploited Vulnerabilities catalogue so the findings that are being exploited in the wild sort first. The launch post explains why enumeration starts from the kubelet rather than from your manifests.

Terminal recording of stackradar scan finding vulnerable images across a Kubernetes cluster and printing per-image severity counts

Install

install
brew install lockdep/tap/stackradar
# or
curl -fsSL https://raw.githubusercontent.com/lockdep/stackradar-cli/main/install.sh | sh
# or
go install github.com/lockdep/stackradar-cli@latest

Binaries for Linux, macOS and Windows (amd64 and arm64) are on the releases page. It is a single static binary: no Docker daemon, no runtime dependencies.

One command, and what it gets you

scan
# every running image in the current kubeconfig context
stackradar scan

# specific context and namespaces
stackradar scan --context prod -n payments -n checkout

# one image, no cluster needed
stackradar scan --image nginx:1.27

# machine-readable, shareable, or live in the browser
stackradar scan -o json > report.json
stackradar scan -o html --file report.html
stackradar scan --serve
  • Scans what is running, not what is declared: enumeration starts from the digests the kubelet reports, so sidecars and admission-injected containers are included. It needs list pods — the same permission as kubectl get pods.
  • Pulls with the credentials you already have ~/.docker/config.json, credential helpers, cloud keychains — or, with --use-pull-secrets, the cluster's own imagePullSecrets (the report then says which ones were used).
  • Ranks by exploitation, not just severity: CISA KEV entries are flagged on every surface, and --fail-on kev gates CI on them alone.
  • Exit codes follow Grype's convention — 0 clean, 1 error, 2 threshold met — so it drops into existing CI logic unchanged.

A report you can hand to someone

--serve opens an interactive dashboard on 127.0.0.1; -o html writes the same thing as one self-contained file with no external assets, so it opens offline and can be attached to a ticket. Filter by image, package, CVE or pod; expand an image to see every finding with the fixed version next to it.

The stackradar --serve report: per-image Critical, High, Medium and Low counts for every running image in the cluster, with KEV flags

Nothing phones home, and you can check

Nothing is sent to StackRadar. Image pulls go to your registries, package names and versions go to api.osv.dev, and one GET goes to cisa.gov for the KEV catalogue. That is the full list — no account, no telemetry. Cluster secrets are never read unless you pass --use-pull-secrets, and then credentials stay in memory for the pull and are never written to disk.

Releases are built by GitHub Actions and the checksums are signed with cosign (keyless), so the binary you run is provably the source you can read:

verify
cosign verify-blob checksums.txt --bundle checksums.txt.sigstore.json \
  --certificate-identity-regexp '^https://github.com/lockdep/stackradar-cli/' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com
sha256sum --ignore-missing -c checksums.txt

The CLI is a snapshot — StackRadar is the loop

A scan is true for the moment it ran; tomorrow's advisory can make today's clean image vulnerable without anything in the cluster changing. The CLI does not watch for that — the StackRadar scanner does: a small in-cluster agent that keeps a CycloneDX SBOM of every running image and re-checks it as advisories land, with every cluster in one dashboard, ranked by EPSS and KEV, history kept. Same team, same matching philosophy — the CLI is the answer today, the scanner is the answer that stays current. The container vulnerability scanner page covers when you want which.

Frequently asked questions

Is the StackRadar CLI open source?

Yes — the whole CLI is Apache-2.0, with every line on GitHub at github.com/lockdep/stackradar-cli. It embeds Google’s osv-scanner library for package extraction and matching, and its releases are built by GitHub Actions with cosign-signed checksums, so you can verify that the binary you downloaded is the code you can read.

Do I need to install anything in my cluster to use it?

No. The CLI is a single static binary that runs on your machine and talks to the cluster through your existing kubeconfig. It needs permission to list pods — the same access as `kubectl get pods` — and nothing else: no agent, no CRDs, no Helm chart, no Docker daemon. With `--image` it scans a single image and needs no cluster at all.

What data leaves my machine when I run stackradar scan?

Three things, all listed in the README: image pulls go to your own registries with your existing credentials, package names and versions go to api.osv.dev for advisory matching, and one GET fetches the CISA KEV catalogue from cisa.gov. Nothing is sent to stackradar.io — there is no account, no sign-up and no telemetry. The HTML report and the --serve dashboard are generated and served locally.

How is the StackRadar CLI different from Trivy or Grype?

Trivy and Grype scan an artefact you name; the StackRadar CLI starts from the container digests the kubelet reports as actually running, deduplicates them, scans each once, and attributes every finding back to the pods and namespaces that run it — including sidecars and images injected at admission that never appear in a manifest. It also flags CISA KEV entries so exploited CVEs sort first, and ships an interactive HTML report. For scanning a single named image in CI, all three are good choices.

How do I verify a downloaded release?

Every release’s checksums.txt is signed with cosign, keyless, from the repository’s GitHub Actions identity. Run `cosign verify-blob checksums.txt --bundle checksums.txt.sigstore.json --certificate-identity-regexp '^https://github.com/lockdep/stackradar-cli/' --certificate-oidc-issuer https://token.actions.githubusercontent.com`, then `sha256sum --ignore-missing -c checksums.txt` against your download.

Can I use it as a CI gate?

Yes. `stackradar scan --image $IMAGE --fail-on high` exits 2 when the threshold is met, 0 when clean and 1 on error — the same exit-code convention as Grype, so it drops into existing pipeline logic unchanged. `--fail-on kev` gates on known-exploited CVEs only, which is a far quieter signal than severity for teams starting out.

The next CVE lands whether or not you are ready

One Helm install. Your whole cluster on the free plan. Every finding linked to its public advisory. Have the answer before anyone asks the question.

1 cluster, unlimited images, no credit card. Upgrade only when you add clusters.