Zero-dependency CVE scanner for dependency manifests — wraps the free OSV.dev API
Project description
dep-scanner
Zero-dependency Python library that scans your dependency manifests for known CVEs using the free OSV.dev API.
No API key. No signup. No rate limits for normal use.
pip install osv-scan
Why
safetywent paid in 2023osv-scanneris a Go binary — not embeddable in Pythonpip-auditis great but Python-only and pulls in several dependencies
dep-scanner fills the gap: a pure stdlib Python library that scans six ecosystems and works anywhere Python runs.
Supported manifest files
| File | Ecosystem |
|---|---|
requirements.txt |
PyPI |
package.json |
npm |
package-lock.json |
npm |
go.mod |
Go |
Cargo.toml |
crates.io |
pom.xml |
Maven |
CLI
# auto-detect manifest in current directory
dep-scan
# scan a specific file
dep-scan requirements.txt
# multiple files
dep-scan requirements.txt package-lock.json
# JSON output (great for CI)
dep-scan --json requirements.txt
# fail CI only on HIGH or above (default: critical)
dep-scan --fail-on high requirements.txt
# quiet mode — only print findings
dep-scan -q requirements.txt
Example output
dep-scan requirements.txt (PyPI) · 42 packages
CRITICAL django 3.2.1
CVE-2023-36053
Potential ReDoS via cached 'urlsplit' results
Fix: upgrade to 3.2.20
HIGH requests 2.27.0
CVE-2023-32681
Unintended leak of proxy-authorization header
Fix: upgrade to 2.31.0
1 CRITICAL · 1 HIGH (2 vulns · 840ms)
Python API
import dep_scanner
# scan a file on disk
result = dep_scanner.scan("requirements.txt")
print(result.highest_severity) # 'CRITICAL'
print(result.packages_scanned) # 42
print(len(result.findings)) # 3
for finding in result.critical:
print(finding.package, finding.version)
print("Fix:", finding.fix_versions[0] if finding.fix_versions else "none")
# scan content directly (no file needed)
result = dep_scanner.scan_text(
"requests==2.27.0\ndjango==3.2.1",
ecosystem="PyPI",
)
# convert to dict
data = result.to_dict()
# {
# "CRITICAL": [{"package": "django", "version": "3.2.1", ...}],
# "HIGH": [{"package": "requests", ...}],
# }
ScanResult properties
| Property | Type | Description |
|---|---|---|
source |
str |
File path or label |
ecosystem |
str |
e.g. "PyPI" |
packages_scanned |
int |
Total unique packages checked |
findings |
list[PackageFinding] |
Packages with vulnerabilities |
elapsed_ms |
int |
Wall time in milliseconds |
highest_severity |
str | None |
"CRITICAL", "HIGH", "MEDIUM", "LOW" |
critical |
list[PackageFinding] |
Only CRITICAL findings |
high |
list[PackageFinding] |
Only HIGH findings |
has_findings |
bool |
True if any vulnerabilities found |
GitHub Actions
- name: Scan dependencies
run: |
pip install dep-scanner
dep-scan --fail-on high requirements.txt
pre-commit hook
# .pre-commit-config.yaml
repos:
- repo: https://github.com/SpiderCob/dep-scanner
rev: v0.1.0
hooks:
- id: dep-scan
How it works
- Parses your manifest file to extract
(name, version, ecosystem)tuples - Sends a single batch POST to
https://api.osv.dev/v1/querybatch - Parses severity from
database_specific.severity→cvss_score→ CVSS vector - Returns structured findings sorted by severity
Packages with unpinned version ranges (^1.0, >=2.0) are skipped — OSV requires exact versions.
License
Apache 2.0 — free to use in commercial projects.
Built by SpiderCob.
Project details
Release history Release notifications | RSS feed
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 osv_scan-0.1.2-py3-none-any.whl.
File metadata
- Download URL: osv_scan-0.1.2-py3-none-any.whl
- Upload date:
- Size: 12.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1f4f6cf7a7874a32c2419d21827d1634539688f306414cc7821d99ea32286f71
|
|
| MD5 |
462b350dd375a51febca45fef362175d
|
|
| BLAKE2b-256 |
dfdc9a44b40ca815871937cfb769d6e26e1ae4151b5659eb8384fc41829c1a82
|