Supply Chain Attack prevention tool
Project description
PipCanary
Supply Chain Attack Prevention Tool for Python Packages
PipCanary helps protect your Python projects from supply chain attacks by:
- Detecting suspicious filesystem behavior in package installation (e.g., access to SSH keys, sensitive directories, etc.)
- Checking for known vulnerabilities in packages
- Enforcing a cool-down period on newly uploaded package versions, giving security researchers and scanners time to identify malicious releases
It acts as a safety layer on top of your existing dependency management workflow.
Features
- Behavioral analysis during package installation and loading using
straceandbubblewrapsandboxing - Known vulnmerability checks warns about known vulnerabilities
- Upload time checks warns about packages released too recently (default: 7 days)
Limitations
There are natural limitations to all checks PipCanary performs so running PipCanary is no gurantee to be secure. As such PipCanary (as well as any other security tool) can only be a part of a wider security strategy!
Maturity
This project is in early development. While it already provides meaningful protection, expect occasional rough edges. However, it's more secure than using plain pip, poetry, or uv without additional safeguards.
Requirements
- Linux
- Python 3.10 or higher
- bubblewrap (sandboxing tool)
- strace (file access tracking)
- pip
Installing dependencies on Ubuntu/Debian
sudo apt update
sudo apt install bubblewrap strace
Installation
pip install pipcanary
Usage
Basic Check
Scan a requirements.txt for potential supply chain risks:
pipcanary -r requirements.txt
without argument, it checks the pyproject.toml or requirements.txt in the current directory.
pipcanary
Example Outputs
All packages look safe:
...
All packages appear to be safe!
Suspicious behaviour detected:
...
Found suspicious access to /home/sebastian/.ssh in package evilpack.
Description: SSH private key exfiltration.
Explanation: The package might be trying to steal your Secure Shell private keys.
This could be dangerous!!!
Don't install this package under any circumstances until you know for sure that this is a false positive!
In doubt, contact the package maintainers!
Not that PipCanary immediately kills the scanning process once it detects suspicious behaviour to prevent damage!
Known vulnerabilities detected:
...
Package pip:25.0.1 has known vulnerabilities: ECHO-ffe1-1d3c-d9bc, ECHO-7db2-03aa-5591, GHSA-6vgw-5pg2-w6jp, GHSA-4xh5-x5gv-qwph.
Vulnerabilities in the following package(s) were found: pip:25.0.1.
Recently uploaded packages (cool-down warning):
...
Package click 8.3.2 was updated too recently: 2026-04-03T19:14:45.
It might be safer to use an older version.
Consider click<=8.3.1 or earlier and check for known vulnerabilities.
If you are certain that the latest version is safe, you can allow it with:
--allow-upload-time='click<=2026-04-03T19:14:45'
Advanced Usage
usage: PipCanary [-h] [-r REQUIREMENT] [-p PROJECT] [--max-upload-time MAX_UPLOAD_TIME] [-c COOL_DOWN_PHASE_DAYS] [-a ALLOW_UPLOAD_TIME]
[-d ADDITIONAL_DIRECTORY] [-t TRACE_FILE] [--sandbox | --no-sandbox] [--do-not-scan DO_NOT_SCAN] [-i INDEX_URL]
[--extra-index-url EXTRA_INDEX_URL] [--ignore-vuln IGNORE_VULN]
Detects supply chain attacks in python dependencies
options:
-h, --help show this help message and exit
-r REQUIREMENT, --requirement REQUIREMENT
The requirements file, usually requirements.txt.
-p PROJECT, --project PROJECT
The project file in TOML format. Usually pyproject.toml. If neither -p or -r are set, ./pyproject.toml or if not exists
./requirements.txt is scanned.
--max-upload-time MAX_UPLOAD_TIME
Maximum upload time for all packages (ISO 8601 date and time format). Example: --max-upload-
time='2026-04-07T07:43:51+0000'
-c COOL_DOWN_PHASE_DAYS, --cool-down-phase-days COOL_DOWN_PHASE_DAYS
Cool-down phase for packages in days for new package uploads. Default: 7
-a ALLOW_UPLOAD_TIME, --allow-upload-time ALLOW_UPLOAD_TIME
Maximum upload time for a single package (ISO 8601 date and time format). Example: --allow-upload-
time='requests<=2026-04-07T07:43:51+0000
-d ADDITIONAL_DIRECTORY, --additional-directory ADDITIONAL_DIRECTORY
Additional directory mapped into the sandbox while scanningMake sure this directory does not contain sensitive
information!
-t TRACE_FILE, --trace-file TRACE_FILE
The trace file for further analysis
--sandbox, --no-sandbox
Run with sandbox (default). No sandbox might be safe if you are already running within a sandbox!
--do-not-scan DO_NOT_SCAN
Add packages that should not be scanned
-i INDEX_URL, --index-url INDEX_URL
URL to PyPi compatible repository
--extra-index-url EXTRA_INDEX_URL
Extra URL to PyPi compatible repository
--ignore-vuln IGNORE_VULN
Ignore the given vulnerability
Similar Projects
Further Information on PyPi Suppy Chain Attacks
Project details
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 pipcanary-0.0.9.tar.gz.
File metadata
- Download URL: pipcanary-0.0.9.tar.gz
- Upload date:
- Size: 19.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c0689ae5a51655c8f3a78084e42e2a8fdd4bfdfb12f3051578e66446fd1dd755
|
|
| MD5 |
77f24670de02939c960779ac24cdbcd3
|
|
| BLAKE2b-256 |
a38afb8879a9a9bbfefb94722ceabca05694c4b82fe19bc448e3e6abe4f8f3b0
|
File details
Details for the file pipcanary-0.0.9-py3-none-any.whl.
File metadata
- Download URL: pipcanary-0.0.9-py3-none-any.whl
- Upload date:
- Size: 19.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
522f9e121eaaeb0742e221038531b2d12a41e7b67feac70990e9d749b7a8efbe
|
|
| MD5 |
3e70354c1097bacba4a6d80a6f1ef5b5
|
|
| BLAKE2b-256 |
f95b40dfe7bbaf2e65c03ee006f753724fc2f08a14e9f4020de31b6c7e856ae7
|