
Automatisierter Sicherheitsmonitor für die Lieferkette, der PyPI- und npm-Registries abfragt, neue Versionen mit Vorgängern vergleicht und LLM-Analysen verwendet, um bösartige Codeänderungen mit Slack-Benachrichtigungen zu erkennen.
Automatisierte Überwachung der wichtigsten PyPI- und npm-Pakete auf Kompromittierung der Lieferkette. Fragt beide Registries regelmäßig nach neuen Versionen ab, erstellt Diffs zwischen jeder neuen und der vorherigen Version und verwendet ein LLM (über Cursor Agent CLI), um die Diffs als gutartig oder bösartig zu klassifizieren. Bei bösartigen Funden wird eine Slack-Benachrichtigung ausgelöst.
Standardmäßig werden beide Ökosysteme überwacht. Mit --no-pypi oder --no-npm kann eines deaktiviert werden.
Jedes Ökosystem führt seinen eigenen Polling-Thread, teilt sich aber die Analyse- und Benachrichtigungspipeline.
┌─── 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 │
└───────────────┘
Die LLM-Analyse wird gezielt nach folgenden Mustern durchsucht:
pip install -r requirements.txt (die Standardbibliothek deckt den Großteil des Tools ab; requests wird für Slack-Uploads verwendet)agent-Binary, nicht die IDEWindows (PowerShell):
irm 'https://cursor.com/install?win32=true' | iex
macOS / Linux:
curl https://cursor.com/install -fsS | bash
Überprüfen mit:
agent --version
Sie müssen bei Cursor authentifiziert sein (agent login oder CURSOR_API_KEY setzen).
Platzieren Sie Ihren Slack-Bot-Token in etc/slack.json:
{
"url": "https://hooks.slack.com/services/...",
"bot_token": "xoxb-...",
"channel": "C01XXXXXXXX"
}
Der Bot benötigt die Berechtigung chat:write für den Zielkanal. Das Feld channel ist die Slack-Kanal-ID, in die Benachrichtigungen gesendet werden.
# Einmalige Ausführung: Analysiert Versionen der letzten ~10 Minuten
python monitor.py --once
# Kontinuierlich: Überwacht die Top-1000-Pakete (beide Ökosysteme), alle 5 Minuten abfragen
python monitor.py --top 1000 --interval 300
# Produktion: Überwacht Top 15000, Benachrichtigung an Slack
python monitor.py --top 15000 --interval 300 --slack
# Nur npm, Top 5000
python monitor.py --no-pypi --npm-top 5000
# Nur PyPI
python monitor.py --no-npm
| Datei | Zweck |
|---|---|
monitor.py | Hauptorchestrator – Abfragen von PyPI + npm, Diff, Analyse, Benachrichtigung (parallele Threads) |
pypi_monitor.py | Eigenständiger PyPI-Changelog-Poller (für Erkundungszwecke) |
package_diff.py | Herunterladen und Vergleichen von zwei Versionen eines beliebigen PyPI- oder npm-Pakets |
analyze_diff.py | Senden eines Diffs an die Cursor Agent CLI, Auswertung des Befundes |
top_pypi_packages.py | Abrufen und Auflisten der Top-N-PyPI-Pakete nach Downloadzahl |
slack.py | Slack-API-Client (SendMessage, PostFile) |
etc/slack.json | Slack-Bot-Anmeldedaten |
last_serial.yaml | Gespeicherter Polling-Status (PyPI-Serial + npm-Sequenz/Epoch) |
logs/ | Tägliche Logdateien (monitor_YYYYMMDD.log) |
python monitor.py [OPTIONEN]
Optionen:
--top N Anzahl der Top-Pakete pro Ökosystem (Standard: 15000)
--interval SEK Abrufintervall in Sekunden (Standard: 300)
--once Einmaliger Durchlauf über aktuelle Ereignisse, dann Beenden
--slack Slack-Benachrichtigungen für bösartige Funde aktivieren
--model MODEL LLM-Modell überschreiben (Standard: composer-2-fast)
--debug DEBUG-Logging aktivieren (enthält rohe Agent-Ausgabe)
PyPI-Optionen:
--no-pypi PyPI-Überwachung deaktivieren
--serial N Start-Serial für PyPI-Changelog
npm-Optionen:
--no-npm npm-Überwachung deaktivieren
--npm-top N Top-N-npm-Pakete überwachen (Standard: gleicher Wert wie --top)
--npm-seq N Start-Sequenz für npm-Replikation
PyPI und npm laufen jeweils in einem eigenen Polling-Thread. Der Polling-Status (PyPI-Serial, npm-Sequenz + Epoch) wird in last_serial.yaml gespeichert, sodass der Monitor nach einem Neustart dort weitermacht, wo er aufgehört hat.
PyPI-Pipeline:
--interval Sekunden changelog_since_serial() auf – ein einzelner API-Aufruf, der alle Ereignisse seit der letzten Prüfung zurückgibt"new release"-Ereignissen, die der Watchlist entsprechen