VSac (Venom-Sac)
Dependency risk scanner for the Gossamer Suite.
Status: early / 0.x. VSac's local-scan tier (CVE scanning + slopsquatting detection) and SBOM export are implemented and tested. The digest tier (KEV/OSSF correlation, composite risk scoring) and license-compliance checking are not yet implemented. See Roadmap below before depending on this for anything beyond CVE/slopsquat scanning and SBOM export.
What it does today
vsac refresh <target>— fetches OSV vulnerability data and registry metadata for your project's dependencies into a local cache. The only command that touches the network.vsac scan <target>— evaluates cached data and reports findings. Never makes a network call, by design — see Design below.vsac sbom <target> [--format cyclonedx|spdx]— emits an SBOM (CycloneDX 1.7 or SPDX 2.3, both current official spec versions) from the dependency manifest, printed as JSON on stdout. Never makes a network call: license fields are best-effort enrichment from the refresh cache only, so a BOM works even beforerefreshhas run.
Findings cover:
- Known CVEs (via OSV), with real CVSS-derived severity
- Outdated / stale dependencies (advisory signals, not vulnerabilities)
- Slopsquatting — package names matching patterns commonly seen in AI-hallucinated dependencies, and newly-registered packages
Install
pip install vsac
Usage
# From a project directory (auto-detects requirements.txt, package.json/
# package-lock.json, or Cargo.toml/Cargo.lock):
vsac refresh .
vsac scan .
vsac sbom . # CycloneDX 1.7 JSON on stdout
vsac sbom requirements.txt --format spdx # or SPDX 2.3
# Or point at a specific file:
vsac refresh requirements.txt
vsac scan requirements.txt --json
Exit codes: 0 clean, 1 a coverage-gap finding or a CRITICAL/HIGH
severity finding is present, 2 usage/parse error (sbom is 0 on
success / 2 on manifest error — its stdout is the BOM, not a finding
envelope). See DECISIONS.md
in the gossamer-suite
repo for the full rationale.
Design: network isolation
vsac scan never makes a live network call, full stop — not even to
OSV. All vulnerability/registry data comes from a local cache, written
only by the separate vsac refresh command. This is deliberate and
tested: plain import vsac does not load requests at all; it's only
pulled in when refresh is explicitly invoked.
Roadmap
Per the Gossamer Suite's design ledger, in order:
Local CVE scanning (OSV-derived local cache)doneSlopsquatting detectiondoneSBOM generation (CycloneDX 1.7 / SPDX 2.3)done- Digest tier: CISA KEV + OSSF Malicious Packages correlation,
composite risk scoring,
--explain-score - License compliance (advisory-only)
Credit
VSac's dependency-file parsers and slopsquatting heuristics are ported from XBOM (CC0 1.0 — no attribution required, credited here as a courtesy).
License
Apache License, Version 2.0. See LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file vsac-0.3.0-py3-none-any.whl.
File metadata
- Download URL: vsac-0.3.0-py3-none-any.whl
- Upload date:
- Size: 33.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e6149a64f985b8b4f3d93ad85bfb2f7a00f6003bddf42ea4ee80a0ae20c067f1
|
|
| MD5 |
318cc61ecbdf5394cc20ce7abdb6ae6b
|
|
| BLAKE2b-256 |
67a52f6f8f1df507cca3a38dc9ac3749d74b54a6e2714fb96ac04ec3b280d543
|