
# Escáner de Seguridad para Archivos Python Wheel — analiza archivos .whl en busca de problemas de seguridad antes de la instalación. Detecta path traversal (CVE-2026-24049), manipulación de RECORD, sombreado de comandos, secretos y bombas zip. Sin dependencias.
Escáner de seguridad para archivos Python Wheel — analiza archivos .whl en busca de problemas de seguridad antes de la instalación.
Motivado por CVEs recientes en el manejo de wheels de Python:
Cero dependencias. Un solo archivo. Python 3.9+.
pip-audit verifica si tus paquetes tienen CVEs conocidos. wheelaudit verifica si un archivo wheel en sí mismo es estructuralmente malicioso — path traversal, hashes RECORD manipulados, secretos incrustados, sombreado de comandos, zip bombs y más. Es la diferencia entre "¿se sabe que este paquete es malo?" y "¿este paquete parece malo?"
Ejecútalo antes de pip install. Ejecútalo en CI. Ejecútalo en wheels descargados en los que no confías.
# Simplemente copia el archivo
curl -O https://raw.githubusercontent.com/kriskimmerle/wheelaudit/main/wheelaudit.py
chmod +x wheelaudit.py
# O clona el repositorio
git clone https://github.com/kriskimmerle/wheelaudit.git
cd wheelaudit
# Analiza un archivo wheel
python3 wheelaudit.py package-1.0.0-py3-none-any.whl
# Analiza múltiples wheels
python3 wheelaudit.py *.whl
# Analiza un directorio de wheels
python3 wheelaudit.py ./wheels/
# Modo CI: sale con código 1 si la puntuación está por debajo del umbral
python3 wheelaudit.py package.whl --check --min-score 80
# Salida JSON para integración con herramientas
python3 wheelaudit.py package.whl --json
# Modo verboso con detalles
python3 wheelaudit.py package.whl -v
# Filtra por severidad
python3 wheelaudit.py package.whl --severity high
# Ignora reglas específicas
python3 wheelaudit.py package.whl --ignore WH11
# Lee desde stdin
cat package.whl | python3 wheelaudit.py --stdin
| Regla | Severidad | Descripción |
|---|---|---|
| WH01 | CRÍTICA | Path traversal en nombres de archivo (../, rutas absolutas, bytes nulos) |
| WH02 | CRÍTICA-ALTA | Integridad del archivo RECORD (faltante, hashes manipulados, archivos no listados) |
| WH03 | ALTA-BAJA | Tipos de archivo sospechosos (ejecutables, pickle, archivos comprimidos, archivos ocultos) |
| WH04 | CRÍTICA | Sombreado de comandos de punto de entrada (pip, python, sudo, etc.) |
| WH05 | CRÍTICA | Secretos incrustados (claves API, tokens, claves privadas) |
| WH06 | CRÍTICA-BAJA | Problemas de permisos de archivo (SUID/SGID, escribible por todos, datos ejecutables) |
| WH07 | ALTA-MEDIA | Consistencia de metadatos (METADATA/WHEEL faltantes, problemas estructurales) |
| WH08 | ALTA | Detección de zip bomb (ratios de compresión extremos, archivos sobredimensionados) |
| WH09 | ALTA-MEDIA | Cumplimiento de PEP 427 (formato de nombre de archivo, discrepancia nombre/versión) |
| WH10 | CRÍTICA | Colisión de espacios de nombres (sombreado de módulos de la stdlib) |
| WH11 | ALTA-MEDIA | Patrones de código malicioso (eval, exec, os.system, acceso a credenciales) |
| WH12 | MEDIA-BAJA | Problemas de archivos de datos (scripts en .data/, archivos sobredimensionados) |
| WH13 | ALTA | Manipulación de CRC32 (patrón de evasión CVE-2025-1889) |
| WH14 | ALTA | Discrepancia de extensión (binario ELF/PE disfrazado como .py/.txt) |
| WH15 | ALTA-MEDIA | Enlaces simbólicos y nombres de archivo duplicados |
CRÍTICA (20 puntos): Path traversal, bits SUID, secretos incrustados, sombreado de comandos, sombreado de stdlib, manipulación de hashes RECORD
ALTA (12 puntos): RECORD faltante, ejecutables sospechosos, zip bombs, manipulación de CRC, discrepancia de extensión, enlaces simbólicos, patrones de recolección de credenciales
MEDIA (6 puntos): Rutas con barras invertidas, metadatos faltantes, problemas de PEP 427, patrones de subprocesos/red
BAJA (2 puntos): Archivos ocultos, archivos de datos ejecutables, archivos grandes
INFO (0 puntos): Extensiones nativas legítimas, acceso a variables de entorno
============================================================
requests 2.32.5 — B (88/100)
============================================================
[ALTA]
WH11 Patrón sospechoso: __import__() — importación dinámica (requests/packages.py)
Resumen: 1 alta
============================================================
evil-pip 99.0.0 — F (0/100)
============================================================
[CRÍTICA]
WH01 Path traversal en archivo wheel (../../../etc/crontab)
WH04 El punto de entrada sombrea un comando del sistema: 'pip'
WH04 El punto de entrada sombrea un comando del sistema: 'python'
WH05 Secreto incrustado: GitHub Personal Access Token (pip/__init__.py)
[ALTA]
WH02 Archivo no listado en RECORD (../../../etc/crontab)
WH03 Tipo de archivo sospechoso: .exe (pip/payload.exe)
WH11 Patrón sospechoso: os.system() — ejecución de comandos de shell
WH11 Patrón sospechoso: llamada a eval() — ejecución dinámica de código
WH11 Patrón sospechoso: referencia al directorio SSH
Resumen: 4 críticas, 5 altas, 2 medias, 2 bajas
{
"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 trata cada archivo .whl como un archivo zip no confiable. Este:
No se extraen archivos al disco. Todo el análisis ocurre en memoria.
| Característica | wheelaudit | pip-audit | safety | GuardDog |
|---|---|---|---|---|
| Cero dependencias | ✅ | ❌ | ❌ | ❌ |
| Analiza el contenido del wheel | ✅ | ❌ | ❌ | ✅ |
| Detección de path traversal | ✅ | ❌ | ❌ | ❌ |
| Integridad del RECORD | ✅ | ❌ | ❌ | ❌ |
| Base de datos de CVEs | ❌ | ✅ | ✅ | ❌ |
| Operación sin conexión | ✅ | ❌ | ❌ | ❌ |
| Python 3.9+ | ✅ | ✅ | ✅ | ✅ |
wheelaudit complementa a pip-audit/safety — ellos verifican vulnerabilidades conocidas, wheelaudit verifica el wheel en sí mismo.
MIT