Analyze PyPI packages for suspicious behavior before installing them
Project description
🔬 pkgxray
Analiza paquetes de PyPI en busca de comportamiento sospechoso antes de instalarlos.
Cuando ejecutas pip install un-paquete, confías ciegamente en que el código es seguro.
pkgxray descarga el paquete sin instalarlo, extrae el código fuente y ejecuta
8 analizadores especializados basados en AST para detectar patrones maliciosos —
todo esto antes de que una sola línea del paquete se ejecute en tu máquina.
Características
pkgxray detecta 8 categorías de comportamiento sospechoso:
| # | Analizador | Qué detecta | Severidad máxima |
|---|---|---|---|
| 1 | code_exec |
Llamadas a eval(), exec(), compile() |
CRITICAL |
| 2 | network |
Conexiones de socket, solicitudes HTTP, importaciones de red sospechosas | HIGH |
| 3 | filesystem |
Escritura/borrado de archivos, rutas sensibles (/etc/passwd, ~/.ssh/) |
CRITICAL |
| 4 | env_access |
Acceso a variables de entorno (API keys, tokens, contraseñas) | HIGH |
| 5 | subprocess |
subprocess.Popen(), os.system(), ejecución de comandos de shell |
CRITICAL |
| 6 | obfuscation |
exec(base64.b64decode(...)), strings con escape hexadecimal, codificación rot13 |
CRITICAL |
| 7 | setup_scripts |
Hooks post-instalación en setup.py que ejecutan código al instalar |
CRITICAL |
| 8 | dynamic_imports |
__import__(), importlib.import_module() con argumentos dinámicos |
HIGH |
Instalación
pip install pkgxray
Inicio rápido
Interfaz de línea de comandos
# Analizar un paquete (salida en terminal con colores)
pkgxray scan requests
# Obtener salida en JSON
pkgxray scan requests --format json
# Guardar reporte HTML en archivo
pkgxray scan requests --format html -o reporte.html
# Analizar una versión específica
pkgxray scan requests --version 2.28.0
API de Python
from pkgxray import scan
from pkgxray.reporter import generate_report
# Analizar un paquete
result = scan("requests")
print(f"Puntaje de riesgo: {result.risk_score}/100")
print(f"Nivel de riesgo: {result.risk_level}")
print(f"Archivos analizados: {result.files_analyzed}")
print(f"Hallazgos totales: {len(result.findings)}")
# Inspeccionar hallazgos individuales
for finding in result.findings:
print(f"[{finding.severity.value.upper()}] {finding.analyzer_name}")
print(f" {finding.filename}:{finding.line_number}")
print(f" {finding.description}")
# Exportar como JSON
json_report = generate_report(result, format="json")
# Guardar reporte HTML
generate_report(result, format="html", output_path="reporte.html")
Docker
# Ejecutar los tests dentro de Docker
docker-compose run test
# Analizar el paquete "requests"
docker-compose run scan
# Analizar "requests" y obtener salida JSON
docker-compose run scan-json
O construir y ejecutar directamente:
docker build -t pkgxray .
docker run pkgxray scan requests
docker run pkgxray scan requests --format json
Cómo funciona
pkgxray scan <paquete>
|
v
1. DESCARGA -> Consulta la API JSON de PyPI
Descarga el .tar.gz o .whl (sin instalarlo)
|
v
2. EXTRACCIÓN -> Descomprime el archivo
Extrae todos los archivos .py (incluyendo setup.py)
|
v
3. ANÁLISIS -> Ejecuta 8 analizadores basados en AST en cada archivo
El parseo AST es robusto: no puede evadirse renombrando variables
|
v
4. PUNTUACIÓN -> Pondera hallazgos por severidad:
LOW=1 MEDIUM=3 HIGH=7 CRITICAL=15
Puntaje final: 0–100
|
v
5. REPORTE -> Salida en terminal (con colores), JSON o HTML
¿Por qué AST en lugar de regex?
- Entiende la estructura del código, no solo el texto
- Más difícil de evadir: renombrar una variable no lo engaña
- Sin dependencias adicionales — usa el módulo
astintegrado de Python
Analizadores
| Analizador | Descripción | Rango de severidad |
|---|---|---|
code_exec |
Detecta ejecución dinámica de código con eval(), exec(), compile() |
HIGH – CRITICAL |
network |
Detecta importaciones de socket, requests.get(), urlopen(), conexiones directas |
MEDIUM – HIGH |
filesystem |
Detecta escritura de archivos, os.remove(), shutil.rmtree(), acceso a /etc/passwd, ~/.ssh/ |
MEDIUM – CRITICAL |
env_access |
Detecta os.environ, os.getenv(), acceso a tokens/contraseñas/API keys |
MEDIUM – HIGH |
subprocess |
Detecta subprocess.Popen(), os.system(), os.popen(), os.execvp() |
MEDIUM – CRITICAL |
obfuscation |
Detecta exec(base64.b64decode(...)), bytes.fromhex(), strings con escape hexadecimal |
MEDIUM – CRITICAL |
setup_scripts |
Detecta hooks post-instalación en setup.py que sobreescriben install.run() |
HIGH – CRITICAL |
dynamic_imports |
Detecta __import__() e importlib.import_module() con argumentos dinámicos |
MEDIUM – HIGH |
Desarrollo
# Clonar e instalar en modo desarrollo
git clone https://github.com/maip-fred/pkgxray.git
cd pkgxray
pip install -e ".[dev]"
# Ejecutar tests unitarios (rápidos, sin red)
pytest tests/ -v -m "not slow"
# Ejecutar todos los tests incluyendo los de integración
pytest tests/ -v
# Ejecutar con cobertura
pytest tests/ --cov=pkgxray --cov-report=html -m "not slow"
¿Por qué no usar pip-audit?
| Herramienta | Qué hace |
|---|---|
pip-audit / safety |
Busca CVEs conocidos — vulnerabilidades ya reportadas |
bandit |
Analiza tu código, no paquetes de terceros antes de instalarlos |
pkgxray |
Análisis de comportamiento de paquetes de terceros antes de instalarlos |
pkgxray es la única herramienta instalable con pip que realiza análisis AST estático sobre paquetes de PyPI antes de que los instales.
Licencia
MIT — ver LICENSE
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 pkgxray-0.1.0.tar.gz.
File metadata
- Download URL: pkgxray-0.1.0.tar.gz
- Upload date:
- Size: 36.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4fe1a9a7ea2b6c04cfad12bc11bd316ea058d0b9b2b5c235117e919174fab169
|
|
| MD5 |
69b38d25771c55c06c767815f7dff7b4
|
|
| BLAKE2b-256 |
186f54806de33cdfc47a460ce9ccb5ed9c9bdfac2442b652e485d3c2e1c69898
|
File details
Details for the file pkgxray-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pkgxray-0.1.0-py3-none-any.whl
- Upload date:
- Size: 25.6 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 |
fe0553b0722572949f141754f9b03ba38d6804d91934bba365597476dae002d3
|
|
| MD5 |
3f6c2fea9424ade7f65754488a37a771
|
|
| BLAKE2b-256 |
e76820613d277257211834d560ecdc0edf35472c6ed27efc9baf5a4514676929
|