
fleet-cve-scanner v1.1.0
Um scanner de CVE de código aberto e script único para frotas gerenciadas por RMM. Puro PowerShell 7 — combina seu inventário de software RMM com NVD, CISA KEV, EPSS e SSVC para responder: esta versão é vulnerável e qual é a urgência?
fleet-cve-scanner
Um scanner de CVE de código aberto, script único para frotas gerenciadas por RMM. PowerShell 7 puro, sem agentes, sem appliances, sem taxas de licença.
Ele responde a uma pergunta para cada software em cada endpoint que você gerencia: a versão instalada é conhecida por ser vulnerável e quão urgente é? — combinando o inventário de software do seu RMM com feeds de segurança gratuitos e autoritativos:
- NIST NVD — CVEs conhecidos + faixas de versões afetadas
- CISA KEV — explorados ativamente na natureza (ignora o limiar de pontuação)
- EPSS — probabilidade de exploração nos próximos 30 dias
- CISA SSVC — decisões de priorização act / attend / track
- MSRC — prova de que um patch da Microsoft já cobre a descoberta
- endoflife.date — software que nunca mais será corrigido
Saídas: um relatório CSV por dispositivo, um histórico SQLite com relógios SLA e eventos de mudança semana a semana, um painel HTML autônomo e um relatório opcional de exposição em markdown.
Status
v1.0.0. O mecanismo foi portado em sala limpa de um scanner que rodava semanalmente em produção contra uma frota Windows (veja docs/HISTORY.md). Antes deste lançamento, os dois foram executados contra a mesma frota ao vivo e comparados linha por linha: em dezenas de milhares de descobertas onde ambos viram um (dispositivo, software, versão) idêntico, todos os campos calculados — status, CVSS, gravidade, flag KEV, decisão SSVC, versão de correção — coincidiram exatamente.
Essa comparação cobre a lógica de veredito. Ela não exerceu a camada de histórico/SLA e não substitui a validação da ferramenta no seu próprio ambiente. Leia docs/known-limitations.md antes de confiar nela — está escrito para ser honesto, não lisonjeiro.
Quick start
Você precisa do PowerShell 7 (pwsh). Duas maneiras de executar:
A. Varredura NinjaOne ao vivo
cp config.example.json config.json
# edit config.json: fill ninjaone.client_id / client_secret / base_url,
# set output.report_dir, and (recommended) nvd.api_key
pwsh -File fleet-cve-scan.ps1
B. Offline — qualquer RMM, SCCM ou Intune (sem acesso à API)
Exporte seu inventário para um CSV com colunas hostname, software, version (opcional device_id, os), depois:
cp config.example.json config.json # only output.report_dir is needed here
pwsh -File fleet-cve-scan.ps1 -InputCsv inventory.csv
-InputCsv faz zero chamadas NinjaOne — sem OAuth, sem API. Ainda consulta NVD e outros feeds públicos, então você ainda precisa de um nvd.api_key no config.json e um output.report_dir válido. Veja docs/rmm-adapters.md para o contrato de entrada e receitas de exportação por RMM.
Instalando pré-requisitos
- PowerShell 7 — macOS:
brew install powershell; Windows:winget install Microsoft.PowerShell; Debian/Ubuntu: instale a partir do repositório de pacotes da Microsoft (packages.microsoft.com). - sqlite3 (opcional, alimenta histórico/trending) — macOS: pré-instalado ou
brew install sqlite; Debian/Ubuntu:apt-get install sqlite3; Windows: baixe o pacote "tools" do SQLite de sqlite.org e coloquesqlite3.exenoPATHou ao lado do script. Sem ele, a varredura ainda é executada;first_seenrecai para a data da execução.
Requisitos
- PowerShell 7 (7.4+ recomendado). A varredura paralela requer 7.0+.
- sqlite3 — opcional; permite o banco de dados de histórico, trending e rastreamento de
first_seendo SLA. Ausente = esses recursos são ignorados, a varredura ainda é concluída. - Egresso de rede para NVD, CISA (KEV),
epss.empiricalsecurity.com(o host de pontuação em massa EPSS — a FIRST moveu a hospedagem de dados EPSS para lá), MSRC, endoflife.date e GitHub raw (CVE ProgramcvelistV5) — mais a API NinjaOne no modo ao vivo. - Credenciais — modo ao vivo precisa de client id/secret OAuth2 do NinjaOne; modo offline precisa apenas de um CSV de inventário. Uma chave de API NVD é tecnicamente opcional, mas efetivamente necessária em escala de frota: NVD permite 50 requisições/30s com chave e apenas 5/30s sem. O scanner detecta qual você tem e limita para corresponder, então uma execução sem chave está correta, mas cerca de 10x mais lenta — bom para um punhado de produtos, impraticável para uma frota real. Chaves são gratuitas.
Referência de configuração
A configuração é um arquivo JSON (padrão config.json ao lado do script; substitua com -ConfigPath). Comece com config.example.json. Toda chave que o scanner lê, seu padrão quando omitida e o que faz:
ninjaone (modo ao vivo)
| Chave | Padrão | Propósito |
|---|---|---|
ninjaone.client_id | "" | ID do cliente OAuth2 da API NinjaOne. Necessário para varreduras ao vivo; deixe em branco para -InputCsv. |
ninjaone.client_secret | "" | Segredo do cliente OAuth2 da API NinjaOne. |
ninjaone.base_url | — (exemplo fornece https://app.ninjarmm.com) | URL base da API NinjaOne; necessária para varreduras ao vivo, sem fallback embutido. Use o host da sua região (ex.: eu.ninjarmm.com, oc.ninjarmm.com). |
nvd
| Chave | Padrão | Propósito |
|---|---|---|
nvd.api_key | "" | Chave da API NVD, enviada como cabeçalho apiKey. Em branco executa não autenticado, o que reduz os padrões de nvd_rate_limit e nvd_min_spacing_ms para o teto anônimo da NVD (4/30s, 6500ms) em vez do autenticado (48/30s, 700ms). Gratuito e ~10x mais rápido. |
Varredura & pontuação
| Chave | Padrão | Propósito |
|---|---|---|
cvss_threshold | 7.0 | Pontuação base mínima de CVSS para que um CVE pontuado seja reportado como VULNERABLE. CVEs listados no KEV ignoram esse piso. |
ssvc_mission_prevalence | high | Entrada de stakeholder Prevalência de Missão do SSVC (low / medium / high). |
ssvc_public_wellbeing | high | Entrada de stakeholder Bem-Estar Público do SSVC (low / medium / high). |
Cache & limite de taxa
| Chave | Padrão | Propósito |
|---|---|---|
nvd_cache_ttl_days | 7 | Dias que um resultado NVD (por nome de software) permanece em cache antes de ser consultado novamente. |
nvd_cache_flush_every | 500 | Checkpoint do cache NVD em disco a cada N itens concluídos, para que uma varredura interrompida mantenha suas buscas. 0 desabilita (salvamento ao final da varredura ainda é executado). |
nvd_min_spacing_ms | 700 com chave API, 6500 sem | Milissegundos mínimos entre chamadas NVD. A restrição limitante de taxa — ajuste esta primeiro. |
nvd_rate_limit | 48 com chave API, 4 sem | Limite máximo de chamadas NVD por janela de 30s (um backstop). Mínimo de 1. |
parallel_throttle | 20 | Contagem de runspaces do ForEach-Object -Parallel. Chamadas NVD são serializadas independentemente; isso apenas limita a concorrência de cache-hit. Mínimo de 1. |
kev_cache_ttl_hours | 24 | TTL para o catálogo CISA KEV em cache. |
epss_cache_ttl_hours | 24 | TTL para o arquivo de pontuação EPSS da FIRST.org em cache. |
eol_cache_ttl_days | 7 | TTL para consultas endoflife.date em cache. |
msrc_cache_ttl_days | 30 | TTL para dados MSRC CVRF em cache. |
cvelist_cache_ttl_days | 7 | TTL para dados SSVC do CVE Program (cvelistV5) / CISA-ADP em cache. |
cvelist_fetch_budget | 300 | Máximo de buscas de registros CVE por execução para enriquecimento SSVC/vulnrichment; o restante adia para a próxima execução. |