
Monitor automatizado de seguridad en la cadena de suministro que consulta los registros PyPI y npm, compara las nuevas versiones con las anteriores y utiliza análisis mediante LLM para detectar cambios de código maliciosos con alertas en Slack.
Monitoreo automatizado de los paquetes principales de PyPI y npm para detectar compromisos en la cadena de suministro. Consulta ambos registros en busca de nuevas versiones, compara cada versión con su predecesora y utiliza un LLM (a través de Cursor Agent CLI) para clasificar las diferencias como benignas o maliciosas. Los hallazgos maliciosos activan una alerta en Slack.
Ambos ecosistemas se monitorean de forma predeterminada. Use --no-pypi o --no-npm para desactivar uno.
Cada ecosistema ejecuta su propio hilo de consulta, pero comparte la canalización de análisis y alertas.
┌─── PyPI ──────────────────────┐ ┌─── npm ───────────────────────┐
│ │ │ │
│ changelog_since_serial() │ │ CouchDB _changes feed │
│ │ │ │ │ │
│ ▼ │ │ ▼ │
│ ┌────────────┐ │ │ ┌────────────┐ │
│ │ All PyPI │─┐ │ │ │ All npm │─┐ │
│ │ events │ │ │ │ │ changes │ │ │
│ └────────────┘ ▼ │ │ └────────────┘ ▼ │
│ hugovk ──► Watchlist │ │ download-counts ─► Watchlist │
│ │ │ │ │ │
│ "new release" events only │ │ new versions since last epoch │
└───────────────┬───────────────┘ └───────────────┬───────────────┘
│ │
▼ ▼
┌───────────────────┐ ┌───────────────────┐
│ Download old + new│ │ Download old + new│
│ (sdist + wheel) │ │ (tarball) │
└───────────────────┘ └───────────────────┘
│ │
└─────────────────┬─────────────────┘
▼
┌───────────────┐
│ Unified diff │
│ report (.md) │
└───────┬───────┘
▼
┌───────────────┐ ◄── LLM analysis
│ Cursor Agent │ (read-only)
│ CLI (ask mode)│
└───────┬───────┘
│
verdict?
│
malicious │
▼
┌───────────────┐
│ Slack alert │
└───────────────┘
Se solicita al análisis del LLM buscar:
pip install -r requirements.txt (la stdlib cubre la mayor parte de la herramienta; requests se usa para las subidas a Slack)agent, no el IDEWindows (PowerShell):
irm 'https://cursor.com/install?win32=true' | iex
macOS / Linux:
curl https://cursor.com/install -fsS | bash
Verifique con:
agent --version
Debe estar autenticado con Cursor (agent login o establecer CURSOR_API_KEY).
Coloque su token de bot de Slack en etc/slack.json:
{
"url": "https://hooks.slack.com/services/...",
"bot_token": "xoxb-...",
"channel": "C01XXXXXXXX"
}
El bot necesita el ámbito chat:write en el canal de destino. El campo channel es el ID del canal de Slack donde se publican las alertas.
# Una sola ejecución: analizar versiones de los últimos ~10 minutos
python monitor.py --once
# Continuo: monitorear los 1000 paquetes principales (ambos ecosistemas), consultar cada 5 min
python monitor.py --top 1000 --interval 300
# Producción: monitorear los 15000 principales, alertar a Slack
python monitor.py --top 15000 --interval 300 --slack
# Solo npm, top 5000
python monitor.py --no-pypi --npm-top 5000
# Solo PyPI
python monitor.py --no-npm
| Archivo | Propósito |
|---|---|
monitor.py | Orquestador principal — consulta PyPI + npm, diff, analiza, alerta (hilos paralelos) |
pypi_monitor.py | Consultor independiente de changelog de PyPI (usado para exploración) |
package_diff.py | Descargar y comparar dos versiones de cualquier paquete de PyPI o npm |
analyze_diff.py | Enviar un diff a Cursor Agent CLI, analizar el veredicto |
top_pypi_packages.py | Obtener y listar los N paquetes principales de PyPI por descargas |
slack.py | Cliente de API de Slack (SendMessage, PostFile) |
etc/slack.json | Credenciales del bot de Slack |
last_serial.yaml | Estado de consulta persistido (serial de PyPI + secuencia/época de npm) |
logs/ | Archivos de registro diarios (monitor_YYYYMMDD.log) |
python monitor.py [OPCIONES]
Opciones:
--top N Número de paquetes principales a monitorear por ecosistema (predeterminado: 15000)
--interval SECS Intervalo de consulta en segundos (predeterminado: 300)
--once Una sola pasada sobre eventos recientes, luego salir
--slack Habilitar alertas de Slack para hallazgos maliciosos
--model MODEL Sobrescribir el modelo LLM (predeterminado: composer-2-fast)
--debug Habilitar registro DEBUG (incluye salida raw del agente)
Opciones de PyPI:
--no-pypi Deshabilitar monitoreo de PyPI
--serial N Serial del changelog de PyPI desde el que comenzar
Opciones de npm:
--no-npm Deshabilitar monitoreo de npm
--npm-top N N principales paquetes npm a monitorear (predeterminado: igual que --top)
--npm-seq N Secuencia de replicación npm desde la que comenzar
PyPI y npm se ejecutan cada uno en su propio hilo de consulta. El estado de consulta (serial de PyPI, secuencia + época de npm) se persiste en last_serial.yaml para que el monitor se reanude donde lo dejó después de un reinicio.
Canalización de PyPI:
--interval segundos, llama a changelog_since_serial() — una única llamada API que devuelve todos los eventos desde la última comprobación"new release" que coinciden con la lista de seguimiento