Integre a análise de segurança de C/C++ do Snyk Open Source aos pipelines de CI
Michal Brutvan
8 de setembro de 2022
0 minutos de leituraO Snyk Open Source oferece análise de C e C++ para dependências open source incluídas no código-fonte por meio da CLI — e temos o prazer de anunciar que ela também está disponível por meio dos nossos plugins de CI. Este guia mostra como integrar a análise de segurança de C/C++ aos pipelines para fornecer informações sobre vulnerabilidades e orientações de correção diretamente aos desenvolvedores. Neste guia, usaremos “C++” como abreviação de “C/C++”.
Opção 1: usar plugins de CI
O Snyk se integra a várias plataformas de CI/CD, incluindo Jenkins, Azure DevOps e GitHub Actions. Todos esses plugins têm algo em comum: eles usam a CLI do Snyk e outras ferramentas para facilitar a configuração e o uso. Isso também significa que a configuração é igual em todos eles e que permitem especificar um argumento adicional de linha de comando para passar à CLI do Snyk.
Para analisar um projeto C++, basta adicionar --unmanaged como argumento adicional. Veja um exemplo de configuração do plugin Snyk Security para Jenkins:

Após a compilação, um item Snyk Security Report ficará disponível na página de detalhes da compilação:

O relatório de segurança lista as vulnerabilidades detectadas com base nas dependências open source identificadas. Para cada vulnerabilidade, ele informa a gravidade, qual dependência foi afetada e qual versão do projeto open source corrige o problema.

Opção 2: usar um script
Os dois comandos da CLI usados para analisar projetos C++ são snyk test e snyk monitor, ambos com a opção de linha de comando --unmanaged. Os dois analisam o código em busca de dependências open source e vulnerabilidades, mas cada um tem uma finalidade diferente.
snyk test
O comando snyk test --unmanaged é o comando básico para gerar uma lista de vulnerabilidades. Ele identifica dependências open source no seu código e consulta o Snyk Vulnerability Database para verificar se há vulnerabilidades conhecidas. O comando foi criado para funcionar em pipelines de CI (com suporte à saída JSON) e retorna um código de saída diferente de zero quando detecta um problema. Se você armazena as dependências open source como arquivos compactados, a CLI do Snyk também pode inspecioná-los.
snyk monitor
Diferentemente do comando anterior, snyk monitor --unmanaged encaminha os relatórios de problemas à interface do Snyk. Ele captura um instantâneo das dependências e vulnerabilidades identificadas no momento e as importa para o seu painel do Snyk. Depois disso, as dependências identificadas são monitoradas em busca de novas vulnerabilidades, e você recebe um alerta quando uma nova vulnerabilidade é adicionada ao Snyk Vulnerability Database. Esse comando não retorna um código de saída quando detecta um problema.
Vale destacar que esse comando realmente captura um instantâneo das dependências detectadas naquele momento. O Snyk armazena as assinaturas nos servidores por pouco tempo, apenas para fins de solução de problemas. À medida que nosso banco de dados open source evolui, o Snyk pode detectar novas bibliotecas e vulnerabilidades associadas. Por isso, é recomendável executar o comando snyk monitor --unmanaged regularmente.
snyk-to-html
snyk-to-html é uma ferramenta independente que converte a saída JSON de snyk test --json em um documento HTML legível. Um exemplo de uso com o comando snyk test para dependências não gerenciadas:
Juntando tudo
O monitoramento regular é importante para manter uma boa postura de segurança. A melhor maneira de proteger o código é importar o instantâneo das dependências identificadas para o painel do Snyk e deixar que o monitoramento noturno avise você sobre novas vulnerabilidades. Executar snyk monitor --unmanaged regularmente mantém o instantâneo das dependências atualizado com os dados de vulnerabilidade mais recentes, e você recebe alertas sobre novas vulnerabilidades assim que elas aparecem no nosso banco de dados.
Se você quiser testar commits ou branches individuais e interromper o pipeline quando houver vulnerabilidades, execute apenas o comando snyk test --unmanaged. Encadear o comando test com snyk monitor --unmanaged também importa os resultados imediatamente para o seu painel. O instantâneo das dependências será atualizado somente se o teste for aprovado:
Você também pode usar outras opções, como severity-threshold=high, para que o Snyk interrompa a compilação somente se você estiver introduzindo vulnerabilidades de gravidade high ou superior. Para ver a lista completa de opções de linha de comando compatíveis, consulte nossa documentação do Snyk para C/C++.
Exemplo de definição de pipeline de CI/CD do GitLab
Corrigir problemas
Para corrigir um problema, substitua o código-fonte do pacote open source com a vulnerabilidade detectada pela versão mais recente recomendada. Consulte as orientações disponíveis no URL do problema para saber em qual versão da dependência a vulnerabilidade foi corrigida.

Depois de atualizar o código-fonte, duas coisas podem acontecer:
O problema desaparece, e pronto.
O problema continua sendo detectado porque a dependência open source não foi identificada corretamente.
No caso da opção 2, isso acontece porque atualizamos nosso banco de dados open source mensalmente. Portanto, é possível que a versão mais recente do pacote que você acabou de incluir no código ainda não tenha sido adicionada. Para verificar se o Snyk identificou corretamente a dependência e a versão, execute o comando test com a opção --print-deps:
A métrica confidence indica o grau de confiança do Snyk na correspondência.
Qual é um bom nível de confiança?
A resposta é: depende. O nível de confiança é a proporção de arquivos locais que correspondem a uma versão publicada do projeto open source. Por exemplo, se uma versão específica de um projeto open source (o pacote com o código-fonte) contém 1.000 arquivos e o seu projeto local contém 900 deles, enquanto os demais não correspondem porque foram modificados, o nível de confiança é 900/1.000 = 0,9. No entanto, o nível de confiança é o mesmo para um projeto open source com 10 arquivos, dos quais 9 correspondem aos arquivos locais — um cenário bem diferente do exemplo anterior. Cabe a você decidir qual nível de confiança é suficiente e quais identificações de dependências devem ser ignoradas.
Se a identificação estiver incorreta, você pode usar o comando snyk ignore para ignorar a dependência temporariamente:
O futuro da análise de segurança de C/C++
Estamos trabalhando para aumentar a precisão da análise, com foco em aprimorar a curadoria de projetos open source e os algoritmos de correspondência para contemplar projetos com código ligeiramente modificado (ou sem testes e documentação). Isso inclui atualizar nosso banco de dados de código-fonte com mais frequência e adicionar projetos que não têm versões publicadas.
Como alternativa à detecção de componentes C++ não gerenciados (baseada em assinatura), estamos desenvolvendo uma API que permitirá consultar diretamente nosso banco de dados de vulnerabilidades. Tem algum comentário ou interesse em saber mais sobre a nova API? Fale conosco pelo endereço ccpp@snyk.io.
Comece a resolver desafios de capture the flag
Aprenda a resolver desafios de capture the flag assistindo sob demanda ao nosso workshop virtual introdutório.
