
# Scanner di Sicurezza per File Python Wheel — analizza i file .whl per problemi di sicurezza prima dell'installazione. Rileva path traversal (CVE-2026-24049), manomissione di RECORD, shadowing dei comandi, segreti, zip bomb. Zero dipendenze.
Scanner di sicurezza per file Python Wheel — analizza i file .whl per individuare problemi di sicurezza prima dell'installazione.
Motivato da recenti CVE nella gestione dei wheel Python:
Zero dipendenze. File singolo. Python 3.9+.
pip-audit verifica se i tuoi pacchetti hanno CVE note. wheelaudit verifica se un file wheel stesso è strutturalmente dannoso — path traversal, hash RECORD manomessi, segreti incorporati, shadowing di comandi, zip bomb e altro. È la differenza tra "questo pacchetto è noto come dannoso?" e "questo pacchetto sembra dannoso?"
Eseguilo prima di pip install. Eseguilo in CI. Eseguilo su wheel scaricati di cui non ti fidi.
# Basta copiare il file
curl -O https://raw.githubusercontent.com/kriskimmerle/wheelaudit/main/wheelaudit.py
chmod +x wheelaudit.py
# Oppure clonare il repository
git clone https://github.com/kriskimmerle/wheelaudit.git
cd wheelaudit
# Analizza un file wheel
python3 wheelaudit.py package-1.0.0-py3-none-any.whl
# Analizza più wheel
python3 wheelaudit.py *.whl
# Analizza una directory di wheel
python3 wheelaudit.py ./wheels/
# Modalità CI: esce con 1 se il punteggio è sotto la soglia
python3 wheelaudit.py package.whl --check --min-score 80
# Output JSON per l'integrazione con strumenti
python3 wheelaudit.py package.whl --json
# Modalità verbosa con dettagli
python3 wheelaudit.py package.whl -v
# Filtra per gravità
python3 wheelaudit.py package.whl --severity high
# Ignora regole specifiche
python3 wheelaudit.py package.whl --ignore WH11
# Leggi da stdin
cat package.whl | python3 wheelaudit.py --stdin
| Regola | Gravità | Descrizione |
|---|---|---|
| WH01 | CRITICAL | Path traversal nei nomi file (../, percorsi assoluti, byte nulli) |
| WH02 | CRITICAL-HIGH | Integrità del file RECORD (mancante, hash manomessi, file non elencati) |
| WH03 | HIGH-LOW | Tipi di file sospetti (eseguibili, pickle, archivi, file nascosti) |
| WH04 | CRITICAL | Shadowing di comandi di entry point (pip, python, sudo, ecc.) |
| WH05 | CRITICAL | Segreti incorporati (chiavi API, token, chiavi private) |
| WH06 | CRITICAL-LOW | Problemi di permessi file (SUID/SGID, scrivibili da tutti, dati eseguibili) |
| WH07 | HIGH-MEDIUM | Coerenza dei metadati (METADATA/WHEEL mancanti, problemi strutturali) |
| WH08 | HIGH | Rilevamento zip bomb (rapporti di compressione estremi, archivi sovradimensionati) |
| WH09 | HIGH-MEDIUM | Conformità PEP 427 (formato nome file, disallineamento nome/versione) |
| WH10 | CRITICAL | Collisione di namespace (shadowing di moduli stdlib) |
| WH11 | HIGH-MEDIUM | Pattern di codice dannosi (eval, exec, os.system, accesso alle credenziali) |
| WH12 | MEDIUM-LOW | Problemi con file di dati (script in .data/, file sovradimensionati) |
| WH13 | HIGH | Manipolazione CRC32 (pattern di bypass CVE-2025-1889) |
| WH14 | HIGH | Disallineamento estensione (binario ELF/PE mascherato da .py/.txt) |
| WH15 | HIGH-MEDIUM | Symlink e nomi file duplicati |
CRITICAL (20 punti): Path traversal, bit SUID, segreti incorporati, shadowing di comandi, shadowing stdlib, manomissione hash RECORD
HIGH (12 punti): RECORD mancante, eseguibili sospetti, zip bomb, manipolazione CRC, disallineamento estensione, symlink, pattern di raccolta credenziali
MEDIUM (6 punti): Percorsi con backslash, metadati mancanti, problemi PEP 427, pattern subprocess/network
LOW (2 punti): File nascosti, file di dati eseguibili, file di grandi dimensioni
INFO (0 punti): Estensioni native legittime, accesso a variabili d'ambiente
============================================================
requests 2.32.5 — B (88/100)
============================================================
[HIGH]
WH11 Pattern sospetto: __import__() — import dinamico (requests/packages.py)
Riepilogo: 1 high
============================================================
evil-pip 99.0.0 — F (0/100)
============================================================
[CRITICAL]
WH01 Path traversal nell'archivio wheel (../../../etc/crontab)
WH04 L'entry point oscura il comando di sistema: 'pip'
WH04 L'entry point oscura il comando di sistema: 'python'
WH05 Segreto incorporato: GitHub Personal Access Token (pip/__init__.py)
[HIGH]
WH02 File non elencato in RECORD (../../../etc/crontab)
WH03 Tipo di file sospetto: .exe (pip/payload.exe)
WH11 Pattern sospetto: os.system() — esecuzione di comandi shell
WH11 Pattern sospetto: chiamata eval() — esecuzione dinamica di codice
WH11 Pattern sospetto: riferimento alla directory SSH
Riepilogo: 4 critical, 5 high, 2 medium, 2 low
{
"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 tratta ogni file .whl come un archivio zip non attendibile. Esso:
Nessun file viene estratto su disco. Tutta l'analisi avviene in memoria.
| Funzionalità | wheelaudit | pip-audit | safety | GuardDog |
|---|---|---|---|---|
| Zero dipendenze | ✅ | ❌ | ❌ | ❌ |
| Analizza i contenuti dei wheel | ✅ | ❌ | ❌ | ✅ |
| Rilevamento path traversal | ✅ | ❌ | ❌ | ❌ |
| Integrità RECORD | ✅ | ❌ | ❌ | ❌ |
| Database CVE | ❌ | ✅ | ✅ | ❌ |
| Funzionamento offline | ✅ | ❌ | ❌ | ❌ |
| Python 3.9+ | ✅ | ✅ | ✅ | ✅ |
wheelaudit integra pip-audit/safety — loro verificano le vulnerabilità note, wheelaudit verifica il wheel stesso.
MIT