
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 ?
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 :
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.
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.
Vous avez besoin de PowerShell 7 (pwsh). Deux façons de l'exécuter :
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
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.
brew install powershell ; Windows : winget install Microsoft.PowerShell ; Debian/Ubuntu : installer depuis le dépôt de paquets Microsoft (packages.microsoft.com).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.first_seen. Absent = ces fonctionnalités sont ignorées, le scan se termine quand même.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.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. |
| 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). |