Retour aux mises à jour
New releaseJul 24, 2026

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 ?

Partager

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 placer sqlite3.exe sur le PATH ou à côté du script. Sans lui, le scan s'exécute toujours ; first_seen tombe à 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 Program cvelistV5) — 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éfautObjectif
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éfautObjectif
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éfautObjectif
cvss_threshold7.0Score 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_prevalencehighEntrée partie prenante de la prévalence de mission SSVC (low / medium / high).
ssvc_public_wellbeinghighEntrée partie prenante du bien-être public SSVC (low / medium / high).

Mise en cache et limitation de débit

Catégories