Após a conclusão de varreduras de infraestrutura com ferramentas certificadas como o "Skanner-VS", é comum receber relatórios extensos em formatos como HTML ou PDF. Embora úteis para visualização e compartilhamento, a integração desses dados em fluxos de trabalho de gerenciamento de vulnerabilidades, especialmente em plataformas como Jira ou DefectDojo, pode ser desafiadora. Soluções certificadas frequentemente carecem de formatos de exportação que facilitem a automação, resultando em dados isolados e em análises manuais demoradas para identificar CVEs em relatórios volumosos.
Este artigo é direcionado a profissionais de segurança da informação, engenheiros DevSecOps e administradores de sistemas que buscam integrar os resultados de varreduras de rede realizadas por scanners certificados em seus processos existentes de gerenciamento de vulnerabilidades, sem incorrer em custos adicionais com conversores pagos. Detalharemos o processo de transformação de relatórios HTML do "Skanner-VS" em JSON estruturado, a importação automática desses resultados para o DefectDojo e, quando necessário, a criação de parsers customizados para uma integração mais profunda. Para aqueles interessados em automatizar a execução do "Skanner-VS", recomendamos a consulta de artigos anteriores sobre o uso de scripts e APIs para essa finalidade.
O objetivo principal é extrair informações valiosas dos relatórios e manipulá-las de forma eficiente. A arquitetura proposta envolve a recepção de relatórios HTML do "Skanner-VS", o processamento desses arquivos por um script Python para gerar um relatório JSON compatível com o DefectDojo. Essa abordagem não só facilita a importação automatizada, mas também permite a análise manual dos dados em formato JSON, uma alternativa mais prática do que a navegação por relatórios extensos. A meta final é visualizar os dados do scanner certificado em um formato estruturado e enviá-los para o DefectDojo, uma plataforma robusta para gerenciamento de vulnerabilidades.
Sobre as Ferramentas Utilizadas: Skanner-VS e DefectDojo
O "Skanner-VS" é uma ferramenta certificada pela FSTEC da Rússia, projetada para testes de segurança e análise de vulnerabilidades em sistemas de informação, além de verificar a eficácia de medidas de proteção. Ferramentas certificadas por órgãos como a FSTEC são frequentemente requisitos para conformidade, especialmente em certificações de sistemas de informação governamentais (GIS).
A versão atual do "Skanner-VS" é a sétima, mas a sexta ainda é amplamente utilizada. Uma diferença notável entre as versões em relação aos relatórios é que a sexta oferecia formatos PDF e HTML, enquanto a sétima se concentra exclusivamente em HTML. Felizmente, a estrutura das tags HTML nos relatórios das versões sexta e sétima é consistente, o que significa que o script desenvolvido aqui é compatível com ambas.
DefectDojo: O que é e para que serve
O DefectDojo é uma plataforma de código aberto para Gerenciamento de Vulnerabilidades (Vulnerability Management Platform). Sua principal função é agregar resultados de diversos scanners de segurança em uma interface unificada, permitindo o acompanhamento do ciclo de vida das vulnerabilidades, a priorização de correções e a geração de relatórios abrangentes. As funcionalidades chave do DefectDojo incluem:
- Suporte a mais de 150 parsers integrados para ferramentas como Nmap, Burp Suite, Trivy, OpenVAS, entre outras.
- Deduplicação automática de vulnerabilidades entre diferentes varreduras.
- Integração com sistemas populares como Jira, Slack e GitHub.
- API REST para automação da importação de resultados.
- Modelo de controle de acesso baseado em papéis (RBAC).
- Métricas e dashboards para visualização do estado de segurança.
A plataforma organiza os dados em uma hierarquia: Produto → Engajamento → Teste → Finding. Essa estrutura permite uma organização granular das vulnerabilidades em relação a produtos específicos e fases de desenvolvimento.
Por ser desenvolvido em Python, o DefectDojo facilita a adição de parsers customizados para fontes de dados não suportadas nativamente pela plataforma.
Configuração do DefectDojo
Para uma implantação rápida e local do DefectDojo, a utilização do docker-compose oficial do projeto é a abordagem mais recomendada. O processo envolve clonar o repositório do projeto, navegar até o diretório e executar o comando docker compose up -d. Após a inicialização, o DefectDojo estará acessível em http://localhost:8080. A senha inicial do administrador pode ser encontrada nos logs do Docker.
Análise de Relatórios do Skanner-VS
O foco da análise recai sobre o relatório em formato HTML gerado pelo "Skanner-VS". Este arquivo é a fonte de dados para o nosso parser.
Estrutura do Arquivo HTML do Relatório
O relatório HTML é logicamente dividido em seções:
- Resumo: Contém informações gerais sobre a varredura, como o número de vulnerabilidades por criticidade, lista de ativos com seus IPs, FQDNs e sistemas operacionais, os 5 ativos mais vulneráveis e os pacotes de software mais afetados.
- Dados sobre Recursos Varredos: Esta seção detalha as vulnerabilidades encontradas. Para cada vulnerabilidade, o relatório inclui:
- Identificador CVE no título do subtópico.
- Identificadores adicionais (BDU FSTEC, etc.) no campo "Identificadores Relacionados".
- Característica textual da criticidade no campo "Nível de Criticidade".
- Nome do serviço ou pacote vulnerável no campo "SO/Pacote".
- Porta do ativo onde a vulnerabilidade foi detectada no campo "Porta".
- Pontuações CVSSv2, CVSSv3 e CVSSv4, com vetores de ataque, nos campos correspondentes.
- Informações adicionais sobre a vulnerabilidade no campo "Descrição" (nem sempre preenchido).
- Recomendações para correção, geralmente links para recursos externos, no campo "Recomendações" (nem sempre preenchido).
Se um ativo não apresentar vulnerabilidades, a seção 2 para ele estará vazia.
Para visualizar a estrutura completa do HTML, é possível remover atributos e valores de tags. Um script Python utilizando BeautifulSoup pode ser empregado para essa finalidade. O foco da extração de dados se concentra na seção 2, onde as informações sobre as vulnerabilidades são detalhadas.
Código para Análise (Parsing)
Utilizaremos a biblioteca BeautifulSoup para analisar os relatórios HTML. A função parse_vulnerabilities_html() é responsável por:
- Verificar a existência e acessibilidade do arquivo HTML.
- Identificar os cabeçalhos
<h1>que correspondem aos endereços IP dos hosts. - Para cada host, extrair o IP e o nome DNS (se disponível), localizar os blocos
<div>associados ao host e selecionar o bloco contendo "Vulnerabilidades Encontradas". - Extrair identificadores CVE de tags
<h3>e, para cada vulnerabilidade, analisar a tabela para obter porta, componente e nível de criticidade.
O resultado dessa função é um dicionário estruturado como {ip: {cve: {port: ..., component: ..., severity: ...}}}. Casos onde tags específicas não são encontradas são tratados para evitar erros, e avisos são gerados para tabelas de dados ausentes.
A função parse_all_reports() processa múltiplos arquivos HTML em um diretório especificado, agregando os resultados em um dicionário unificado {ip: {...}}.
A função restructure_data() permite reorganizar os dados com base em diferentes campos, como IP, CVE, porta, criticidade ou componente, facilitando análises sob diversas perspectivas.
Envio de JSON para o DefectDojo
A função dd_sender() é responsável por enviar o arquivo JSON gerado para o DefectDojo via API. Ela realiza:
- Verificação da existência do arquivo.
- Envio de uma requisição POST para a URL especificada.
- Utilização do formato
multipart/form-data, transmitindo o arquivo JSON e parâmetros de varredura (tipo de scan, engajamento, data do scan).
É importante notar que a verificação do certificado SSL é desativada (verify=False) e o status da resposta do servidor é exibido no console. O parâmetro scan_type deve corresponder a um tipo de scan registrado no DefectDojo; neste caso, utilizamos "ScannerVS".
A sequência de ações culmina na visualização dos dados no DefectDojo, com os identificadores CVE linkados a informações adicionais sobre descrição e recomendações de correção.
Criação de um Parser Customizado para "Skanner-VS"
Embora a exportação em JSON e a importação via API sejam suficientes para integrações básicas, podem surgir limitações quanto à flexibilidade e personalização. Para um controle mais refinado, a criação de um parser customizado para o DefectDojo é a solução. Isso permite gerenciar a lógica de importação, configurar deduplicação, mapear severidades e adaptar-se às particularidades dos relatórios do "Skanner-VS".
O DefectDojo detecta parsers automaticamente ao iniciar, escaneando o diretório /app/dojo/tools/. Cada subdiretório deve conter um módulo parser.py e um classe com nome específico (nome_da_pasta + parser, ignorando maiúsculas/minúsculas e underscores). O método get_scan_types() é usado para registrar os tipos de scan.
A estrutura mínima de um parser inclui:
dojo/tools/scanner_vs/ ├── __init__.py └── parser.py
Cada parser deve implementar quatro métodos essenciais: get_scan_types(), get_label_for_scan_types(), get_description_for_scan_types() e get_findings(). O método get_findings() é o principal, responsável por analisar o arquivo de entrada (neste caso, um JSON com a estrutura {ip: {cve: {port: ..., component: ..., severity: ...}}}) e retornar uma lista de objetos Finding.
O código do parser customizado inclui a lógica de mapeamento de severidades (do russo para o inglês), deduplicação baseada em CVE, IP e porta, e a geração de hash_code para deduplicação entre diferentes varreduras. Ele também considera a compatibilidade com a funcionalidade V3_FEATURE_LOCATIONS do DefectDojo para o registro de localizações de vulnerabilidades.
Considerações Importantes no Desenvolvimento do Parser:
- Nome da Classe: Deve seguir estritamente o padrão
nome_da_pasta.replace('_', '') + 'parser'(case-insensitive). Por exemplo, para a pastascanner_vs, a classe deve serScannerVsParser. unsaved_endpointsvsunsaved_locations: A partir da versão 2.56.1 do DefectDojo, o mecanismo deLocationsé o preferencial. É crucial verificar o flagV3_FEATURE_LOCATIONSe utilizar a abordagem correta. A atribuição deve ser feita após a criação do objetoFinding.- Deduplicação: O DefectDojo utiliza
unique_id_from_tool(para deduplicação dentro de um scan) ehash_code(para deduplicação entre scans). A chave recomendada para scanners de CVE éCVE_ID|IP|PORT. - Mapeamento de Severidade: O DefectDojo aceita valores específicos (
Critical,High,Medium,Low,Info). É necessário um mapeamento explícito para severidades em outros idiomas, com uso de.strip()para remover espaços em branco.
Construção e Implantação de Imagem Customizada
Para implantar um parser customizado, é necessário construir uma nova imagem Docker que inclua o parser. Um Dockerfile é utilizado para copiar os arquivos do parser para o diretório apropriado dentro da imagem base do DefectDojo. Após a construção e publicação da imagem em um registry, as configurações do Helm (se estiver usando Kubernetes) devem ser atualizadas para referenciar a nova imagem.
Depuração do Parser
Para depurar um parser:
- Verificação do Nome da Classe: Confirme se o nome da classe segue o padrão correto. Um script de verificação pode ser executado dentro do container.
- Logs de Carregamento: Analise os logs do DefectDojo após a inicialização para identificar erros no carregamento de parsers.
- Teste Local: Teste o parser diretamente dentro do container Docker, sem necessidade de implantação completa.
Erros Comuns e Soluções:
- Parser não aparece na UI: Verifique o nome da classe.
unexpected keyword argument ‘unsaved_endpoints’: Atribuaunsaved_endpointsapós a criação do objetoFinding.- Todos os findings com severidade Medium: Verifique o mapeamento de severidade e o uso de
.strip(). - Duplicatas em reimportações: Preencha
unique_id_from_toolehash_code. Parser does not exist: Confirme que os arquivos foram copiados para a imagem e que a imagem foi reconstruída.
Importação de Resultados de Varredura via Interface Web
O DefectDojo também permite a importação de resultados de varredura através de sua interface web. O processo envolve:
- Acessar a seção de "Scans" ou "Tests".
- Selecionar o produto e engajamento desejados.
- Fazer o upload do arquivo de relatório (no formato esperado pelo DefectDojo ou pelo parser customizado).
- Selecionar o tipo de scan correspondente (neste caso, "ScannerVS").
- Configurar opções adicionais, como data do scan e nível de severidade mínimo.
- Iniciar o processo de importação.
Após a importação bem-sucedida, os resultados estarão disponíveis na plataforma, organizados conforme a estrutura do DefectDojo, facilitando a análise e o acompanhamento das vulnerabilidades.








