Every layer, every language, and where it stops.
Shield runs nine analysis layers from one offline binary — over your code, your dependencies, the images you push, the infrastructure you declare and the pull requests you merge. This page lists exactly what each layer covers, which languages get deep rules versus lighter preview coverage, and the gaps we haven’t closed. Every claim is ground-truthed against the engine.
340 rules across 24 languages
Fourteen languages get comprehensive deep rule coverage; the rest get lighter preview rules. Each bar is the real rule count in the engine — nothing rounded up.
Smart contracts: Solidity, Vyper. Query: SQL. Templates: JSP, ERB, Razor, Twig, Jinja, FreeMarker. Config: Dockerfile, Helm, CI-YAML.
Spring rules live inside the Java pack.
Regex + intra-file taint + dataflow (constant-fold, key-sensitive) — not full AST, not interprocedural yet. Taint that crosses a method boundary is a known blind spot, which is why SQL injection is our weakest OWASP category (see below).
10 ecosystems, 18 manifest formats
| Ecosystem | Manifests / lockfiles parsed |
|---|---|
| npm | package.json, package-lock.json, yarn.lock, pnpm-lock.yaml |
| PyPI | requirements.txt, Pipfile.lock, poetry.lock |
| Go | go.mod |
| RubyGems | Gemfile.lock |
| Maven | pom.xml, gradle.lockfile |
| crates.io | Cargo.lock |
| Packagist | composer.lock |
| NuGet | packages.lock.json, packages.config, *.csproj |
| Pub | pubspec.lock |
| Hex | mix.lock |
Advisories come from OSV.dev (GHSA / CVE / PYSEC aliases). It resolves your actual installed versions, so it won’t flag packages you’ve already patched. Emits a CycloneDX 1.4 SBOM (see below).
26 patterns + a high-entropy fallback (27 detectors)
AWS key + secret, Azure connection string, GCP service-account key
GitHub (classic / fine-grained / OAuth), GitLab, npm
Stripe, Twilio, SendGrid, Slack (webhook + token), Discord
OpenAI, Anthropic, Linear
RSA, PKCS#8, OpenSSH, PGP
DB connection strings, JWT signing keys, generic API-key / password, high-entropy unknowns
Container images, from any registry
25 config checks, always on
Every Dockerfile, docker-compose and Kubernetes manifest in a connected repo is scanned — 14 Dockerfile/compose rules and 11 Kubernetes rules — plus 6 image-config rules that read the pushed image’s metadata.
Pull & scan a pushed image
Point Shield at an image in any registry. It reads the manifest, config and build history — not the multi-gigabyte layer blobs — so it stays fast and light. Private repos and Harbor robot accounts included.
Opt-in: OS-package CVEs in the layers
When you want the layer contents too, add a flag and Shield inventories the installed OS packages and checks them for known CVEs:
$ shield image-scan … --cve # delegates to Trivy if it’s on PATH
16 IaC checks across three formats
Terraform 6 · Kubernetes 7 · CloudFormation 3
Every Terraform file, Kubernetes manifest and CloudFormation template in a connected repo is scanned automatically — catching the misconfigs that quietly become breaches: wildcard IAM, public buckets, privileged pods, unencrypted storage.
Gate every pull request, on what matters
From your CI job, shield gate-report posts a pass/fail commit status and a PR / MR comment back to your git provider. On GitHub it also posts a Check Run with inline file-and-line annotations on the new findings a PR introduces (up to 50). Break the build on what the priority engine says actually matters — not on a wall of noise.
Providers
Reports export as text, HTML, JSON and SARIF 2.1.0. The CLI exits 0 on pass and 2 on a gate violation, so CI stops the build; --staged scopes a pre-commit hook to staged files only.
$ shield gate-report --provider github
# → commit status: fail (2 above threshold)
# → PR comment + Check Run posted
# → results.sarif written · exit 2
How the priority score is computed
| Signal | Weight | Source |
|---|---|---|
| CVSS | ×0.30 | severity, NVD 0–10 |
| EPSS | ×0.30 | 30-day exploit probability, FIRST.org |
| KEV | ×0.25 | CISA known-exploited (boolean) |
| reachability | ×0.15 | is the finding’s file reachable from an entry point |
Tiers: ≥80 critical · ≥60 high · ≥40 medium · ≥20 low.
Reachability here is a file-level signal (is the finding’s file reachable from an entry point), built from an import-graph pass for Go, JavaScript/TypeScript and Python. For dependency CVEs it goes a step further — scoring whether the vulnerable package is merely imported versus whether a known-vulnerable symbol is actually referenced in your source. It is separate from the intra-file taint the SAST engine uses to connect a source to a sink — we don’t conflate the two.
A pre-deploy check, in two parts
Shield’s DAST layer is a pre-check, not a full dynamic scanner. Part one runs inside every scan; part two runs when you point it at a live URL.
1 · Static config pre-check always on
Shield reads your nginx / apache / .htaccess config and source and flags 11 web-exposure mistakes (DAST-001…011): weak or disabled TLS, wildcard CORS, non-HTTPS endpoints, missing security headers, directory listing, open redirects, disabled CSRF, insecure cookies, no rate limiting, and debug mode left on.
2 · Live-endpoint probe opt-in
Aim Shield at a running endpoint — your staging host, before a deploy — and it probes for the mistakes that only appear at runtime, across four families:
HSTS, CSP, X-Frame-Options, X-Content-Type-Options, X-XSS-Protection, Referrer-Policy and Permissions-Policy — present, and set safely.
Flags TLS below 1.2, and certificates that are expired or expiring within 30 days, on the live endpoint.
Probes /.env, /.git/config, /debug, /server-status, /phpinfo.php, /wp-admin/, /actuator and /graphql, and reports any that answer 200 without auth.
Checks the plain-HTTP variant actually redirects to HTTPS instead of serving content in the clear.
Two grades, one gate
Every scan produces two independent A–F grades on the same 0–100 scale — one for security risk, one for maintainability — and either can gate a pull request.
Security grade
Starts at 100 and deducts a penalty per finding — −45 critical, −18 high, −6 medium, −1.5 low — each scaled 0.6–1.4× by that finding’s priority (exploitability). A single critical floors the grade at F.
Code grade
A maintainability read from lines of code, a complexity proxy, duplicate blocks (≥6 lines), long functions (>60 lines), deep nesting and a test-ratio signal.
| Grade | Score (0–100) |
|---|---|
| A | ≥ 90 |
| B | ≥ 80 |
| C | ≥ 65 |
| D | ≥ 50 |
| F | < 50 |
A configurable quality gate (per org or per project, scoped to branches like main or release/*) can fail the build on a severity count, a specific CWE, a minimum grade or a minimum score.
A bill of materials in 2 formats
CycloneDX 1.4 · SPDX 2.3
From the versions Shield resolved out of your lockfiles, shield sbom emits a machine-readable inventory in both CycloneDX 1.4 (the default) and SPDX 2.3 — each component carrying a Package URL (PURL) so downstream tooling can identify it exactly, deduplicated across manifests. Runs fully offline.
Where it runs
Connect a public or private repo on GitHub (native App), GitLab, Bitbucket or Azure DevOps. Webhooks auto-scan on push for GitHub, GitLab and Bitbucket; self-hosted GitHub Enterprise and GitLab are supported.
One self-contained Go binary, 12 commands (scan, image-scan, sbom, gate-report, hooks…). Secrets, SAST, container and IaC run fully offline; dependency CVEs (--deps) reach OSV over the network.
Four formats: a readable table, JSON for your tooling, SARIF 2.1.0 for code scanning, and a full-page HTML report.
Deep CLI, API and CI reference lives in the docs.
Plain-language explanations, on review
A local model (Ollama / Qwen) writes a plain-language explanation and a suggested fix for each finding, which you review. When the model is off or unreachable it falls back cleanly to 20 hand-written templates covering the common rule types, so you always get context. Everything from the scanned repo is neutralized against prompt injection before it reaches the model.
Per-category scores, zeros included
| Category | Score | Status |
|---|---|---|
| weak random | 1.000 | ● detected |
| insecure cookie | 1.000 | ● detected |
| crypto | 0.808 | ● detected |
| hash | 0.690 | ● detected |
| XSS | 0.516 | ● detected |
| LDAP injection | 0.499 | ● detected |
| XPath injection | 0.467 | ● detected |
| command injection | 0.451 | ● detected |
| path traversal | 0.445 | ● detected |
| SQL injection | 0.303 | ● our current laggard |
| trust boundary | 0.237 | ● detected |
$ OWASP_BENCH=$PWD/BenchmarkJava make bench-owasp
Measured on release v0.3.0 · commit 043d1cf · 2026-08-04 · 340-rule build.