
Monitor automatizado de segurança da cadeia de suprimentos que consulta os registros PyPI e npm, compara novas versões com as anteriores e utiliza análise de LLM para detectar alterações maliciosas de código, com alertas no Slack.
Monitoramento automatizado dos principais pacotes PyPI e npm para comprometimento da cadeia de suprimentos. Consulta ambos os registros em busca de novos lançamentos, faz diff de cada lançamento em relação ao seu predecessor e usa um LLM (via Cursor Agent CLI) para classificar os diffs como benignos ou maliciosos. Descobertas maliciosas disparam um alerta no Slack.
Ambos ecossistemas são monitorados por padrão. Use --no-pypi ou --no-npm para desabilitar um.
Cada ecossistema executa sua própria thread de consulta, mas compartilha o pipeline de análise e alerta.
┌─── 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 │
└───────────────┘
A análise do LLM é instruída a procurar por:
pip install -r requirements.txt (a stdlib cobre a maior parte da ferramenta; requests é usado para uploads no Slack)agent, não o IDEWindows (PowerShell):
irm 'https://cursor.com/install?win32=true' | iex
macOS / Linux:
curl https://cursor.com/install -fsS | bash
Verifique com:
agent --version
Você deve estar autenticado com o Cursor (agent login ou definir CURSOR_API_KEY).
Coloque seu token do bot do Slack em etc/slack.json:
{
"url": "https://hooks.slack.com/services/...",
"bot_token": "xoxb-...",
"channel": "C01XXXXXXXX"
}
O bot precisa do escopo chat:write no canal de destino. O campo channel é o ID do canal do Slack onde os alertas são postados.
# Única execução: analisa lançamentos dos últimos ~10 minutos
python monitor.py --once
# Contínuo: monitora os 1000 principais pacotes (ambos ecossistemas), consulta a cada 5 minutos
python monitor.py --top 1000 --interval 300
# Produção: monitora os 15000 principais, alerta para o Slack
python monitor.py --top 15000 --interval 300 --slack
# Apenas npm, top 5000
python monitor.py --no-pypi --npm-top 5000
# Apenas PyPI
python monitor.py --no-npm
| Arquivo | Finalidade |
|---|---|
monitor.py | Orquestrador principal — consulta PyPI + npm, diff, analisa, alerta (threads paralelas) |
pypi_monitor.py | Consultor PyPI autônomo (usado para exploração) |
package_diff.py | Baixa e compara duas versões de qualquer pacote PyPI ou npm |
analyze_diff.py | Envia um diff para o Cursor Agent CLI, analisa veredito |
top_pypi_packages.py | Busca e lista os N principais pacotes PyPI por contagem de downloads |
slack.py | Cliente da API do Slack (SendMessage, PostFile) |
etc/slack.json | Credenciais do bot do Slack |
last_serial.yaml | Estado de consulta persistido (serial PyPI + sequência/época npm) |
logs/ | Arquivos de log diários (monitor_YYYYMMDD.log) |
python monitor.py [OPÇÕES]
Opções:
--top N Número de pacotes principais a observar por ecossistema (padrão: 15000)
--interval SECS Intervalo de consulta em segundos (padrão: 300)
--once Única passagem sobre eventos recentes, depois sai
--slack Habilita alertas do Slack para descobertas maliciosas
--model MODEL Substitui o modelo LLM (padrão: composer-2-fast)
--debug Habilita log DEBUG (inclui saída bruta do agent)
Opções PyPI:
--no-pypi Desabilita monitoramento PyPI
--serial N Serial do changelog PyPI para iniciar
Opções npm:
--no-npm Desabilita monitoramento npm
--npm-top N Top N pacotes npm a observar (padrão: igual a --top)
--npm-seq N Sequência de replicação npm para iniciar
PyPI e npm cada um executa em sua própria thread de consulta. O estado da consulta (serial PyPI, sequência + época npm) é persistido em last_serial.yaml para que o monitor retome de onde parou após uma reinicialização.
Pipeline PyPI:
--interval segundos, chama changelog_since_serial() — uma única chamada de API que retorna todos os eventos desde a última verificação"new release" que correspondem à lista de observação