Identificando Pacotes Vulneráveis antes que possuam CVEs.
Fala, pessoal!
Recentemente, durante uma apresentação no estande da OWASP BH no evento BHack (focado em segurança em Belo Horizonte), tive a oportunidade de conhecer o trabalho da equipe da Aikido Security e seu banco de dados de inteligência. O que mais me chamou a atenção foi o enfoque em rastrear vulnerabilidades diretamente "na fonte" (como issues e PRs), frequentemente antes mesmo de receberem um identificador oficial (CVE).
Fiquei pensando: "Será que dá para criar um SCA (Software Composition Analysis) leve, que use essa base para escanear os projetos antes das CVEs serem lançadas?"
E então eu fiz a SCAikido.
A ideia e o desafio técnico
A premissa era simples: pegar o output do Syft (que gera o SBOM) e cruzar com o repositório de Intel da Aikido. Mas logo no começo esbarrei em um problema na forma que estava fazendo a filtragem pelos pacotes, pacotes com o mesmo nome em ecossitemas diferentes porém igualmente vulneráveis.
Eu tinha pacotes em C++ (via Conan) sendo detectados como vulneráveis porque tinham o mesmo nome de Gems do Ruby. O scanner olhava apenas nome e versão.
Para tornar a ferramenta viável, implementei uma lógica de validação de ecossistema em Node.js.
O script agora não compara apenas strings. Ele pega o package_type do SBOM (npm, maven, apk, gem, etc.) e verifica se é compatível com a linguagem da vulnerabilidade reportada no banco de dados.
Resultado: Se o pacote é openssl do ecossistema npm, ele ignora falhas que afetam o openssl de outros frameworks/linguagens.
Como funciona por baixo do capô
- Syft: Gera o mapa de dependências.
- Node.js Engine: Indexa o banco de dados da Aikido em memória (para performance) e roda a lógica de fuzzy matching e validação de versão.
- Bash: Cola tudo isso numa CLI fácil de usar em CI/CD.
O Projeto
O código é 100% Open Source. Quem quiser testar em seus projetos para ver se encontra algo que o npm audit ou outros scanners tradicionais estão deixando passar (por falta de CVE), fica o convite.
Fiquem à vontade para entrar em contato comigo pela rede vizinha.
Estou disponível para conversar e trocar ideias! 😁
Qualquer feedback sobre a lógica de detecção ou sugestões de melhoria são bem-vindas!