Skip to main content

Analyze PyPI packages for suspicious behavior before installing them

Project description

PyPI Python License Open In Colab

🔬 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 si están al nivel del módulo CRITICAL
2 network urlopen(), requests.get(), socket.connect() — CRITICAL si están al nivel del módulo CRITICAL
3 filesystem Borrado de archivos (os.remove, shutil.rmtree), 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() — CRITICAL si están al nivel del módulo CRITICAL
6 obfuscation exec(base64.b64decode(...)), strings con escape hexadecimal, codecs.decode() 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 ast integrado de Python

Llamadas al nivel del módulo pkgxray distingue entre código que se ejecuta automáticamente al importar el paquete (nivel de módulo) y código dentro de funciones que requiere invocación explícita. Las llamadas peligrosas al nivel del módulo se elevan automáticamente a CRITICAL porque se ejecutarían en el momento en que el usuario hace import paquete — sin ninguna acción adicional.


Analizadores

Analizador Descripción Rango de severidad
code_exec Detecta eval(), exec(), compile(). Si la llamada está al nivel del módulo (se ejecuta al importar) → CRITICAL HIGH – CRITICAL
network Detecta urlopen(), requests.get(), socket.connect() y similares. Nivel de módulo → CRITICAL HIGH – CRITICAL
filesystem Detecta os.remove(), shutil.rmtree(), y referencias a rutas sensibles (/etc/passwd, ~/.ssh/, ~/.aws/) HIGH – CRITICAL
env_access Detecta os.environ, os.getenv(), acceso a API keys, tokens y contraseñas LOW – HIGH
subprocess Detecta subprocess.Popen(), subprocess.run(), os.system(), os.execvp(). Nivel de módulo → CRITICAL HIGH – CRITICAL
obfuscation Detecta exec(base64.b64decode(...)), bytes.fromhex(), strings con secuencias hexadecimales, codecs.decode() rot13 MEDIUM – CRITICAL
setup_scripts Detecta hooks post-instalación en setup.py que sobreescriben install.run(), e importaciones de módulos de red 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

pkgxray-0.2.1.tar.gz (43.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pkgxray-0.2.1-py3-none-any.whl (27.7 kB view details)

Uploaded Python 3

File details

Details for the file pkgxray-0.2.1.tar.gz.

File metadata

  • Download URL: pkgxray-0.2.1.tar.gz
  • Upload date:
  • Size: 43.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for pkgxray-0.2.1.tar.gz
Algorithm Hash digest
SHA256 74eb35049eb4266de1aa0f82b6a8dcd416a26b233a6fd2491a25060e626283cc
MD5 c6046a316e7eaf4bc9fb1281f0c9a536
BLAKE2b-256 e806b96b0e0619ac5413d976b895c4a2a9181e58b09f48535f38e7abd9ad22b2

See more details on using hashes here.

File details

Details for the file pkgxray-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: pkgxray-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 27.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for pkgxray-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3853bed273ea1c90735c96fe7bc025dbbbdb1f9b4810e66148f7dfc471fc65a9
MD5 f06ca4638f3a947e73558d421d776822
BLAKE2b-256 7e30b84716ccce0b506f598a7d2ac92e3576557307d30fd6c0e6c2a90faab636

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page