Análise de código

A verificação de código no GitHub Advanced Security for Azure DevOps permite analisar o código em um repositório do Azure DevOps para encontrar vulnerabilidades de segurança e erros de codificação. Quaisquer problemas identificados pela análise são gerados como um alerta. A análise de códigos utiliza o CodeQL para identificar vulnerabilidades.

CodeQL é o mecanismo de análise de código desenvolvido pelo GitHub para automatizar verificações de segurança. Você pode analisar seu código usando o CodeQL e exibir os resultados como alertas de varredura de código. Para obter documentação mais específica sobre o CodeQL, consulte a documentação do CodeQL.

O GitHub Advanced Security for Azure DevOps funciona com o Azure Repos. Se você quiser usar a Segurança Avançada do GitHub com repositórios do GitHub, consulte Segurança Avançada do GitHub.

Configurações adicionais para verificação de código

Suporte a idiomas e consultas

Especialistas do GitHub, pesquisadores de segurança e colaboradores da comunidade escrevem e mantêm as consultas CodeQL padrão usadas para verificação de código. As consultas são atualizadas regularmente para melhorar a análise e reduzir quaisquer resultados falsos positivos. As consultas são de código aberto, para que você possa visualizar e contribuir com as consultas no repositório github/codeql .

CodeQL suporta e usa os seguintes identificadores de idioma:

Idioma Identificador Identificadores alternativos opcionais (se for caso disso)
C/C++ c-cpp c ou cpp
C# csharp
Go go
Java/Kotlin java-kotlin
JavaScript/TypeScript javascript
Python python
Ruby ruby
Swift swift

Gorjeta

  • Use c-cpp para analisar código escrito em C, C++ ou ambos.
  • Use java-kotlin para analisar código escrito em Java, Kotlin ou ambos.
  • Use javascript para analisar código escrito em JavaScript, TypeScript ou ambos.

Para obter mais informações, consulte Linguagens e estruturas suportadas.

Você pode visualizar as consultas específicas e os detalhes da tarefa executados pelo CodeQL no log de compilação.

Captura de tela da tarefa de publicação de resultados de verificação de código.

Personalização do modo de compilação de varredura de código

A verificação de código suporta dois modos de compilação ao configurar um pipeline para verificação:

  • none - o banco de dados CodeQL é criado diretamente da base de código sem construir a base de código (suportado para todas as linguagens interpretadas e, adicionalmente, suportado para C# e Java).
  • manual - você define as etapas de compilação a serem usadas para a base de código no fluxo de trabalho (suportado para todas as linguagens compiladas).

Para obter mais informações sobre os diferentes modos de compilação, incluindo uma comparação sobre os benefícios de cada modo de compilação, consulte Verificação de código CodeQL para linguagens compiladas.

Para executar a análise de verificação de código por meio do GitHub Advanced Security for Azure DevOps, o autobuild modo de compilação é, em vez disso, uma tarefa de compilação separada, AdvancedSecurity-CodeQL-Autobuild@1.

Gorjeta

O modo none de construção é utilizável em conjunto com outras linguagens interpretadas (por exemplo, JavaScript, Python, Ruby). Se o modo none de compilação for especificado para C# ou Java em conjunto com outras linguagens compiladas que não suportam o modo nonede compilação, a tarefa de pipeline falhará.

Aqui está um exemplo de uma configuração válida com vários idiomas e none modo de compilação:

trigger: none
 
pool:
  vmImage: windows-latest

steps:
- task: AdvancedSecurity-Codeql-Init@1
  displayName: Initialize CodeQL
  inputs:
# build mode `none` is supported for C# and Java, and JavaScript is an interpreted language
# and build mode `none` has no impact on JavaScript analysis
    languages: 'csharp, java, javascript' 
    buildtype: 'none'

- task: AdvancedSecurity-Codeql-Analyze@1
  displayName: Perform CodeQL Analysis

Aqui está um exemplo de uma configuração inválida com vários idiomas e none modo de compilação:

trigger: none
 
pool:
  vmImage: windows-latest

steps:
- task: AdvancedSecurity-Codeql-Init@1
  displayName: Initialize CodeQL
  inputs:
# build mode `none` is supported for C# but build mode `none` is NOT supported for Swift
# so this pipeline definition will result in a failed run
    languages: 'csharp, swift'
    buildtype: 'none'

- task: AdvancedSecurity-Codeql-Analyze@1
  displayName: Perform CodeQL Analysis

Alertas de verificação de código

Os alertas de verificação de código do GitHub Advanced Security for Azure DevOps incluem sinalizadores de verificação de código por repositório que alertam sobre vulnerabilidades de aplicativos no nível de código.

Para usar a verificação de código, você precisa primeiro configurar o GitHub Advanced Security for Azure DevOps.

A guia Segurança Avançada em Repositórios no Azure DevOps é o hub para exibir seus alertas de verificação de código. Selecione a guia Varredura de código para exibir alertas de varredura. Você pode filtrar por ramificação, estado, pipeline, tipo de regra e gravidade. No momento, o hub de alertas não exibe alertas para verificação concluída em ramificações de RP.

Não há efeito nos resultados se pipelines ou ramificações forem renomeados - pode levar até 24 horas até que o novo nome seja exibido.

Se você optar por executar consultas CodeQL personalizadas, não há, por padrão, um filtro separado para alertas gerados a partir de diferentes pacotes de consulta. Você pode filtrar por regra, que é distinta para cada consulta.

Captura de tela de alertas de varredura de código para um repositório.

Se você desativar a Segurança Avançada para seu repositório, perderá o acesso aos resultados na guia Segurança Avançada e na tarefa de compilação. A tarefa de compilação não falha, mas todos os resultados das compilações executadas com a tarefa enquanto a Segurança Avançada está desativada ficam ocultos e não são mantidos.

Detalhes do alerta

Selecione um alerta para obter mais detalhes, incluindo orientações de correção. Cada alerta inclui uma localização, descrição, exemplo e gravidade.

Captura de tela do detalhe do alerta de varredura de código.

Section Explicação
Location A seção Locais detalha uma instância específica em que o CodeQL detetou uma vulnerabilidade. Se houver várias instâncias do seu código violando a mesma regra, um novo alerta será gerado para cada local distinto. O cartão Locais contém um link direto para o trecho de código afetado para que você possa selecionar o trecho a ser direcionado à interface do usuário da Web do Azure DevOps para edição.
Description A descrição é fornecida pela ferramenta CodeQL com base no problema.
Recomendação A recomendação é a correção sugerida para um determinado alerta de varredura de código.
Exemplo A seção de exemplo mostra um exemplo simplificado da fraqueza identificada em seu código.
Gravidade Os níveis de gravidade podem ser baixos, médios, altos ou críticos. A pontuação de gravidade é baseada na pontuação do Common Vulnerability Scoring System (CVSS) para a Enumeração de Fraqueza Comum (CWE) identificada. Saiba mais sobre como a gravidade é pontuada nesta postagem do blog do GitHub.

Visualizando alertas para um repositório

Qualquer pessoa com permissões de colaborador para um repositório pode visualizar um resumo de todos os alertas para um repositório na guia Segurança Avançada em Repos. Selecione a guia Verificação de código para visualizar todos os alertas de varredura secreta.

Para exibir resultados, as tarefas de verificação de código precisam ser executadas primeiro. Quando a primeira verificação terminar, todas as vulnerabilidades detetadas serão exibidas na guia Segurança Avançada.

Por padrão, a página de alertas mostra os resultados da verificação de dependência para a ramificação padrão do repositório.

O status de um determinado alerta reflete o estado da ramificação padrão e do pipeline de execução mais recente, mesmo que o alerta exista em outras ramificações e pipelines.

Descartando alertas de varredura de código

Para descartar alertas, você precisa de permissões apropriadas. Por padrão, apenas os administradores de projeto podem descartar alertas de Segurança Avançada.

Para descartar um alerta:

  1. Navegue até o alerta que deseja fechar e selecione o alerta.
  2. Selecione a lista suspensa Fechar alerta .
  3. Se ainda não estiver selecionado, selecione Risco aceito ou Falso positivo como o motivo do fechamento.
  4. Adicione um comentário opcional à caixa de texto Comentário .
  5. Selecione Fechar para enviar e feche o alerta.
  6. O estado de alerta muda de Aberto para Fechado e o motivo da demissão é exibido.

Captura de tela de como descartar um alerta de varredura de código.

Esta ação apenas descarta o alerta para a ramificação selecionada. Outras ramificações que contêm a mesma vulnerabilidade permanecem ativas até serem descartadas. Qualquer alerta anteriormente descartado pode ser reaberto manualmente.

Gerenciando alertas de varredura de código em solicitações pull

Se forem criados alertas para novas alterações de código em uma solicitação pull, o alerta será relatado como uma anotação na seção de comentários da guia Visão geral da solicitação pull e como um alerta na guia Advanced Security repository. Há uma nova entrada do seletor de ramificação para a ramificação de solicitação pull.

Você pode revisar as linhas de código afetadas, ver um resumo da descoberta e resolver a anotação na seção Visão geral.

Captura de tela da anotação de solicitação pull de código ativo.

Para descartar alertas de solicitação pull, você deve navegar até a exibição de detalhes do alerta para fechar o alerta e resolver a anotação. Caso contrário, simplesmente alterar o status do comentário (1) resolve a anotação, mas não fecha nem corrige o alerta subjacente.

Captura de tela da anotação de solicitação pull de código fechado.

Para ver todo o conjunto de resultados para sua ramificação de solicitação pull, navegue até Repos>Advanced Security e selecione sua ramificação pull request. Selecionar Mostrar mais detalhes (2) na anotação direciona você para a exibição de detalhes do alerta na guia Segurança Avançada.

Gorjeta

As anotações só serão criadas quando as linhas de código afetadas forem totalmente exclusivas para a diferença da solicitação pull em comparação com a ramificação de destino da solicitação pull.