Security vulnerability auditing tool for Python packages
Project description
🐍 PySentry
A fast, reliable security vulnerability scanner for Python projects, written in Rust.
Overview
PySentry audits Python projects for known security vulnerabilities by analyzing dependency files (uv.lock, pyproject.toml) and cross-referencing them against multiple vulnerability databases. It provides comprehensive reporting with support for various output formats and filtering options.
Key Features
- Multiple Project Formats: Supports both
uv.lockfiles (with exact versions) andpyproject.tomlfiles - Multiple Data Sources:
- PyPA Advisory Database (default)
- PyPI JSON API
- OSV.dev (Open Source Vulnerabilities)
- Flexible Output: Human-readable, JSON, and SARIF formats
- Performance Focused:
- Written in Rust for speed
- Async/concurrent processing
- Intelligent caching system
- Comprehensive Filtering:
- Severity levels (low, medium, high, critical)
- Dependency types (production, development, optional)
- Direct vs. transitive dependencies
- Enterprise Ready: SARIF output for IDE/CI integration
Installation
From Source
git clone https://github.com/nyudenkov/pysentry
cd pysentry
cargo build --release
The binary will be available at target/release/pysentry.
System Requirements
- Rust 1.70+ (for building from source)
- Internet connection (for vulnerability database updates)
Quick Start
Basic Usage
# Audit current directory
pysentry
# Audit specific project
pysentry /path/to/python/project
# Include development dependencies
pysentry --dev
# Filter by severity (only show high and critical)
pysentry --severity high
# Output to JSON file
pysentry --format json --output audit-results.json
Advanced Usage
# Comprehensive audit with all dependency types
pysentry --dev --optional --format sarif --output security-report.sarif
# Check only direct dependencies using OSV database
pysentry --direct-only --source osv
# Ignore specific vulnerabilities
pysentry --ignore CVE-2023-12345 --ignore GHSA-xxxx-yyyy-zzzz
# Disable caching for CI environments
pysentry --no-cache
# Verbose output for debugging
pysentry --verbose
Configuration
Command Line Options
| Option | Description | Default |
|---|---|---|
--format |
Output format: human, json, sarif |
human |
--severity |
Minimum severity: low, medium, high, critical |
low |
--source |
Vulnerability source: pypa, pypi, osv |
pypa |
--dev |
Include development dependencies | false |
--optional |
Include optional dependencies | false |
--direct-only |
Check only direct dependencies | false |
--ignore |
Vulnerability IDs to ignore (repeatable) | [] |
--output |
Output file path | stdout |
--no-cache |
Disable caching | false |
--cache-dir |
Custom cache directory | ~/.cache/pysentry |
--verbose |
Enable verbose output | false |
--quiet |
Suppress non-error output | false |
Cache Management
PySentry uses an intelligent caching system to avoid redundant API calls:
- Default Location:
~/.cache/pysentry/(or system temp directory) - TTL-based Expiration: Separate expiration for each vulnerability source
- Atomic Updates: Prevents cache corruption during concurrent access
- Custom Location: Use
--cache-dirto specify alternative location
To clear the cache:
rm -rf ~/.cache/pysentry/
Supported Project Formats
uv.lock Files (Recommended)
PySentry has support for uv.lock files, providing:
- Exact version resolution
- Complete dependency graph analysis
- Source tracking
- Dependency classification (main, dev, optional) including transitioning dependencies
pyproject.toml Files
Fallback support for projects without lock files:
- Parses version constraints from
pyproject.toml - Limited dependency graph information
Vulnerability Data Sources
PyPA Advisory Database (Default)
- Comprehensive coverage of Python ecosystem
- Community-maintained vulnerability database
- Regular updates from security researchers
PyPI JSON API
- Official PyPI vulnerability data
- Real-time information
- Limited to packages hosted on PyPI
OSV.dev
- Cross-ecosystem vulnerability database
- Google-maintained infrastructure
Output Formats
Human-Readable (Default)
Most comfortable to read.
JSON
{
"summary": {
"total_dependencies": 245,
"vulnerable_packages": 2,
"total_vulnerabilities": 3,
"by_severity": {
"critical": 1,
"high": 1,
"medium": 1,
"low": 0
}
},
"vulnerabilities": [...]
}
SARIF (Static Analysis Results Interchange Format)
Compatible with GitHub Security tab, VS Code, and other security tools.
Performance
PySentry is designed for speed and efficiency:
- Concurrent Processing: Vulnerability data fetched in parallel
- Smart Caching: Reduces API calls and parsing overhead
- Efficient Matching: In-memory indexing for fast vulnerability lookups
- Streaming: Large databases processed without excessive memory usage
Benchmarks
Typical performance on a project with 100+ dependencies:
- Cold cache: 15-30 seconds
- Warm cache: 2-5 seconds
- Memory usage: ~50MB peak
Development
Building from Source
git clone https://github.com/nyudenkov/pysentry
cd pysentry
cargo build --release
Running Tests
cargo test
Project Structure
src/
├── main.rs # CLI interface
├── lib.rs # Library API
├── cache/ # Caching system
├── dependency/ # Dependency scanning
├── output/ # Report generation
├── parsers/ # Project file parsers
├── providers/ # Vulnerability data sources
├── types.rs # Core type definitions
└── vulnerability/ # Vulnerability matching
Troubleshooting
Common Issues
Error: "No lock file or pyproject.toml found"
# Ensure you're in a Python project directory
ls pyproject.toml uv.lock
# Or specify the path explicitly
pysentry /path/to/python/project
Error: "Failed to fetch vulnerability data"
# Check network connectivity
curl -I https://osv-vulnerabilities.storage.googleapis.com/
# Try with different source
pysentry --source pypi
Performance Issues
# Clear cache and retry
rm -rf ~/.cache/pysentry
pysentry
# Use verbose mode to identify bottlenecks
pysentry --verbose
Acknowledgments
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 Distribution
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 pysentry_rs-0.1.0.tar.gz.
File metadata
- Download URL: pysentry_rs-0.1.0.tar.gz
- Upload date:
- Size: 738.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.9.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5dbb4338901cc52935eb77a4299b5a125028b1f5dad0d8a44bf66b9f9ee9791a
|
|
| MD5 |
db05c3222e8ed24acea5623117c35bf2
|
|
| BLAKE2b-256 |
9891f695255a24eb251990f74cb80da4733db2f5cb47ff6e0ddb438f765021f3
|
File details
Details for the file pysentry_rs-0.1.0-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: pysentry_rs-0.1.0-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 18.6 kB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.9.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a4a9254ae452c5a939149d09fd971c5896f314bb0dacb095197b0491dd2d0fb8
|
|
| MD5 |
9d84b8ccd76e863f7213c97252c56309
|
|
| BLAKE2b-256 |
015cb2a07e9457cdf7de5ca091db958e556fbef3f3aca9842ad8f2bc1df7058e
|