
Python Wheel-Datei-Sicherheitsscanner — scannt .whl-Dateien vor der Installation auf Sicherheitsprobleme. Erkennt Path Traversal (CVE-2026-24049), RECORD-Manipulation, Command Shadowing, Geheimnisse und Zip-Bomben. Keine Abhängigkeiten.
Python-Wheel-Datei-Sicherheitsscanner — scanne .whl-Dateien auf Sicherheitsprobleme, bevor du sie installierst.
Motiviert durch aktuelle CVEs in der Python-Wheel-Verarbeitung:
Null Abhängigkeiten. Einzelne Datei. Python 3.9+.
pip-audit prüft, ob deine Pakete bekannte CVEs haben. wheelaudit prüft, ob eine Wheel-Datei selbst strukturell bösartig ist — Path Traversal, manipulierte RECORD-Hashes, eingebettete Geheimnisse, Command Shadowing, Zip-Bomben und mehr. Es ist der Unterschied zwischen „Ist dieses Paket bekanntermaßen schlecht?" und „Sieht dieses Paket schlecht aus?"
Führe es vor pip install aus. Führe es in CI aus. Führe es bei heruntergeladenen Wheels aus, denen du nicht vertraust.
# Einfach die Datei kopieren
curl -O https://raw.githubusercontent.com/kriskimmerle/wheelaudit/main/wheelaudit.py
chmod +x wheelaudit.py
# Oder das Repository klonen
git clone https://github.com/kriskimmerle/wheelaudit.git
cd wheelaudit
# Eine Wheel-Datei scannen
python3 wheelaudit.py package-1.0.0-py3-none-any.whl
# Mehrere Wheels scannen
python3 wheelaudit.py *.whl
# Ein Verzeichnis mit Wheels scannen
python3 wheelaudit.py ./wheels/
# CI-Modus: Exit 1, wenn der Score unter dem Schwellenwert liegt
python3 wheelaudit.py package.whl --check --min-score 80
# JSON-Ausgabe für Tooling-Integration
python3 wheelaudit.py package.whl --json
# Ausführlicher Modus mit Details
python3 wheelaudit.py package.whl -v
# Nach Schweregrad filtern
python3 wheelaudit.py package.whl --severity high
# Bestimmte Regeln ignorieren
python3 wheelaudit.py package.whl --ignore WH11
# Von stdin lesen
cat package.whl | python3 wheelaudit.py --stdin
| Regel | Schweregrad | Beschreibung |
|---|---|---|
| WH01 | KRITISCH | Path Traversal in Dateinamen (../, absolute Pfade, Null-Bytes) |
| WH02 | KRITISCH-HOCH | RECORD-Datei-Integrität (fehlend, manipulierte Hashes, nicht gelistete Dateien) |
| WH03 | HOCH-NIEDRIG | Verdächtige Dateitypen (ausführbare Dateien, Pickle, Archive, versteckte Dateien) |
| WH04 | KRITISCH | Command Shadowing von Einstiegspunkten (pip, python, sudo, usw.) |
| WH05 | KRITISCH | Eingebettete Geheimnisse (API-Schlüssel, Tokens, private Schlüssel) |
| WH06 | KRITISCH-NIEDRIG | Dateiberechtigungsprobleme (SUID/SGID, weltweit beschreibbar, ausführbare Daten) |
| WH07 | HOCH-MITTEL | Metadaten-Konsistenz (fehlende METADATA/WHEEL, strukturelle Probleme) |
| WH08 | HOCH | Zip-Bomben-Erkennung (extreme Kompressionsverhältnisse, überdimensionierte Archive) |
| WH09 | HOCH-MITTEL | PEP-427-Konformität (Dateinamenformat, Name/Versions-Abweichung) |
| WH10 | KRITISCH | Namespace-Kollision (Stdlib-Modul-Shadowing) |
| WH11 | HOCH-MITTEL | Bösartige Code-Muster (eval, exec, os.system, Zugriff auf Anmeldedaten) |
| WH12 | MITTEL-NIEDRIG | Datendatei-Probleme (Skripte in .data/, überdimensionierte Dateien) |
| WH13 | HOCH | CRC32-Manipulation (CVE-2025-1889-Bypass-Muster) |
| WH14 | HOCH | Erweiterungs-Abweichung (ELF/PE-Binary als .py/.txt getarnt) |
| WH15 | HOCH-MITTEL | Symlinks und doppelte Dateinamen |
KRITISCH (20 Punkte): Path Traversal, SUID-Bits, eingebettete Geheimnisse, Command Shadowing, Stdlib-Shadowing, RECORD-Hash-Manipulation
HOCH (12 Punkte): Fehlende RECORD, verdächtige ausführbare Dateien, Zip-Bomben, CRC-Manipulation, Erweiterungs-Abweichung, Symlinks, Muster zur Ernte von Anmeldedaten
MITTEL (6 Punkte): Backslash-Pfade, fehlende Metadaten, PEP-427-Probleme, Subprozess-/Netzwerk-Muster
NIEDRIG (2 Punkte): Versteckte Dateien, ausführbare Datendateien, große Dateien
INFO (0 Punkte): Legitime native Erweiterungen, Zugriff auf Umgebungsvariablen
============================================================
requests 2.32.5 — B (88/100)
============================================================
[HOCH]
WH11 Verdächtiges Muster: __import__() — dynamischer Import (requests/packages.py)
Zusammenfassung: 1 hoch
============================================================
evil-pip 99.0.0 — F (0/100)
============================================================
[KRITISCH]
WH01 Path Traversal im Wheel-Archiv (../../../etc/crontab)
WH04 Einstiegspunkt überschattet Systembefehl: 'pip'
WH04 Einstiegspunkt überschattet Systembefehl: 'python'
WH05 Eingebettetes Geheimnis: GitHub Personal Access Token (pip/__init__.py)
[HOCH]
WH02 Datei nicht in RECORD gelistet (../../../etc/crontab)
WH03 Verdächtiger Dateityp: .exe (pip/payload.exe)
WH11 Verdächtiges Muster: os.system() — Shell-Befehlsausführung
WH11 Verdächtiges Muster: eval()-Aufruf — dynamische Codeausführung
WH11 Verdächtiger Verweis auf SSH-Verzeichnis
Zusammenfassung: 4 kritisch, 5 hoch, 2 mittel, 2 niedrig
{
"version": "0.1.0",
"results": [
{
"path": "package-1.0.0-py3-none-any.whl",
"score": 88,
"grade": "B",
"metadata": {
"name": "package",
"version": "1.0.0",
"file_count": 15,
"total_uncompressed_bytes": 45000
},
"findings": [
{
"rule": "WH11",
"severity": "high",
"message": "Suspicious pattern: __import__() — dynamic import",
"file": "package/compat.py"
}
],
"summary": {
"high": 1
}
}
]
}
- name: Audit wheel
run: |
python3 wheelaudit.py dist/*.whl --check --min-score 80
pip download some-package --no-deps -d /tmp/wheels
python3 wheelaudit.py /tmp/wheels/*.whl --check
pip install /tmp/wheels/*.whl
wheelaudit behandelt jede .whl-Datei als ein nicht vertrauenswürdiges Zip-Archiv. Es:
Es werden keine Dateien auf die Festplatte extrahiert. Die gesamte Analyse erfolgt im Speicher.
| Funktion | wheelaudit | pip-audit | safety | GuardDog |
|---|---|---|---|---|
| Null Abhängigkeiten | ✅ | ❌ | ❌ | ❌ |
| Scannt Wheel-Inhalte | ✅ | ❌ | ❌ | ✅ |
| Path-Traversal-Erkennung | ✅ | ❌ | ❌ | ❌ |
| RECORD-Integrität | ✅ | ❌ | ❌ | ❌ |
| CVE-Datenbank | ❌ | ✅ | ✅ | ❌ |
| Offline-Betrieb | ✅ | ❌ | ❌ | ❌ |
| Python 3.9+ | ✅ | ✅ | ✅ | ✅ |
wheelaudit ergänzt pip-audit/safety — diese prüfen bekannte Schwachstellen, wheelaudit prüft das Wheel selbst.
MIT