Dependency Vulnerability AuditorDependency Vulnerability Auditor is a defensive VS Code extension that statically reads dependency metadata, checks eligible exact package versions against OSV, and presents known dependency vulnerabilities without running project code or a package manager. It enriches validated CVE identifiers from a fresh CISA Known Exploited Vulnerabilities catalog, preserves source evidence and conflicts, derives explainable risk bounds, evaluates a local fail-closed security policy, and generates CycloneDX JSON 1.6 and SARIF 2.1.0 output. Eligible npm direct-dependency changes can be previewed as bounded diffs for manual remediation. Dependency Auditor does not automatically modify workspace dependency files in this release. Remediation is preview-only/manual for every ecosystem. Run Dependency Auditor: Scan Workspace from the Command Palette, or open the shield icon in the Activity Bar and use the Dependency Security views. Automatic startup and change scans are opt-in. Project links
Supply-chain intelligence in 0.8.0Version 0.8.0 is the first production Phase 7 slice, not completion of the broader supply-chain security roadmap. It adds:
OSV remains the only live package vulnerability lookup provider. CISA KEV is an exploitation catalog enrichment, not a package scanner. The provider-neutral model can represent future sources, but this release does not directly query NVD or GitHub Advisory Database. CVE and GHSA identifiers in an OSV record remain OSV-supplied aliases unless another configured source independently reports them. Supported ecosystems and metadata"Supported" means the adapter safely parses the listed local format. It does not mean that every language feature can be evaluated statically. Unsupported syntax, missing resolution metadata, and unsafe package sources are retained as coverage gaps instead of being guessed.
All seven canonical OSV ecosystems are enabled by default. A canonical setting
may cover several adapters: Coverage limitations by adapter
Where a manifest and lockfile can be reconciled statically, a missing, incompatible, unreachable, or stale/mismatched lock selection is retained as a coverage gap instead of being submitted as an exact installed version. This is constraint/graph reconciliation, not a claim that every form of lockfile staleness can be detected without running the package manager. Source provenance is necessarily workspace-bounded. User- or machine-level package-manager configuration, Maven settings outside the workspace, Gradle init/user configuration, and NuGet configuration outside the workspace are not observable. When workspace metadata selects an external or otherwise unresolvable source configuration, affected identities fail closed rather than being assumed to come from a public registry. Multi-root workspaces and monoreposEvery VS Code workspace folder is scanned, and each detected dependency project retains its workspace folder, project root, manifest, lockfile, package manager, and ecosystem. Results from unrelated projects are not combined into one dependency graph. The npm, Yarn, pnpm, Bun, and Cargo adapters recognize statically representable
workspace metadata. One global scheduler runs at most four project scans at a
time across all adapters and all folders in a multi-root workspace. Provider
work is deduplicated by canonical
Ecosystem mapping and package identityAdapters emit one ecosystem-independent
Canonical identity is never shortened: Coverage and result semanticsCoverage is reported per project and per canonical ecosystem:
The Tree View, Dashboard, Problems panel, Output Channel, and Status Bar all use the same stored scan result. The Dashboard includes ecosystem filters and a coverage table. Problems diagnostics include ecosystem context and point to a safe manifest location when the static parser can identify one. When a partial refresh follows a complete scan, newly confirmed findings and current coverage remain authoritative. Findings from the last complete scan that were not reconfirmed are retained separately, visibly labeled historical, and capped at 10,000. Historical evidence appears in Tree, Dashboard, Details, Status, and Problems without increasing current provider, dependency, coverage, or risk-score totals. A subsequent complete scan clears that retained evidence. The extension reports known vulnerabilities detected from the configured provider. It never claims that all vulnerabilities were detected or that a project is secure. "No known vulnerabilities found in audited dependencies" is only a provider result for checked subjects. If dependencies are unresolved, unsupported, unchecked, truncated, cancelled, or affected by a provider error, the UI reports partial or unavailable coverage and does not present a clean status. The Status Bar includes the unresolved count when applicable. The stored result also retains an immutable unfiltered normalized finding set.
Security UI
Remediation IntelligenceFor stored findings, the extension derives a local remediation candidate from the fixed-version events already returned by the configured provider. Direct dependencies can receive an exact recommended upgrade. Transitive findings are traced through the stored dependency path and name a parent remediation point only when that relationship is unambiguous; no parent version is invented. Recommendations include confidence and a non-authoritative compatibility-risk indicator. Multiple advisories on the same dependency occurrence are combined only when one provider-listed candidate can be established conservatively. A finding with no provider fix is labeled No known fixed version, while an unresolved, ambiguous, or conflicting case requires manual review. Remediation coverage means the proportion of displayed findings with a calculated candidate; it never means that dependencies have been changed or are secure. Use Dependency Auditor: Show Remediation to inspect the latest complete scan
without rescanning or contacting OSV. See Remediation preview and manual verificationFor an eligible recommendation, Review Fix creates a read-only preview with current file hashes and real diffs. Previewing is not approval and does not modify the workspace. The packaged adapter exposes no automatically applicable plan in this release; all remediation is manual. The deterministic npm preview subset is deliberately narrow: a direct npm dependency in
a root, non-workspace package-lock v3 project, using a simple exact/caret/tilde
range, where the exact target registry artifact is already present and the
complete generated graph validates locally. Production automatic remediation remains disabled
because the host file primitive cannot prove a race-safe conditional atomic
replacement. The extension never invents npm
integrity, resolved URL, checksum, graph, or placement data. Other npm cases and
other ecosystems remain The transaction engine is tested with injected atomic filesystem adapters: edits
are minimal, preserve UTF-8 BOM/newline style, validate through the existing
scanner, and trigger exact-byte rollback plus hash verification on failure.
Those tests do not make workspace apply available. See
The activity bar also contains a dedicated Remediation view. It presents the exact dependency occurrence, current and proposed versions, vulnerability IDs, rationale, confidence/risk, bounded real diffs, read-only Git advisory state, and the proposal's transition history. Its buttons follow the explicit state machine. In the packaged host every proposal currently terminates as preview-only/manual review because the required atomic replacement primitive is unavailable; automatic Apply is therefore not offered. For preview-only remediation, the view provides Open Diff, Copy Patch, and Open File actions. These actions use the controller's current preview token and bounded file index; the webview never supplies paths or file content, and no workspace file is modified. After applying a change manually, run a fresh scan to verify whether the targeted finding is fixed, still vulnerable, incomplete, provider-unavailable, or unknown. Phase 5C is complete as a verified manual remediation workflow. Public Node/VS
Code APIs expose path-based replacement without an operation that atomically
checks both the expected file identity and exact expected bytes, so production
Apply is unavailable in this release. See
Dashboard and details content treats every provider field as untrusted. HTML is
context-escaped and bounded. Webviews use a strict Content Security Policy and
have no Risk indicatorsThe Dashboard's aggregate Dependency Risk Score remains a deterministic finding-density indicator, not a statement about overall application security. Finding weights are Critical=20, High=10, Medium=4, Low=1, Unknown=0:
Provider and dependency coverage are displayed separately. Filtering findings by severity cannot turn hidden findings or incomplete coverage into a clean result. Phase 7 also adds an explainable per-finding risk model. Its 100 possible
points are normalized severity (40), CVSS (30), fresh CISA KEV evidence (20),
and reachability (10). The result contains the evidence-supported lower score,
an upper bound that exposes missing evidence, factor-by-factor reasons, and an
evidence-completeness state. Missing evidence adds zero asserted points; it is
never silently converted to low risk. This release has no source/call-graph
reachability engine, so reachability is explicitly Policy and standard outputAfter a scan, use these Command Palette actions:
No export path or file content is accepted from command arguments. Cancelling the Save dialog performs no write. The local security-policy engine supports bounded severity/CVSS counts and thresholds, required absence from fresh CISA KEV evidence, exact canonical ecosystem/package allow and block rules, and expiring advisory ignores. It evaluates unfiltered findings from the latest attempt. Invalid policy, incomplete coverage, provider records hidden from evaluation, cancellation, or required unknown evidence cannot pass. See docs/policy.md. CycloneDX JSON 1.6 and SARIF 2.1.0 builders produce deterministic, bounded output from stored scan results. They retain unfiltered known findings, use safe workspace-relative locations only, and label incomplete source coverage. Relationships are emitted only when a static parser proved them. This release does not implement CycloneDX XML, SPDX, SBOM import/diff, signing, attestation, or a headless scan CLI. See docs/sbom.md. Static analysis and safetyScanning, analysis, and preview only read bounded dependency metadata. The extension does not run Python or project code, package lifecycle scripts, or any of:
The transaction engine accepts writes only through an injected primitive that proves race-safe atomic replacement; the packaged production adapter does not claim that guarantee, so all current workspace remediation is preview-only. Startup, background scans, file saves, workspace changes, detection, details, tree/dashboard actions, and preview do not write project files. Detection and parsing have bounded file counts, graph depth/edge limits, and cancellation. Across the complete multi-root scan, dependency metadata reads share a 256 MiB aggregate budget, at most 10,000 dependency records are retained, and at most four project scans run concurrently. A reached limit becomes a coverage gap rather than a clean result. Privacy, network, and cache behaviorFor each eligible exact dependency, the extension sends only a request shaped
like this to
It does not upload source files, manifests, lockfiles, dependency graphs,
environment variables, CISA KEV enrichment downloads the public catalog with an HTTPS Successful OSV responses, including successful empty responses, are cached in
VS Code Cancellation stops new work and aborts active requests. A cancelled attempt does not replace the displayed usable diagnostics or partially commit newly fetched cache entries. Settings
Changes to Severity and version handlingOSV records are validated and normalized before UI code uses them. Authoritative non-Git fixed-version events are retained in a bounded normalized collection for local remediation analysis. npm uses strict semantic-version handling for exact versions and supported OSV range events. Other ecosystems are queried with their canonical exact version, and ecosystem-specific ordering is not guessed locally. Severity resolution prefers a valid CVSS score/vector, then a recognized
qualitative provider rating, and otherwise uses Development and verificationRequirements:
Unit tests use deterministic local parser fixtures and mocked OSV responses; they
do not require the live OSV service. Open this directory in VS Code and press
See docs/architecture.md for the adapter contract, unified models, provider and enrichment boundaries, cache keys, intelligence, policy, export, and coverage flows. Phase boundaryVersion 0.8.0 delivers the first bounded Phase 7 slice; it is not the entire supply-chain platform roadmap. It intentionally does not include unattended or scheduled fixes, package-manager execution, dependency update commands, a headless scanner CLI, CI job/PR integration, live NVD/GHSA providers, source or call-graph reachability, container analysis, license analysis, package-health or typosquatting/provenance detection, CycloneDX XML, SPDX, SBOM import/diff, signing/attestation, centralized reporting, or arbitrary build-tool evaluation. SARIF and CycloneDX support currently means bounded report generation over a completed extension scan, not a standalone CI scanner. Marketplace publication uses the public repository and issue tracker linked above. |