Supply Chain Auditor
How Rustywoof parses lockfiles across Rust, Node, and Python and queries the OSV vulnerability feed.
When you install a single package from npm, PyPI, or crates.io, that package often depends on dozens of other packages. Those indirect ("transitive") dependencies make up the majority of your project's code footprint.
The Supply Chain Auditor (woof audit) inspects every package version installed in your project and checks it against the Open Source Vulnerability (OSV) database.
What woof audit Looks For
- Known security advisories (CVEs & GHSAs): Publicly reported bugs such as prototype pollution, path traversal, or denial-of-service flaws in older library versions.
- Compromised releases: Versions of legitimate packages that were published after a maintainer's account or publishing token was stolen.
- Malicious packages: Packages flagged and removed by ecosystem security teams for stealing credentials during install scripts.
Why Lockfiles Matter More Than Manifests
Rustywoof does not audit loose version ranges like "^1.4.0" in your Cargo.toml or package.json, because a range does not tell you which exact version is currently installed. Instead, it reads your resolved lockfiles:
- Rust:
Cargo.lock - Node.js / TypeScript:
package-lock.json,pnpm-lock.yaml,yarn.lock - Python:
uv.lock,poetry.lock,requirements.txt
By reading the lockfile, Rustywoof checks the exact version numbers running in production.
Privacy and Local OSV Caching
When woof audit queries api.osv.dev, it sends a single batched HTTP request containing only package names, version numbers, and ecosystem identifiers:
woof audit reads package names and versions from Cargo.lock. Source files and local paths stay on your machine.{ "queries": [ { "version": "1.4.1", "package": { "name": "hyper", "ecosystem": "crates.io" } } ]}To keep repeated runs fast and work offline, Rustywoof caches OSV results on disk. If you ever want to clear the local cache and force a fresh sync, run woof cache clean.
Tracing Where a Package Came From (woof sniff)
When woof audit reports that an unfamiliar package deep in your dependency tree has a vulnerability, your first question is usually: "Which of my dependencies installed this?"
Run woof sniff <package-name> to print the dependency path from your root project down to that package:
woof sniff djangoDependency trace for django:
[email protected]
├── [email protected] (devDependencies)
└── [email protected] (dependencies)
Found 1 version of djangoOr run woof sniff without arguments to view your project's full dependency tree:
woof sniffLegend: production dependency, optional only, dev only
[email protected] /path/to/project-name
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
│
│ devDependencies:
├── @ianramy/[email protected]
├── @types/[email protected]
├── @types/[email protected]
├── @types/[email protected]
├── @types/[email protected]
└── [email protected]For a specific transitive package trace:
woof sniff fumadocs-coreDependency trace for fumadocs-core:
[email protected]
├── [email protected] (dependencies)
└─┬ [email protected]
└── [email protected] (dependencies)
Found 1 version of fumadocs-coreOnce you know what needs updating, you can run woof remediate <package> <fixed-version> to update the package to a patched release.
Last updated on 09/11/2026