Skip to content

Repository files navigation

vulnz

vulnz collects, transforms, and stores vulnerability data from 28 providers (NVD, OS distributions, EU regulatory bodies, exploit databases) into a unified JSON schema, with a focus on EU Cyber Resilience Act compliance.

Vunnel vs vulnz (inspired by Vunnel)

Vunnel (Python)vulnz
LanguagePython 3.10+Go 1.25
Distributionpip package + Python runtimeSingle static binary
Providers2728
StorageSQLite onlyFlat-file and SQLite
ConcurrencyProcess-basedGoroutine-based
HTTP clientrequestsPer-host rate limiting, retry with backoff, connection pooling
Schema validationPython classesJSON Schema (programmatic)
EU CRA supportPartialFull (KEV, EUVD, BSI CERT-Bund, CERT-FR, CISA ICS-CERT)

Installation

git clone https://github.com/shift/vulnz.git
cd vulnz
go build -o vulnz ./cmd/vulnz

Or with Make:

make build

Quick Start

./vulnz list
./vulnz run kev
./vulnz run --all
./vulnz run --all --parallel 8

CLI Reference

Global Flags

FlagShortDefaultDescription
--config-c~/.vulnz.yamlConfig file path
--log-level-linfoLog level (debug, info, warn, error)
--verbose-vfalseVerbose output
--output-otextOutput format (text, json)

Commands

vulnz run [provider] Run one or more providers
vulnz list List registered providers
vulnz status [provider] Show provider status and data freshness
vulnz clear [provider] Clear provider workspace data
vulnz config show Display current configuration
vulnz config validate Validate configuration file
vulnz version Show version, commit, and build info

Run Flags

FlagShortDefaultDescription
--all-afalseRun all registered providers
--provider-pSpecific provider(s), comma-separated
--workspace-w./dataWorkspace root directory
--parallel4Max concurrent provider executions
--sinceOnly fetch data newer than timestamp (RFC3339)

Providers

ProviderDescriptionData Source
kevKnown Exploited VulnerabilitiesEUVD consolidated KEV dump
euvdEU Vulnerability DatabaseENISA exploited vulns API
euvd-mappingCVE-EUVD ID mappingENISA mapping CSV
nvdNational Vulnerability DatabaseNVD CVE API 2.0
rhelRed Hat Enterprise LinuxCSAF 2.0 advisories
ubuntuUbuntu SecurityCVE tracker git repo
debianDebian SecurityJSON + DSA text
alpineAlpine Linuxsecdb JSON
amazonAmazon LinuxRSS XML + HTML
oracleOracle LinuxOVAL XML
slesSUSE Linux EnterpriseOVAL XML
marinerAzure Linux MarinerOVAL XML
rockyRocky LinuxOSV API
almaAlmaLinuxOSV git repo
fedoraFedoraBodhi REST API
archArch LinuxJSON + ASA
wolfiWolfi OSsecdb JSON
chainguardChainguardsecdb JSON
chainguard-librariesChainguard LibrariesOpenVEX JSON
minimosMinimossecdb JSON
bitnamiBitnamivulndb git repo
bsi-cert-bundBSI CERT-BundCSAF 2.0 JSON
cisa-ics-certCISA ICS-CERTCSAF 2.0 + GitHub API
cert-frCERT-FR (ANSSI)RSS XML + HTML
epssExploit Prediction ScoringEPSS CSV
eolEnd of Life datesendoflife.date API
photonPhoton OSCVE JSON + wiki
secureosSecureOSsecdb gzip + SHA256

Architecture

cmd/vulnz/ CLI entry point
internal/
cli/ Cobra command definitions
provider/ Provider framework (registry, executor, interfaces)
providers/ Blank imports for provider registration
storage/ Flat-file and SQLite storage backends
workspace/ Workspace management (locks, checksums, state)
http/ HTTP client with rate limiting, retry, backoff
schema/ JSON Schema validation
utils/
oval/ OVAL XML parser
csaf/ CSAF 2.0 parser
rpm/ RPM version comparison
vulnerability/ Vulnerability type definitions
archive/ Archive extraction utilities
date/ Date parsing helpers

Each provider implements the Provider interface, registers itself via init(), and is discovered at runtime through the provider registry. The executor runs providers concurrently with configurable parallelism and per-provider timeouts.

Configuration

Config file: ~/.vulnz.yaml (or --config flag). An example config is available at config.example.yaml.

Configuration precedence: CLI flags > environment variables (VULNZ_ prefix) > config file.

Key settings:

log:
level: inforoot: ./dataexecutor:
max_concurrent: 4timeout: 30mproviders:
nvd:
runtime:
result_store: sqliteexisting_results: delete-before-writeapi_key: "${NVD_API_KEY}"

Environment variable NVD_API_KEY is recommended for NVD API rate limit bypass.

Output

Providers store results under <workspace>/<provider>/storage/. Each vulnerability is a JSON file following the standardised output schema.

EU CRA Compliance

vulnz is specifically focused on EU Cyber Resilience Act compliance. Several providers carry data required for EU CRA:

  • KEV -- exploited_in_wild flag with source attribution
  • EUVD -- exploitedSince dates from ENISA
  • BSI CERT-Bund -- German severity mapping, TR-03116 compliance fields
  • CERT-FR -- ANSSI vulnerability tracking
  • CISA ICS-CERT -- ICS advisory data

All EU-facing providers are tagged eu-cra and produce data in the standardised Vunnel vulnerability schema.

Development

make test Run tests with coverage
make lint Run linters (go vet, go fmt, golangci-lint)
make clean Remove build artifacts
make deps Download and tidy dependencies

Adding a Provider

  1. Create internal/provider/<name>/ with provider.go and manager.go
  2. Implement the Provider interface
  3. Register via blank import in internal/providers/register.go
  4. Add tests in a _suite_test.go file (Ginkgo/Gomega)

Known Limitations

Memory Usage with Large JSON Payloads

Some providers (notably nvd, ubuntu, alpine) currently load entire JSON responses into memory before parsing. This can cause high memory usage or Out-Of-Memory (OOM) crashes on smaller machines when processing multi-gigabyte datasets.

Workarounds:

  • Run memory-intensive providers individually: ./vulnz run nvd
  • Ensure adequate RAM (8GB+ recommended for full --all runs)
  • Use the --parallel 1 flag to reduce concurrent memory pressure

Tracking: This is a known issue and will be addressed by migrating to streaming JSON parsing (json.NewDecoder). See GitHub Issue #1.

Orphaned SQLite WAL Files

If the process is killed (SIGKILL), temporary SQLite database files (.db, .wal, .shm) may be left in the workspace directory. These are safe to delete manually.

Tracking: Automatic cleanup on startup is planned. See GitHub Issue #2.

License

AGPL-3.0 -- see LICENSE.

Credits

Created by shift, inspired by Vunnel by Anchore, Inc.

About

Go vulnerability data aggregator with EU CRA compliance - 28 providers including EU-specific feeds (KEV, EUVD, BSI CERT-Bund, CERT-FR)

Topics

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages