Open source · Contextual scoring
Your scanner found 300 CVEs. Vens takes your Trivy or Grype report plus a short description of your system, and scores every CVE by its real risk to you. You get a CycloneDX VEX with OWASP Risk Rating scores, so you fix what matters.
go install github.com/venslabs/vens/cmd/vens@latest
Same scan, re-scored for your system
How it works
Run Trivy or Grype and export the JSON report. Vens is not a scanner, it ranks what your scanner finds.
A short config.yaml: exposure, data sensitivity, compliance, controls.
vens generate sends your CVEs, with your context, to an LLM and computes an OWASP risk score for each one.
Get a CycloneDX VEX with OWASP ratings. Fold them back into your report with vens enrich, push them to a vulnerability management platform like Dependency-Track, or fail CI on real criticals.
Context changes the answer
RCE in a library whose vulnerable path never runs in your build. Not reachable, not urgent.
Info leak in a handler that processes PII under GDPR. Higher risk for your system, not lower.
Context filters the backlog down to what actually applies to you. Stop patching by severity alone.
Scenarios are illustrative. Actual scores depend on your config.yaml and the model you run. See CVSS vs OWASP contextual.
What you get
Risk = Likelihood × Impact (0 to 81), driven by your exposure, data, and controls. Not generic CVSS.
Auto-detected from the JSON report. Bring your own scanner, vens ranks the output.
Standard CycloneDX VEX. Suppress noise in CI, or feed it to Dependency-Track.
OpenAI, Anthropic, Google AI, or fully local with Ollama. Swap providers with a flag.
--attest writes a CycloneDX attestation: model, hashes, and reasoning, so every score can be reproduced.
We measured 12 LLMs on this exact job. Pick a model on evidence.
Two commands in
# 1. describe your system
cat config.yaml
project:
name: my-api
context:
exposure: internet
data_sensitivity: high
business_criticality: high
compliance_requirements: [GDPR]
# 2. score your scanner report
export OPENAI_API_KEY=sk-...
vens generate --config-file config.yaml \
--sbom-serial-number "urn:uuid:$(uuidgen | tr '[:upper:]' '[:lower:]')" \
report.json output.vex.json
Is vens for you?
Vens is not a scanner. You still need Trivy or Grype to find CVEs. Vens tells you which ones to care about.
Before you adopt it, read privacy and data flow, limitations, and vens vs alternatives.
Documentation
Score the CVEs that actually matter for your system.