๐ PYGARDE โ Python Supply Chain Security Guardian. Scans, audits and hardens Python package manager security.
Project description
๐ PYGARDE (pyw)
Python Supply Chain Security Guardian
PYGARDE is a CLI security tool that scans, audits and hardens your Python package ecosystem against supply-chain attacks โ before malicious code ever runs on your machine.
โโโโโโโ โโโ โโโ โโโโโโโ โโโโโโ โโโโโโโ โโโโโโโ โโโโโโโโ
โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโ โโโโโโโ โโโ โโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโ
โโโโโโโ โโโโโ โโโ โโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโ
โโโ โโโ โโโโโโโโโโโโ โโโโโโ โโโโโโโโโโโโโโโโโโโ
โโโ โโโ โโโโโโโ โโโ โโโโโโ โโโโโโโโโโ โโโโโโโโ
Features
| Feature | Description |
|---|---|
| Deep scan | Download and scan any PyPI package without installing it |
| Pre-install gate | Intercept and scan packages before they touch your environment |
| Dependency audit | Audit all project dependencies against known CVEs and custom rules |
| RC hardening | Detect and fix misconfigurations in pip.conf, poetry.toml and uv.toml |
| Version diff | Compare two package versions and scan the code delta for injected threats |
| Health check | doctor command scores your project's overall security posture |
Detection Rules
| Rule | Detects |
|---|---|
install-scripts |
Malicious setup.py hooks, .pth injection |
network-access |
Suspicious imports and outbound URLs (pastebin, ngrok, hardcoded IPs) |
code-execution |
eval, exec, os.system, subprocess with shell=True, pickle.loads |
obfuscation |
base64.b64decode payloads, marshal.loads, high-entropy strings |
data-exfiltration |
os.environ combined with outbound HTTP, sensitive key access |
hidden-chars |
Zero-width spaces, Trojan Source (CVE-2021-42574), Cyrillic homoglyphs |
typosquatting |
Levenshtein-distance โค 2 against 80+ popular PyPI packages |
Installation
Recommended โ global install with pipx
pipx installs Python CLI tools in isolated environments and makes them available system-wide. This is the preferred way to install pyw.
# 1. Install pipx (once)
brew install pipx # macOS
# or: pip install --user pipx
pipx ensurepath # adds ~/.local/bin to your PATH (restart terminal after)
# 2. Install pygarde globally
pipx install pygarde
# 3. Verify
pyw --version
After this, pyw is available in any terminal, any project, any virtualenv โ no activation needed.
Alternative โ pip (current Python only)
pip install pygarde
pyw --version
โ ๏ธ With plain
pip,pywis only available while that Python's environment is active. Usepipxfor a permanent global install.
From source (development)
git clone https://github.com/destbreso/pygarde
cd pygarde
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pyw --version
Requirements: Python 3.10+
Quick Start
# 1. Initialize security config in your project
cd my-project
pyw init
# 2. Scan any PyPI package before installing it
pyw scan requests
pyw scan requests --version 2.31.0
# 3. Install packages with pre-install security gate
pyw install requests flask sqlalchemy
pyw install pytest --dev
# 4. Audit all project dependencies
pyw audit
pyw audit --deep # also scans source code of each dep
# 5. Health check โ scores your project security posture
pyw doctor
# 6. Harden your package manager config (pip.conf / poetry.toml / uv.toml)
pyw harden
pyw harden --yes # auto-apply without prompts
# 7. Compare two versions of a package โ detect injected code
pyw diff numpy
pyw diff requests --target 2.32.0 --show-diff
Commands
pyw scan <package> [--version]
Deep-scan a PyPI package for security threats without installing it.
pyw scan requests
pyw scan requests --version 2.28.0
pyw scan suspicious-pkg --severity high
pyw scan malware --ci --json
Options:
| Flag | Description |
|---|---|
--version, -v |
Version to scan (interactive picker if omitted) |
--severity, -s |
Minimum severity to display (low | medium | high | critical) |
--page-size |
Findings per page (default: 20) |
--ci |
Non-interactive, exits with code 1 if threats found |
--json |
Machine-readable JSON output |
pyw install [packages...]
Install packages with a pre-install security scan.
pyw install requests flask sqlalchemy
pyw install pytest --dev
pyw install requests --force # install despite findings
pyw install requests --skip-scan # bypass scanning
pyw audit [--deep]
Audit all project dependencies.
- Runs native PM audit (pip-audit, pipenv check, etc.)
- With
--deep: downloads and static-scans each dependency
pyw audit
pyw audit --deep
pyw audit --ci --json
pyw doctor
Security health check. Scores your project 0โ100% across:
.pygarde.ymlpresent- Lockfile present
- PM config security (via RC analyzer)
- No dangerous PM settings
- All detection rules enabled
- Allowlist not overly permissive
pyw diff <package> [--target]
Compare two versions of a package and scan the diff for injected code.
pyw diff requests
pyw diff numpy --target 1.26.0
pyw diff attrs --show-diff # show line-level diffs
pygarde highlights:
- Added / removed / modified files
- New attack patterns in the diff (eval, subprocess, network calls)
pyw harden [--yes] [--dry-run]
Audit and fix PM security configuration files.
pyw harden
pyw harden --yes # auto-apply at configured level
pyw harden --dry-run # show issues only
Harden levels:
| Level | Scope |
|---|---|
minimal |
Critical + high โ the non-negotiables |
recommended |
Critical + high + medium โ solid baseline (default) |
strict |
All findings including low-impact settings |
pip.conf settings managed:
| Setting | Level | Why |
|---|---|---|
require-hashes = true |
critical | Prevents MITM/tampered packages |
no-binary (avoid for critical pkgs) |
medium | Prefer auditable source |
index-url |
medium | Ensure official PyPI registry |
trusted-host (danger) |
critical | Disables SSL verification |
pyw init
Interactive wizard to generate .pygarde.yml and apply RC hardening.
pyw config [show|edit|reset|path]
Manage configuration.
pyw config show # display current config
pyw config path # print config file path
pyw config edit # open in $EDITOR
pyw config reset # reset to defaults
Configuration
pygarde reads .pygarde.yml in the project root.
severity:
threshold: medium # ignore findings below this level
fail_ci: high # exit 1 in CI when findings reach this level
rules:
install_scripts: true
network_access: true
code_execution: true
obfuscation: true
data_exfiltration: true
hidden_chars: true
typosquatting: true
policies:
enforce_rc_security: true
enforce_lockfile: true
enforce_exact_versions: false
audit_on_install: true
registry_url: "https://pypi.org/simple/"
harden_level: recommended # minimal | recommended | strict
allowlist:
- urllib3 # known false-positive
- certifi
blocklist:
- malicious-pkg
- evil-package
Supported Package Managers
| PM | Detection | Install | Audit | Harden |
|---|---|---|---|---|
| pip | โ | โ | โ (pip-audit) | โ (pip.conf) |
| poetry | โ | โ | โ | โ (poetry.toml) |
| uv | โ | โ | โ | โ (uv.toml) |
| pipenv | โ | โ | โ (pipenv check) | โ |
| pdm | โ | โ | โ | โ |
| conda | โ | โ | โ | โ |
Running Tests
pip install -e ".[dev]"
pytest
pytest -v tests/test_rules.py
pytest --tb=short
License
MIT โ see LICENSE
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 pygarde-1.0.1.tar.gz.
File metadata
- Download URL: pygarde-1.0.1.tar.gz
- Upload date:
- Size: 40.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7d18e141a8e544951b9d6ea18be1fb8b14f28ab1ae763e36ba5ee98716931316
|
|
| MD5 |
d5a39060370352939efc30c70656f28c
|
|
| BLAKE2b-256 |
673d3809fe6071a062fd37125ab048abc2267ad857a90133797c93b3eaf91858
|
File details
Details for the file pygarde-1.0.1-py3-none-any.whl.
File metadata
- Download URL: pygarde-1.0.1-py3-none-any.whl
- Upload date:
- Size: 50.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
53be1e467aac10d221b15d6f0d93485e9a1dd80cff415c5c0bccb500b7b70960
|
|
| MD5 |
109085a23f7558d741c10fe7e5632c6c
|
|
| BLAKE2b-256 |
c5821ff52f8aae3ec82018038c501497d27f2f326a3020cefbb86b04b0de69e2
|