
fleet-cve-scanner v1.1.0
Ein quelloffener, einzelskriptbasierter CVE-Scanner für RMM-verwaltete Flotten. Reines PowerShell 7 – kombiniert Ihre RMM-Softwareinventur mit NVD, CISA KEV, EPSS und SSVC, um die Frage zu beantworten: Ist diese Version anfällig und wie dringend ist das Problem?
fleet-cve-scanner
Ein Open-Source, Ein-Skript-CVE-Scanner für RMM-verwaltete Flotten. Reines PowerShell 7, keine Agents, keine Appliances, keine Lizenzgebühren.
Es beantwortet eine Frage für jede Software auf jedem von Ihnen verwalteten Endpunkt: ist die installierte Version bekanntermaßen verwundbar und wie dringend ist es? — indem es das Software-Inventar Ihres RMM mit kostenlosen, autoritativen Sicherheitsfeeds abgleicht:
- NIST NVD — bekannte CVEs + betroffene Versionsbereiche
- CISA KEV — aktiv in freier Wildbahn ausgenutzt (umgeht den Score-Schwellenwert)
- EPSS — Wahrscheinlichkeit der Ausnutzung in den nächsten 30 Tagen
- CISA SSVC — Act / Attend / Track-Priorisierungsentscheidungen
- MSRC — Nachweis, dass ein Microsoft-Patch den Fund bereits abdeckt
- endoflife.date — Software, die nie wieder gepatcht wird
Ausgaben: ein CSV-Bericht pro Gerät, eine SQLite-Historie mit SLA-Uhren und Woche-über-Woche-Änderungsereignissen, ein in sich geschlossenes HTML-Dashboard und ein optionaler Markdown-Expositionsbericht.
Status
v1.0.0. Die Engine wurde sauber aus einem Scanner portiert, der wöchentlich in Produktion gegen eine Windows-Flotte lief (siehe docs/HISTORY.md). Vor dieser Veröffentlichung wurden beide gegen dieselbe Live-Flotte ausgeführt und zeilenweise verglichen: über Zehntausende von Funden, bei denen beide eine identische (device, software, version) sahen, stimmte jedes berechnete Feld — Status, CVSS, Schweregrad, KEV-Flag, SSVC-Entscheidung, Fix-Version — exakt überein.
Dieser Vergleich deckt die Urteilslogik ab. Er hat die Historie/SLA-Ebene nicht getestet und ersetzt nicht die Validierung des Tools in Ihrer eigenen Umgebung. Lesen Sie docs/known-limitations.md, bevor Sie ihm vertrauen — es ist ehrlich geschrieben, nicht schmeichelhaft.
Schnellstart
Sie benötigen PowerShell 7 (pwsh). Zwei Möglichkeiten zur Ausführung:
A. Live-NinjaOne-Scan
cp config.example.json config.json
# edit config.json: fill ninjaone.client_id / client_secret / base_url,
# set output.report_dir, and (recommended) nvd.api_key
pwsh -File fleet-cve-scan.ps1
B. Offline — beliebiges RMM, SCCM oder Intune (kein API-Zugriff)
Exportieren Sie Ihr Inventar in eine CSV-Datei mit den Spalten hostname, software, version (optional device_id, os), dann:
cp config.example.json config.json # only output.report_dir is needed here
pwsh -File fleet-cve-scan.ps1 -InputCsv inventory.csv
-InputCsv führt null NinjaOne-Aufrufe durch — kein OAuth, keine API. Es fragt weiterhin NVD und die anderen öffentlichen Feeds ab, daher benötigen Sie weiterhin einen nvd.api_key in config.json und ein gültiges output.report_dir. Siehe docs/rmm-adapters.md für den Eingabevertrag und RMM-spezifische Exportrezepte.
Voraussetzungen installieren
- PowerShell 7 — macOS:
brew install powershell; Windows:winget install Microsoft.PowerShell; Debian/Ubuntu: aus dem Microsoft-Paket-Repo installieren (packages.microsoft.com). - sqlite3 (optional, ermöglicht Historie/Trends) — macOS: vorinstalliert oder
brew install sqlite; Debian/Ubuntu:apt-get install sqlite3; Windows: das SQLite „Tools“-Bundle von sqlite.org herunterladen undsqlite3.exein denPATHoder neben das Skript legen. Ohne es läuft der Scan trotzdem;first_seenfällt auf das Ausführungsdatum zurück.
Anforderungen
- PowerShell 7 (7.4+ empfohlen). Der parallele Scan erfordert 7.0+.
- sqlite3 — optional; ermöglicht die Historie-Datenbank, Trends und SLA
first_seen-Verfolgung. Fehlt es = diese Funktionen werden übersprungen, der Scan wird trotzdem abgeschlossen. - Netzwerk-Ausgang zu NVD, CISA (KEV),
epss.empiricalsecurity.com(dem EPSS-Bulk-Score-Host — FIRST hat das EPSS-Daten-Hosting dorthin verlegt), MSRC, endoflife.date und GitHub raw (CVE-ProgrammcvelistV5) — plus die NinjaOne API im Live-Modus. - Anmeldeinformationen — Live-Modus benötigt NinjaOne OAuth2-Client-ID/Secret; Offline-Modus benötigt nur ein Inventar-CSV. Ein NVD-API-Schlüssel ist technisch optional, aber im Flottenmaßstab praktisch erforderlich: NVD erlaubt 50 Anfragen/30s mit einem Schlüssel und nur 5/30s ohne. Der Scanner erkennt, welchen Sie haben, und drosselt entsprechend, sodass eine schlüssellose Ausführung korrekt, aber etwa 10x langsamer ist — in Ordnung für eine Handvoll Produkte, unpraktisch für eine echte Flotte. Schlüssel sind kostenlos.
Konfigurationsreferenz
Die Konfiguration ist eine JSON-Datei (standardmäßig config.json neben dem Skript; Überschreibung mit -ConfigPath). Beginnen Sie mit config.example.json. Jeder Schlüssel, den der Scanner liest, sein Standardwert, wenn er weggelassen wird, und was er tut:
ninjaone (Live-Modus)
| Key | Standard | Zweck |
|---|---|---|
ninjaone.client_id | "" | NinjaOne API OAuth2-Client-ID. Erforderlich für Live-Scans; für -InputCsv leer lassen. |
ninjaone.client_secret | "" | NinjaOne API OAuth2-Client-Geheimnis. |
ninjaone.base_url | — (Beispiel liefert https://app.ninjarmm.com) | NinjaOne API Basis-URL; erforderlich für Live-Scans, kein eingebauter Fallback. Verwenden Sie den Host Ihrer Region (z.B. eu.ninjarmm.com, oc.ninjarmm.com). |
nvd
| Key | Standard | Zweck |
|---|---|---|
nvd.api_key | "" | NVD-API-Schlüssel, als apiKey-Header gesendet. Leer läuft unauthentifiziert, was die Standardwerte für nvd_rate_limit und nvd_min_spacing_ms auf die anonyme Obergrenze von NVD (4/30s, 6500ms) anstatt auf die authentifizierte (48/30s, 700ms) setzt. Kostenlos und ~10x schneller. |
Scan & Bewertung
| Key | Standard | Zweck |
|---|---|---|
cvss_threshold | 7.0 | Minimaler CVSS-Basiswert, damit ein bewertetes CVE als VULNERABLE gemeldet wird. KEV-gelistete CVEs umgehen diese Untergrenze. |
ssvc_mission_prevalence | high | SSVC Mission Prevalence Stakeholder-Eingabe (low / medium / high). |
ssvc_public_wellbeing | high | SSVC Public Well-being Stakeholder-Eingabe (low / medium / high). |