
fleet-cve-scanner v1.1.0
Un scanner de CVE open-source et à script unique pour les flottes gérées par RMM. PowerShell 7 pur — croise votre inventaire logiciel RMM avec NVD, CISA KEV, EPSS et SSVC pour répondre à la question : cette version est-elle vulnérable, et quelle est son urgence ?
fleet-cve-scanner
Un scanner CVE open-source, mono-script pour les parcs gérés par RMM. PowerShell 7 pur, sans agents, sans appliances, sans frais de licence.
Il répond à une question pour chaque logiciel sur chaque poste que vous gérez : la version installée est-elle connue comme vulnérable, et quelle est son urgence ? — en croisant l'inventaire logiciel de votre RMM avec des flux de sécurité gratuits et reconnus :
- NIST NVD — CVEs connues + plages de versions affectées
- CISA KEV — activement exploitées dans la nature (passe outre le seuil de score)
- EPSS — probabilité d'exploitation dans les 30 prochains jours
- CISA SSVC — décisions de priorisation act / attend / track
- MSRC — preuve qu'un correctif Microsoft couvre déjà la constatation
- endoflife.date — logiciels qui ne seront plus jamais corrigés
Sorties : un rapport CSV par appareil, un historique SQLite avec des horloges SLA et des événements de changement de semaine en semaine, un tableau de bord HTML autonome, et un rapport d'exposition optionnel au format markdown.
Statut
v1.0.0. Le moteur a été porté en chambre blanche à partir d'un scanner qui tournait chaque semaine en production sur un parc Windows (voir docs/HISTORY.md). Avant cette version, les deux ont été exécutés sur le même parc en direct et comparés ligne par ligne : sur des dizaines de milliers de constatations où les deux voyaient un (appareil, logiciel, version) identique, chaque champ calculé — statut, CVSS, sévérité, indicateur KEV, décision SSVC, version de correctif — correspondait exactement.
Cette comparaison couvre la logique de verdict. Elle n'a pas mis en œuvre la couche historique/SLA, et ne remplace pas une validation de l'outil dans votre propre environnement. Lisez docs/known-limitations.md avant de lui faire confiance — il est écrit pour être honnête plutôt que flatteur.
Démarrage rapide
Vous avez besoin de PowerShell 7 (pwsh). Deux façons de l'exécuter :
A. Scan NinjaOne en direct
cp config.example.json config.json
# éditez config.json : remplissez ninjaone.client_id / client_secret / base_url,
# définissez output.report_dir, et (recommandé) nvd.api_key
pwsh -File fleet-cve-scan.ps1
B. Hors ligne — tout RMM, SCCM ou Intune (sans accès API)
Exportez votre inventaire vers un CSV avec les colonnes hostname, software, version (optionnel device_id, os), puis :
cp config.example.json config.json # seul output.report_dir est nécessaire ici
pwsh -File fleet-cve-scan.ps1 -InputCsv inventory.csv
-InputCsv fait zéro appel NinjaOne — pas d'OAuth, pas d'API. Il interroge toujours NVD et les autres flux publics, donc vous voulez toujours un nvd.api_key dans config.json et un output.report_dir valide. Voir docs/rmm-adapters.md pour le contrat d'entrée et les recettes d'export par RMM.
Installation des prérequis
- PowerShell 7 — macOS :
brew install powershell; Windows :winget install Microsoft.PowerShell; Debian/Ubuntu : installer depuis le dépôt de paquets Microsoft (packages.microsoft.com). - sqlite3 (optionnel, alimente l'historique/les tendances) — macOS : préinstallé ou
brew install sqlite; Debian/Ubuntu :apt-get install sqlite3; Windows : télécharger le bundle « tools » SQLite depuis sqlite.org et placersqlite3.exesur lePATHou à côté du script. Sans lui, le scan s'exécute toujours ;first_seentombe à la date d'exécution.
Prérequis
- PowerShell 7 (7.4+ recommandé). Le scan parallèle nécessite 7.0+.
- sqlite3 — optionnel ; active la base de données d'historique, les tendances et le suivi SLA
first_seen. Absent = ces fonctionnalités sont ignorées, le scan se termine quand même. - Sortie réseau vers NVD, CISA (KEV),
epss.empiricalsecurity.com(l'hôte de notation en masse EPSS — FIRST a déplacé l'hébergement des données EPSS là-bas), MSRC, endoflife.date, et GitHub raw (CVE ProgramcvelistV5) — plus l'API NinjaOne en mode direct. - Identifiants — le mode direct nécessite un identifiant/secret client OAuth2 NinjaOne ; le mode hors ligne nécessite uniquement un CSV d'inventaire. Une clé API NVD est techniquement optionnelle mais effectivement requise à l'échelle d'un parc : NVD autorise 50 requêtes/30s avec une clé et seulement 5/30s sans. Le scanner détecte celle que vous avez et s'adapte en conséquence, donc une exécution sans clé est correcte mais environ 10 fois plus lente — acceptable pour une poignée de produits, impraticable pour un vrai parc. Les clés sont gratuites.
Référence de configuration
La configuration est un fichier JSON (par défaut config.json à côté du script ; remplacez par -ConfigPath). Commencez par config.example.json. Chaque clé lue par le scanner, sa valeur par défaut lorsqu'omise, et ce qu'elle fait :
ninjaone (mode direct)
| Clé | Défaut | Objectif |
|---|---|---|
ninjaone.client_id | "" | Identifiant client OAuth2 de l'API NinjaOne. Requis pour les scans en direct ; laissez vide pour -InputCsv. |
ninjaone.client_secret | "" | Secret client OAuth2 de l'API NinjaOne. |
ninjaone.base_url | — (l'exemple fournit https://app.ninjarmm.com) | URL de base de l'API NinjaOne ; requise pour les scans en direct, aucun repli intégré. Utilisez l'hôte de votre région (par ex. eu.ninjarmm.com, oc.ninjarmm.com). |
nvd
| Clé | Défaut | Objectif |
|---|---|---|
nvd.api_key | "" | Clé API NVD, envoyée comme en-tête apiKey. Vide exécute une session non authentifiée, ce qui abaisse les valeurs par défaut de nvd_rate_limit et nvd_min_spacing_ms au plafond anonyme de NVD (4/30s, 6500ms) au lieu du plafond authentifié (48/30s, 700ms). Gratuit et ~10 fois plus rapide. |
Scan et notation
| Clé | Défaut | Objectif |
|---|---|---|
cvss_threshold | 7.0 | Score de base CVSS minimal pour qu'une CVE notée soit signalée comme VULNÉRABLE. Les CVE listées dans KEV contournent ce seuil. |
ssvc_mission_prevalence | high | Entrée partie prenante de la prévalence de mission SSVC (low / medium / high). |
ssvc_public_wellbeing | high | Entrée partie prenante du bien-être public SSVC (low / medium / high). |