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
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 ast integrado 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

pkgxray-0.1.1.tar.gz (63.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.1.1-py3-none-any.whl (27.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: pkgxray-0.1.1.tar.gz
  • Upload date:
  • Size: 63.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.1.1.tar.gz
Algorithm Hash digest
SHA256 aa1253b8e89d5206ed771bbebc24bae39dd5331ee21a0c50724f103a405fd3f6
MD5 26880aeb64e66905a31fbcc146741800
BLAKE2b-256 3fa80b1990ca8aeecdf7d1af4d71f880fa0e44c8e2fcad594a4ce09c63b89a9c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pkgxray-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 27.2 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.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d218c9db6b59247d6c67072723324ef8af711d0eb4c72c31cc4b856e2bc1f904
MD5 45311e29f10fd39f253b6ee22dd1800b
BLAKE2b-256 da2df3f8b475ffef6c581e33d2a36588ddaf16765d296772e9573ac0c315b73c

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