CVM — Configuration Vulnerability Meter
Quantitative, reproducible scoring of the risk a system's configuration introduces, based on CCSS (NISTIR 7502). CASPAR is the reference implementation.
Configuration scanners tend to answer pass or fail against a checklist. Vulnerability scanners answer which known CVEs apply. CVM sits between them: it scores how much risk a configuration actually introduces, on a comparable scale, and detects attack chains — combinations of individually moderate weaknesses that together are severe.
pip install cvm-caspar
caspar init # restore the built-in knowledge base
caspar demo # write example configurations
caspar scan caspar-demo/apache-vulnerable.conf
caspar init is required once and only for pip installs: it restores the same
canonical knowledge base that the Docker image and the repository installer
ship, so scores are comparable across all three.
What it assesses
Twelve targets out of the box — Apache HTTP Server, nginx, SSH, MySQL, PostgreSQL, Redis, Tomcat, Docker, Dockerfile, Kubernetes, Ubuntu and Azure IaC — from knowledge derived from public CIS Benchmarks and DISA STIGs, with the provenance of every rule recorded.
caspar scan /etc/apache2/ # a directory
caspar scan --live apache2 # the installed service
caspar scan docker://httpd:2.4 # an image
caspar scan k8s-manifest.yaml # IaC
Every scan ends with a reproducible: … kb sha256:… line. Scores are only
comparable between identical knowledge bases, so that hash is what makes a
result checkable by someone else.
The web console
pip install "cvm-caspar[api]"
caspar serve # http://127.0.0.1:2027
Both consoles are already installed by pip install cvm-caspar — built, no
Node toolchain, about 2 MB of the wheel. What [api] adds is the server that
serves them: FastAPI and uvicorn. The v2 console answers at /app, v1 at
/v1/app, and the REST API with its Swagger UI at /api/v1 and /docs.
The split keeps the default install pure-Python and small, which is what a CI
runner wants — it scans and never opens a browser — and it means a security tool
does not install an HTTP server on machines that never asked for one. Running
caspar serve without the extra tells you exactly this and prints the command to
fix it.
Extras
Written literally, inside square brackets, quoted so the shell does not treat
them as a glob: pip install "cvm-caspar[api]". Combine with a comma —
"cvm-caspar[api,publish]".
| Extra | Adds | For |
|---|---|---|
| (none) | — | the CLI (scan, report, diff, explain) and both web consoles |
[api] |
fastapi, uvicorn | the server behind caspar serve |
[publish] |
requests | pushing results to an external endpoint |
[dev] |
pytest, httpx | running the test suite |
Build-time knowledge extraction
Adding a target from a benchmark PDF uses an LLM with RAG and is a build-time operation, separate from scanning:
caspar plugin add --source benchmark.pdf --target nginx
caspar build --provider anthropic # or ollama (local), openai
Hosted providers read ANTHROPIC_API_KEY / OPENAI_API_KEY from the
environment only — never a command-line flag or an API field, which would put
the key in shell history or in a stored job record. Scanning itself uses no LLM
and is fully deterministic.
Scope
Single instance, self-hosted. No multi-tenancy, no user accounts, no hosted service. CVM runs where the systems it assesses are, which is also why it needs no agents and no third-party SSH credentials.
Licence and provenance
Apache 2.0. The scoring method implements CCSS (NISTIR 7502, NIST — a US Government publication, not subject to copyright).
The knowledge base derives from public CIS Benchmarks and DISA STIGs, with provenance declared per target: what ships is machine-extracted rules carrying their own metrics, justifications and remediations — the benchmark documents themselves are never redistributed, and building a new target means supplying your own copy. The SCAP Security Guide (ComplianceAsCode/content, BSD-3-Clause, © Red Hat) is pinned by version with its SHA recorded in the reproducibility manifest. Full detail in the NOTICE file shipped with the package.
Source, documentation and the Docker images: https://github.com/AFilipe-IT/cvm
Metadata
Release files for cvm-caspar 1.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cvm_caspar-1.1.1.tar.gz | 5.2 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cvm_caspar-1.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 6.5 MB
Release files / cvm_caspar-1.1.1.tar.gz
| Download URL | cvm_caspar-1.1.1.tar.gz |
|---|---|
| Size | 5.2 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c85ea2473dec71284d80a51f12f391ebf6547414235fa9d9b4a7fca69c822446
|
|
BLAKE2b-256 checksum How to use checksums |
0f3d80e5774a3313cf106a43ec93c146a24d7b2056818ae08ed9213649e7bd9e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / cvm_caspar-1.1.1-py3-none-any.whl
| Download URL | cvm_caspar-1.1.1-py3-none-any.whl |
|---|---|
| Size | 1.3 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fe845b8e02b382cfa955386d6b5e6fe482fa37fab43be1a896cd5d3d03865f63
|
|
BLAKE2b-256 checksum How to use checksums |
da4ed35c3dd9255c9cc82fdd4a9ec686d4d18e86c67baebc236decea87fbd569
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|