
Un escáner de CVE de código abierto y un solo script para flotas gestionadas por RMM. Puramente PowerShell 7 — combina el inventario de software de tu RMM con NVD, CISA KEV, EPSS y SSVC para responder: ¿esta versión es vulnerable y qué tan urgente es?
Un escáner de CVE de código abierto y script único para flotas gestionadas por RMM. PowerShell 7 puro, sin agentes, sin dispositivos, sin tarifas de licencia.
Responde una pregunta por cada pieza de software en cada endpoint que gestionas: ¿la versión instalada se sabe vulnerable y qué tan urgente es? — al unir el inventario de software de tu RMM con fuentes de seguridad autorizadas y gratuitas:
Salidas: un informe CSV por dispositivo, un historial SQLite con relojes de SLA y eventos de cambio semana a semana, un panel HTML autónomo y un informe de exposición opcional en markdown.
v1.0.0. El motor fue portado en sala limpia desde un escáner que se ejecutaba semanalmente en producción contra una flota Windows (consulta docs/HISTORY.md). Antes de este lanzamiento, ambos se ejecutaron contra la misma flota en vivo y se compararon fila por fila: en decenas de miles de hallazgos donde ambos vieron un (dispositivo, software, versión) idéntico, cada campo calculado — estado, CVSS, severidad, bandera KEV, decisión SSVC, versión de corrección — coincidió exactamente.
Esa comparación cubre la lógica de veredicto. No ejercitó la capa de historial/SLA, y no sustituye la validación de la herramienta en tu propio entorno. Lee docs/known-limitations.md antes de confiar en ella — está escrita para ser honesta, no halagadora.
Necesitas PowerShell 7 (pwsh). Dos formas de ejecutarlo:
cp config.example.json config.json
# edita config.json: completa ninjaone.client_id / client_secret / base_url,
# establece output.report_dir y (recomendado) nvd.api_key
pwsh -File fleet-cve-scan.ps1
Exporta tu inventario a un CSV con las columnas hostname, software, version (opcional device_id, os), luego:
cp config.example.json config.json # aquí solo se necesita output.report_dir
pwsh -File fleet-cve-scan.ps1 -InputCsv inventory.csv
-InputCsv realiza cero llamadas a NinjaOne — sin OAuth, sin API. Aún consulta NVD y las otras fuentes públicas, por lo que igualmente querrás un nvd.api_key en config.json y un output.report_dir válido. Consulta docs/rmm-adapters.md para el contrato de entrada y recetas de exportación por RMM.
brew install powershell; Windows: winget install Microsoft.PowerShell; Debian/Ubuntu: instala desde el repositorio de paquetes de Microsoft (packages.microsoft.com).brew install sqlite; Debian/Ubuntu: apt-get install sqlite3; Windows: descarga el paquete "tools" de SQLite desde sqlite.org y coloca sqlite3.exe en PATH o junto al script. Sin él, el escaneo aún se ejecuta; first_seen retrocede a la fecha de ejecución.first_seen para SLA. Si está ausente, esas funciones se omiten, el escaneo aún se completa.epss.empiricalsecurity.com (el host de puntuación masiva de EPSS — FIRST movió el alojamiento de datos de EPSS allí), MSRC, endoflife.date y GitHub raw (cvelistV5 del programa CVE) — más la API de NinjaOne en modo en vivo.La configuración es un archivo JSON (por defecto config.json junto al script; se puede anular con -ConfigPath). Comienza desde config.example.json. Cada clave que el escáner lee, su valor predeterminado cuando se omite y qué hace:
ninjaone (modo en vivo)| Clave | Predeterminado | Propósito |
|---|---|---|
ninjaone.client_id | "" | ID de cliente OAuth2 de la API de NinjaOne. Requerido para escaneos en vivo; déjalo en blanco para -InputCsv. |
ninjaone.client_secret | "" | Secreto de cliente OAuth2 de la API de NinjaOne. |
ninjaone.base_url | — (el ejemplo incluye https://app.ninjarmm.com) | URL base de la API de NinjaOne; requerido para escaneos en vivo, sin respaldo incorporado. Usa el host de tu región (ej. eu.ninjarmm.com, oc.ninjarmm.com). |
nvd| Clave | Predeterminado | Propósito |
|---|---|---|
nvd.api_key | "" | Clave API de NVD, enviada como encabezado apiKey. Si está en blanco, ejecuta sin autenticar, lo que reduce los valores predeterminados de nvd_rate_limit y nvd_min_spacing_ms al techo anónimo de NVD (4/30s, 6500ms) en lugar del autenticado (48/30s, 700ms). Gratuita y ~10 veces más rápida. |
| Clave | Predeterminado | Propósito |
|---|---|---|
cvss_threshold | 7.0 | Puntuación base CVSS mínima para que un CVE con puntuación se reporte como VULNERABLE. Los CVE listados en KEV evitan este umbral. |
ssvc_mission_prevalence | high | Entrada de parte interesada de SSVC Mission Prevalence (low / medium / high). |
ssvc_public_wellbeing | high | Entrada de parte interesada de SSVC Public Well-being (low / medium / high). |