
fleet-cve-scanner v1.1.0
Uno scanner CVE open-source e a script singolo per flotte gestite con RMM. Puro PowerShell 7 — unisce l'inventario software del tuo RMM con NVD, CISA KEV, EPSS e SSVC per rispondere: questa versione è vulnerabile e quanto è urgente?
fleet-cve-scanner
Uno scanner CVE open-source e a script singolo per flotte gestite tramite RMM. Puro PowerShell 7, senza agenti, senza appliance, senza costi di licenza.
Risponde a una domanda per ogni software su ogni endpoint che gestisci: la versione installata è nota come vulnerabile e quanto è urgente? — unendo l'inventario software del tuo RMM con feed di sicurezza gratuiti e autorevoli:
- NIST NVD — CVE note + intervalli di versione interessati
- CISA KEV — sfruttate attivamente in libertà (supera la soglia del punteggio)
- EPSS — probabilità di sfruttamento nei prossimi 30 giorni
- CISA SSVC — decisioni di priorità agisci / presidia / monitora
- MSRC — prova che una patch Microsoft copre già la scoperta
- endoflife.date — software che non riceverà più patch
Output: un report CSV per dispositivo, uno storico SQLite con orologi SLA ed eventi di modifica settimana su settimana, un dashboard HTML autonomo e un report opzionale in markdown sulle esposizioni.
Stato
v1.0.0. Il motore è stato portato da zero da uno scanner eseguito settimanalmente in produzione su una flotta Windows (vedi docs/HISTORY.md). Prima di questo rilascio, i due sono stati eseguiti sulla stessa flotta live e confrontati riga per riga: su decine di migliaia di rilevamenti in cui entrambi vedevano lo stesso (dispositivo, software, versione), ogni campo calcolato — stato, CVSS, gravità, flag KEV, decisione SSVC, versione di fix — corrispondeva esattamente.
Tale confronto copre la logica di verdetto. Non ha esercitato il livello storico/SLA e non sostituisce la validazione dello strumento nel tuo ambiente. Leggi docs/known-limitations.md prima di fidarti — è scritto per essere onesto, non lusinghiero.
Avvio rapido
Ti serve PowerShell 7 (pwsh). Due modi per eseguirlo:
A. Scansione NinjaOne live
cp config.example.json config.json
# modifica config.json: inserisci ninjaone.client_id / client_secret / base_url,
# imposta output.report_dir e (consigliato) nvd.api_key
pwsh -File fleet-cve-scan.ps1
B. Offline — qualsiasi RMM, SCCM o Intune (nessun accesso API)
Esporta il tuo inventario in un CSV con colonne hostname, software, version (opzionale device_id, os), quindi:
cp config.example.json config.json # qui serve solo output.report_dir
pwsh -File fleet-cve-scan.ps1 -InputCsv inventory.csv
-InputCsv non effettua nessuna chiamata NinjaOne — niente OAuth, niente API. Interroga comunque NVD e gli altri feed pubblici, quindi ti serve comunque un nvd.api_key in config.json e un output.report_dir valido. Vedi docs/rmm-adapters.md per il contratto di input e le ricette di esportazione per RMM specifici.
Installazione dei prerequisiti
- PowerShell 7 — macOS:
brew install powershell; Windows:winget install Microsoft.PowerShell; Debian/Ubuntu: installa dal repository dei pacchetti Microsoft (packages.microsoft.com). - sqlite3 (opzionale, abilita storico/trend) — macOS: preinstallato o
brew install sqlite; Debian/Ubuntu:apt-get install sqlite3; Windows: scarica il bundle "tools" di SQLite da sqlite.org e mettisqlite3.exenelPATHo accanto allo script. Senza di esso la scansione funziona comunque;first_seenviene impostato alla data di esecuzione.
Requisiti
- PowerShell 7 (7.4+ consigliato). La scansione parallela richiede 7.0+.
- sqlite3 — opzionale; abilita il DB storico, i trend e il tracciamento SLA
first_seen. Se assente = quelle funzionalità vengono saltate, la scansione completa comunque. - Traffico di rete in uscita verso NVD, CISA (KEV),
epss.empiricalsecurity.com(l'host del punteggio bulk EPSS — FIRST ha spostato lì l'hosting dei dati EPSS), MSRC, endoflife.date e raw.github.com (CVE ProgramcvelistV5) — oltre all'API NinjaOne in modalità live. - Credenziali — modalità live necessita di client id/secret OAuth2 di NinjaOne; modalità offline necessita solo di un CSV di inventario. Una chiave API NVD è tecnicamente opzionale ma di fatto richiesta a scala di flotta: NVD consente 50 richieste/30s con chiave e solo 5/30s senza. Lo scanner rileva quale hai e si adatta di conseguenza, quindi un'esecuzione senza chiave è corretta ma circa 10x più lenta — va bene per una manciata di prodotti, impraticabile per una flotta reale. Le chiavi sono gratuite.
Riferimento configurazione
La configurazione è un file JSON (predefinito config.json accanto allo script; sovrascrivere con -ConfigPath). Inizia da config.example.json. Ogni chiave che lo scanner legge, il suo valore predefinito quando omessa e cosa fa:
ninjaone (modalità live)
| Chiave | Predefinito | Scopo |
|---|---|---|
ninjaone.client_id | "" | ID client OAuth2 API NinjaOne. Richiesto per scansioni live; lascia vuoto per -InputCsv. |
ninjaone.client_secret | "" | Segreto client OAuth2 API NinjaOne. |
ninjaone.base_url | — (l'esempio fornisce https://app.ninjarmm.com) | URL base API NinjaOne; richiesto per scansioni live, nessun fallback predefinito. Usa l'host della tua regione (es. eu.ninjarmm.com, oc.ninjarmm.com). |
nvd
| Chiave | Predefinito | Scopo |
|---|---|---|
nvd.api_key | "" | Chiave API NVD, inviata come header apiKey. Vuota esegue autenticazione non autenticata, che abbassa i valori predefiniti per nvd_rate_limit e nvd_min_spacing_ms al limite anonimo di NVD (4/30s, 6500ms) invece di quello autenticato (48/30s, 700ms). Gratuito e ~10x più veloce. |
Scansione e punteggio
| Chiave | Predefinito | Scopo |
|---|---|---|
cvss_threshold | 7.0 | Punteggio base CVSS minimo affinché un CVE con punteggio venga segnalato come VULNERABILE. I CVE presenti nell'elenco KEV bypassano questa soglia. |
ssvc_mission_prevalence | high | Input stakeholder SSVC Mission Prevalence (low / medium / high). |
ssvc_public_wellbeing | high | Input stakeholder SSVC Public Well-being (low / medium / high). |