Skip to main content

Integre a análise de segurança de C/C++ do Snyk Open Source aos pipelines de CI

Escrito por
Headshot of Michal Brutvan

Michal Brutvan

blog feature oss cpp

8 de setembro de 2022

0 minutos de leitura

O 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:

Formulário de configuração do Jenkins mostrando o nome do projeto “cpp-goof”, a instalação do Snyk “snyk@latest” e o argumento adicional “--unmanaged”.

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

Relatório de testes do Snyk no Jenkins mostrando 58 vulnerabilidades conhecidas em 14 dependências de C/C++, incluindo uma leitura fora dos limites crítica

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.

Aviso de segurança que detalha um estouro de buffer no heap de alta gravidade no pacote dnsmasq e recomenda a atualização para a versão 2.83 ou posterior.

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:

snyk test --unmanaged --json | snyk-to-html -o snyk_results.html

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:

$ snyk test --unmanaged && snyk monitor --unmanaged

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

dependency_scanning:
  image: node:latest  # we need npm to install Snyk CLI and we don't need any C++ tooling to run the scan
  stage: test
  script:
    # Install npm, snyk, and snyk-to-html
    - npm install -g npm@latest
    - npm install -g snyk
    - npm install snyk-to-html -g
    # Run snyk help, snyk auth, snyk monitor, snyk test to break build and out report
    - snyk --help
    - snyk auth $SNYK_TOKEN
    - snyk monitor --unmanaged --project-name=cpp-goof-gitlab
    - snyk test --unmanaged --json | snyk-to-html -o snyk_results.html

  # Save report to artifacts
  artifacts:
    when: always
    paths: 
      - snyk_results.html

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.

$ snyk test --unmanaged
Testing c-example...

Issues:

 ✗ [Low] Race Condition
    Introduced through: https://curl.se|curl@7.58.0
    URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-CURL-2317489
Página da Snyk Vulnerability Database mostrando uma condição de corrida no curl que afeta as versões 7.10.4 e 7.77.0, com orientações para atualização.

Depois de atualizar o código-fonte, duas coisas podem acontecer:

  1. O problema desaparece, e pronto.

  2. 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:

$ snyk test --unmanaged --print-deps
Testing c-example...

Dependencies:

  https://curl.se|curl@7.58.0
  confidence: 0.800

Issues:

 ✗ [Low] Race Condition
    Introduced through: https://curl.se|curl@7.58.0
    URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-CURL-2317489

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:

$ snyk ignore --file-path='./deps/curl-7.60.0/*' --expiry='2022-05-20' --reason='patched the release and waiting for Snyk OS database to update'

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.