Configures and runs Google OSV-Scanner - open-source SCA against the OSV.dev vulnerability database; supports `osv-scanner scan -r ./` recursive scan + per-lockfile scan via `-L package-lock.json`; SBOM input (CycloneDX / SPDX) for non-standard package managers; `--format json|sarif|markdown|vertical|html` output; suppressions via `osv-scanner.toml` config. Use when the team needs OSS-native SCA without commercial-license overhead, or wants a second-opinion DB pair with Snyk's commercial DB.
71
89%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
snyk-test
for cross-DB consensus signal.Per osv-usage:
docker pull ghcr.io/google/osv-scanner:latestOther install paths (consult google.github.io/osv-scanner for current options per platform):
# Go install
go install github.com/google/osv-scanner/cmd/osv-scanner@v1
# Homebrew
brew install osv-scanner
# Direct binary download from github.com/google/osv-scanner/releasesPer osv-usage:
osv-scanner scan -r ./my-project-dir/Auto-detects manifest files (package-lock.json, Pipfile.lock, go.mod, Cargo.lock, etc.) and queries OSV.dev for each.
Per-lockfile scan (-L targets one lockfile without recursing, useful in
monorepos):
osv-scanner scan -L package-lock.json --output-file scan-results.txtPer osv-usage: --format json and --format=vertical
and --format=html are referenced. Full format list per the
osv-scanner documentation:
| Format | Use |
|---|---|
--format json | For downstream aggregation |
--format sarif | GitHub Code Scanning upload |
--format markdown | PR comments |
--format vertical | Default human-readable |
--format html | Standalone report |
For projects with custom build systems that emit SBOMs but lack natively-parsed lockfiles:
osv-scanner scan --sbom my-app.cyclonedx.json
osv-scanner scan --sbom my-app.spdx.jsonThis composes with syft-generation
in the qa-sbom plugin - Syft generates the SBOM, OSV-Scanner
queries OSV.dev against it.
osv-scanner.toml configSuppress a vuln with an expiring, reasoned entry (auditable in git):
# osv-scanner.toml
[[IgnoredVulns]]
id = "CVE-2024-1234"
ignoreUntil = 2026-12-15T00:00:00Z
reason = "Reachability confirms unreachable; tracked in JIRA-1234"The full schema ([[PackageOverrides]], multi-entry config, --config flag,
the mandatory justification template) is in
references/osv-scanner-config-and-ci.md.
Suppress via [[IgnoredVulns]] (per-CVE, with ignoreUntil) or
[[PackageOverrides]] (per pinned package + ecosystem) in osv-scanner.toml;
--severity-threshold is a scan-time filter, not a suppression. Every entry
carries a mandatory reason + approver + re-review date. ignoreUntil is
enforced - past-due ignores re-surface in the scan results. The
suppression-layer table and justification template are in
references/osv-scanner-config-and-ci.md.
OSV-Scanner exit codes (verify against current docs):
The google/osv-scanner-action GHA (Docker invocation + SARIF upload) is in
references/osv-scanner-config-and-ci.md.
OSV-Scanner has experimental license-summary support:
osv-scanner --experimental-licenses-summary scan -r .For full license-compliance + scanning, pair with spdx-format
(in the qa-sbom plugin) or use a dedicated tool like ScanCode / FOSSology.
[[IgnoredVulns]] without ignoreUntil -> debt persists; always set ignoreUntil (Step 5).--format=sarif upload -> findings invisible in the GitHub Security tab; always emit SARIF (Step 7).snyk-test.-L.--config pointing outside the repo -> suppressions not auditable; commit osv-scanner.toml at the repo root.trivy-image or grype-scanning (qa-sbom plugin).osv-scanner help output.osv-scanner.toml schema, triage template, and CI workflow:
references/osv-scanner-config-and-ci.mdsnyk-test,
dependabot-config,
renovate-config,
npm-pip-maven-audit -
sister toolssyft-generation -
cross-plugin SBOM source