Motor local de inteligência de vulnerabilidades com 347.000+ CVEs, API REST, busca full-text e interface desktop dark theme.
O CVE Intelligence Engine é uma ferramenta local de alta performance para pesquisa e análise de vulnerabilidades (CVEs). Importa a base completa da National Vulnerability Database (NVD) do NIST para um banco SQLite local com índice FTS5, expõe os dados via API REST e oferece uma interface WPF com tema escuro para consulta, filtragem e tradução automática das descrições para português.
- 347.000+ CVEs importados e indexados localmente
- Busca full-text com ranking BM25 via SQLite FTS5
- Sem dependência de internet após o import inicial
- API REST documentada com Swagger
- Interface WPF dark theme com painel de detalhes completo
- Tradução automática de descrições para português (PT-BR)
- Self-contained — publica como
.exeúnico sem precisar do .NET instalado
CVEIntelligenceEngine.sln
│
├── src/
│ ├── CVE.Domain # Entidades, enums e interfaces do domínio
│ ├── CVE.Application # CQRS — Queries, Commands, Handlers, DTOs (MediatR 12)
│ ├── CVE.Infrastructure # EF Core 8 + SQLite, FTS5, NVD API Client
│ ├── CVE.API # ASP.NET Core 8 REST API (localhost:5000)
│ ├── CVE.Ingestion # Worker Service — sincronização incremental com NVD
│ └── CVE.Desktop # Interface WPF dark theme (CommunityToolkit.Mvvm)
│
├── scripts/
│ ├── nvd_fast_import.py # Import completo/incremental via NVD API v2
│ ├── start-api.ps1 # Inicia apenas a API
│ ├── start-ingestion.ps1 # Inicia apenas o Worker
│ └── start-all.ps1 # Inicia tudo junto
│
└── data/
└── cve.db # Banco SQLite (gerado localmente, não incluso no repo)
| Camada | Tecnologia |
|---|---|
| API Backend | ASP.NET Core 8, MediatR 12, Serilog |
| Banco de Dados | SQLite 3 + EF Core 8 + FTS5 |
| Desktop | WPF .NET 8, CommunityToolkit.Mvvm 8.4 |
| Import | Python 3.10+, aiohttp, NVD API v2 |
| Tradução | MyMemory API (gratuita, sem chave) |
| Requisito | Versão | Uso |
|---|---|---|
| .NET 8 SDK | 8.0+ | Compilar e rodar a API e o Desktop |
| Python | 3.10+ | Script de import dos CVEs |
| NVD API Key | — | Opcional — aumenta o rate limit de 5 para 50 req/30s |
git clone https://github.com/seu-usuario/CVEsEngine.git
cd "CVEsEngine"pip install aiohttp aiosqlite# Com chave NVD (recomendado — ~10 minutos)
$env:NVD_API_KEY = "SUA_CHAVE_AQUI"
python scripts\nvd_fast_import.py --db data\cve.db --api-key $env:NVD_API_KEY
# Sem chave (rate limit reduzido — pode levar horas)
python scripts\nvd_fast_import.py --db data\cve.dbObter chave NVD gratuita: acesse nvd.nist.gov/developers/request-an-api-key e cadastre seu e-mail. A chave chega em minutos.
$env:CVE_DB_PATH = "$PWD\data\cve.db"
$env:ASPNETCORE_URLS = "http://localhost:5000"
dotnet run --project src\CVE.API --no-launch-profile# Em outro terminal
$env:CVE_API_URL = "http://localhost:5000/"
dotnet run --project src\CVE.DesktopPara rodar sem o SDK .NET instalado, publique os executáveis self-contained:
# Interface Desktop
dotnet publish src\CVE.Desktop -c Release -r win-x64 --self-contained true `
-p:PublishSingleFile=true -o publish\Desktop
# API Backend
dotnet publish src\CVE.API -c Release -r win-x64 --self-contained true `
-p:PublishSingleFile=true -o publish\APIOs arquivos ficam em publish\. Dê 2x clique em publish\Iniciar.bat para subir tudo automaticamente.
Requisito de distribuição: copie também a pasta
data\(contém o bancocve.db) junto compublish\.
Base URL: http://localhost:5000
Documentação interativa: http://localhost:5000/swagger
| Método | Rota | Descrição |
|---|---|---|
GET |
/api/cve/{id} |
Detalhes completos de um CVE pelo ID |
GET |
/api/search?q={termo}&page={n}&size={n} |
Busca full-text em ID, descrição e produtos |
GET |
/api/severity/{level}?page={n}&size={n} |
CVEs filtrados por severidade |
GET |
/api/product/{name}?page={n}&size={n} |
CVEs que afetam determinado produto |
GET |
/swagger |
Swagger UI |
Severidades válidas: Critical · High · Medium · Low
# Busca full-text
Invoke-RestMethod "http://localhost:5000/api/search?q=apache&size=5"
# CVE específico
Invoke-RestMethod "http://localhost:5000/api/cve/CVE-2021-44228"
# Todos os críticos (página 2)
Invoke-RestMethod "http://localhost:5000/api/severity/Critical?page=2&size=20"
# Por produto
Invoke-RestMethod "http://localhost:5000/api/product/nginx?size=10"{
"items": [
{
"id": "CVE-2021-44228",
"description": "Apache Log4j2 JNDI features...",
"cvssScore": 10.0,
"severity": "Critical",
"publishedDate": "2021-12-10"
}
],
"totalCount": 3118,
"page": 1,
"pageSize": 20,
"totalPages": 156
}A interface WPF dark theme oferece:
| Funcionalidade | Detalhe |
|---|---|
| Busca full-text | Resultados rankeados por BM25, paginados |
| Filtro por severidade | Critical / High / Medium / Low / All |
| Painel de detalhes | Score CVSS, vetor de ataque, CPEs, CWEs, referências |
| Tradução PT-BR | Botão "🌐 Traduzir para Português" — via MyMemory API |
| Tabela CPE | Vendor, produto e versão afetados — dark theme completo |
| Load More | Carregamento incremental de resultados |
| Variável | Padrão | Descrição |
|---|---|---|
NVD_API_KEY |
— | Chave NVD (rate limit: 5 → 50 req/30s) |
CVE_DB_PATH |
cve.db (cwd) |
Caminho absoluto para o banco SQLite |
ASPNETCORE_URLS |
http://localhost:5000 |
URL de escuta da API |
CVE_API_URL |
http://localhost:5000/ |
URL base usada pelo Desktop |
O banco SQLite é criado automaticamente na primeira execução da API. Estrutura principal:
-- CVEs principais
CREATE TABLE cves (
id TEXT PRIMARY KEY,
description TEXT,
cvss_score REAL,
severity TEXT,
vector TEXT,
cvss_version TEXT,
published_date TEXT,
last_modified TEXT,
exploit_score REAL,
has_public_exploit INTEGER
);
-- Índice Full-Text Search (FTS5) — busca em cve_id, description e product
CREATE VIRTUAL TABLE cves_fts USING fts5(cve_id, description, product);
-- Triggers de sincronização automática FTS5 ↔ cves
CREATE TRIGGER cves_fts_insert AFTER INSERT ON cves ...
CREATE TRIGGER cves_fts_update AFTER UPDATE ON cves ...
CREATE TRIGGER cves_fts_delete AFTER DELETE ON cves ...O arquivo
data/cve.dbnão é incluído no repositório (.gitignore). Execute o script de import para gerá-lo.
- ✅ Nenhuma credencial hardcoded — todas as chaves são passadas via variável de ambiente
- ✅ API local only — por padrão escuta apenas
localhost, sem exposição à rede - ✅ Dados somente leitura — a API não expõe endpoints de escrita
- ✅ Parâmetros sanitizados — queries FTS5 com escape de caracteres especiais
- ✅ OWASP Top 10 — sem SQL injection (uso de parâmetros), sem dados sensíveis em logs
Para sincronizar com novos CVEs publicados pela NVD:
# Reexecutar o import (detecta automaticamente novos/modificados)
python scripts\nvd_fast_import.py --db data\cve.db --api-key $env:NVD_API_KEYO script é idempotente — não duplica registros, apenas insere/atualiza o que mudou.
Este projeto usa dados públicos da National Vulnerability Database (NVD) do NIST.
Distribuído sob a licença MIT. Veja LICENSE para detalhes.
- .NET 8 SDK
- (Opcional) NVD API Key — sem chave o rate limit é 5 req/30s; com chave, 50 req/30s
cd "CVEs Engine"
dotnet build CVEIntelligenceEngine.sln$env:NVD_API_KEY = "SUA_CHAVE_AQUI" # opcional, mas recomendado
$env:CVE_DB_PATH = "C:\dados\cve.db" # opcional, padrão: pasta do executável.\scripts\start-all.ps1Ou individualmente:
# Terminal 1 — API REST
.\scripts\start-api.ps1
# Terminal 2 — Worker de sincronização NVD
.\scripts\start-ingestion.ps1
# Terminal 3 — Interface Desktop WPF
$env:CVE_API_URL = "http://localhost:5000/"
dotnet run --project src\CVE.DesktopCVEIntelligenceEngine.sln
├── src/
│ ├── CVE.Domain # Entidades, enums, interfaces
│ ├── CVE.Application # CQRS — Queries, Handlers, DTOs (MediatR)
│ ├── CVE.Infrastructure # EF Core + SQLite, NVD API Client, FTS5
│ ├── CVE.API # ASP.NET Core REST API (localhost:5000)
│ ├── CVE.Ingestion # Worker Service — sync automático com NVD
│ └── CVE.Desktop # WPF dark theme (CommunityToolkit.Mvvm)
└── scripts/
├── start-api.ps1
├── start-ingestion.ps1
└── start-all.ps1
| Método | Rota | Descrição |
|---|---|---|
| GET | /api/cve/{id} |
Detalhes completos de um CVE |
| GET | /api/search?q=&page=&size= |
Busca full-text (FTS5) |
| GET | /api/severity/{level}?page=&size= |
CVEs por severidade |
| GET | /api/product/{name}?page=&size= |
CVEs por produto/vendor |
| GET | /api/stats |
Totais e última sincronização |
| GET | /health |
Health check |
| GET | /swagger |
Swagger UI |
Níveis de severidade válidos: Critical, High, Medium, Low
| Variável | Padrão | Descrição |
|---|---|---|
NVD_API_KEY |
— | Chave da NVD API (aumenta rate limit) |
CVE_DB_PATH |
cve_intelligence.db |
Caminho do banco SQLite |
ASPNETCORE_URLS |
http://localhost:5000 |
URL da API |
SYNC_INTERVAL_HOURS |
6 |
Intervalo de sincronização incremental |
CVE_API_URL |
http://localhost:5000/ |
URL base usada pelo Desktop |
Na primeira execução, o Worker Service faz uma sincronização completa da NVD (≈260k CVEs). Isso pode levar 2–4 horas dependendo da conexão e do rate limit.
Execuções subsequentes fazem sincronização incremental (apenas CVEs modificados nas últimas N horas).
O SQLite é criado automaticamente na primeira execução. Inclui:
- Tabela
cvescom todos os campos CVSS - Tabela virtual FTS5 (
cves_fts) para busca full-text - Triggers automáticos de sincronização FTS5 ↔ cves
| Componente | Tecnologia |
|---|---|
| ORM | Entity Framework Core 8 + SQLite |
| CQRS | MediatR 12 |
| HTTP Resilience | Polly 8 |
| Logging | Serilog (Console + File rolling) |
| MVVM | CommunityToolkit.Mvvm 8 |
| API Docs | Swashbuckle (Swagger) |
| UI | WPF .NET 8 — Dark Theme |
