Explorar o CodeQL no GitHub

Concluído

O que é CodeQL

CodeQL é um mecanismo de análise de código semântico desenvolvido pelo GitHub que trata o código como dados. Em vez de simplesmente pesquisar padrões de texto, o CodeQL entende a estrutura e o significado do código, permitindo uma análise sofisticada de segurança e qualidade.

As ferramentas de análise estática tradicionais geralmente produzem falsos positivos porque usam correspondência de padrões simples. A abordagem semântica do CodeQL entende o contexto de código, as relações entre elementos de código e o fluxo de dados por meio de aplicativos, resultando em uma detecção de vulnerabilidade mais precisa.

Principais características do CodeQL

O CodeQL trata o código como um banco de dados:

  • Representação estrutural: Converte o código-fonte em um banco de dados que captura árvores de sintaxe, grafos de fluxo de controle e caminhos de fluxo de dados.
  • Formato queryable: Torna o código que pode ser consultado usando uma linguagem de consulta especializada, semelhante à consulta de um banco de dados tradicional.
  • Abordagem independente da linguagem: Dá suporte a várias linguagens de programação, incluindo C/C++, C#, Java, JavaScript/TypeScript, Python, Ruby, Go e Swift.
  • Cobertura abrangente: Analisa não apenas arquivos individuais, mas bases de código inteiras com todas as suas interconexões.

O CodeQL habilita a análise de segurança precisa:

  • Análise de variante: Depois de identificar uma vulnerabilidade, você pode escrever consultas para encontrar problemas semelhantes em toda a base de código.
  • Análise de fluxo de dados: Rastreia como os dados passam pelo aplicativo de fontes (entrada do usuário) para destinos (operações sensíveis).
  • Rastreamento de contaminação: Identifica quando dados não confiáveis atingem operações sensíveis sem validação ou sanitização adequadas.
  • Análise de fluxo de controle: Entende os caminhos de execução e a lógica condicional para localizar vulnerabilidades que ocorrem apenas em condições específicas.

Como o CodeQL funciona

A análise do CodeQL envolve três fases distintas que transformam o código-fonte em descobertas de segurança acionáveis:

Fase 1: Criar um banco de dados CodeQL

A primeira etapa extrai uma representação estruturada do código:

  • Extração de código: Analisa seus arquivos de origem durante a compilação ou por meio de análise estática.
  • Criação de banco de dados: Cria um banco de dados abrangente que representa a estrutura do código, incluindo árvores de sintaxe abstratas, grafos de fluxo de controle e dependências de dados.
  • Captura de metadados: Registra locais de arquivo, números de linha, escopos de variável, chamadas de função e hierarquias de classe.
  • Optimização: Indexa o banco de dados para consulta eficiente, mesmo em grandes bases de código.

Esse banco de dados se torna a base para todas as análises subsequentes. Ele é criado uma vez e pode ser consultado várias vezes, tornando a análise de segurança iterativa eficiente.

Fase 2: Executar consultas CodeQL

Depois que o banco de dados existir, você executará consultas para encontrar problemas de segurança:

  • Pacotes de consulta padrão: O GitHub fornece conjuntos de consultas coletados para vulnerabilidades comuns (padrões OWASP Top 10, CWE).
  • Consultas personalizadas: Escreva suas próprias consultas para encontrar padrões de segurança específicos da organização ou violações de padrões de codificação.
  • Execução da consulta: O mecanismo CodeQL executa consultas no banco de dados, procurando padrões de código que correspondam a assinaturas de vulnerabilidade.
  • Desempenho: As consultas são executadas rapidamente porque operam no banco de dados indexado em vez de arquivos de origem brutos.

As categorias de consulta de exemplo incluem:

  • Vulnerabilidades de injeção: Injeção de SQL, injeção de comando, script entre sites.
  • Problemas de autenticação: Políticas de senha fracas, verificações de autenticação ausentes, gerenciamento de sessão não seguro.
  • Problemas de criptografia: Algoritmos fracos, credenciais codificadas, aleatoriedade insuficiente.
  • Gestão de recursos: Perda de memória, esgotamento de recursos, consumo de recursos descontrolado.

Fase 3: Interpretar resultados

A fase final apresenta descobertas em formatos acionáveis:

  • Classificação de resultados: O CodeQL prioriza as descobertas por severidade, nível de confiança e explorabilidade.
  • Informações contextuais: Cada descoberta inclui locais de arquivo, números de linha, snippets de código afetados e caminhos de fluxo de dados.
  • Diretrizes de correção: Os resultados incluem explicações sobre a vulnerabilidade e recomendações para corrigi-la.
  • Integração: Os resultados se integram à guia Segurança do GitHub, anotações de solicitação de pull e arquivos SARIF para ferramentas externas.

A linguagem de consulta CodeQL

As consultas CodeQL são escritas em uma linguagem declarativa especificamente projetada para analisar o código:

Estrutura e sintaxe de consulta

O CodeQL usa programação lógica orientada a objetos:

  • Classes e predicados: Defina o que você está procurando usando classes que representam elementos de código (funções, variáveis, expressões).
  • Abordagem declarativa: Descreva o que você deseja encontrar em vez de como encontrá-lo.
  • Correspondência de padrões: Use predicados para corresponder a padrões de código e relações.
  • Capacidade de composição: Crie consultas complexas combinando predicados mais simples.

Exemplo de estrutura de consulta:

import javascript

from SqlExecution sql, Source source
where source.flowsTo(sql.getAnArgument())
select sql, "SQL query vulnerable to injection from $@.", source, "user input"

Essa consulta localiza vulnerabilidades de injeção de SQL:

  • Identificando pontos de execução do SQL.
  • Localizando fontes de entrada do usuário.
  • Acompanhamento do fluxo de dados da entrada para a execução do SQL.
  • Relatar vulnerabilidades com contexto.

Bibliotecas de consulta padrão

O GitHub fornece bibliotecas de consulta extensas:

  • Consultas de segurança: Detecte as 10 principais vulnerabilidades do OWASP, categorias CWE e problemas de segurança específicos da linguagem.
  • Consultas de qualidade de código: Encontre cheiros de código, problemas de manutenção, problemas de desempenho e violações de práticas recomendadas.
  • Contribuições da comunidade: Milhares de consultas contribuídas por pesquisadores e desenvolvedores de segurança.
  • Atualizações regulares: O GitHub Security Lab adiciona continuamente novas consultas para vulnerabilidades emergentes.

Você pode usar essas consultas as-is ou personalizá-las para suas necessidades específicas.

CodeQL na segurança do GitHub

O CodeQL integra-se profundamente aos recursos de segurança do GitHub:

Verificação de código com CodeQL

Análise de segurança automatizada:

  • Configuração padrão: Habilite a verificação do CodeQL com um clique nas configurações do repositório.
  • Verificações agendadas: Escaneie automaticamente cada push, pull request ou de acordo com um cronograma.
  • Suporte a vários idiomas: Detecta automaticamente idiomas em seu repositório e executa consultas apropriadas.
  • Apresentação do resultado: As descobertas de segurança aparecem na guia Segurança com explicações detalhadas.

Integração de solicitação de pull:

  • Anotações embutidas: As descobertas de segurança aparecem como comentários diretamente nas linhas vulneráveis de código em solicitações de pull.
  • Verificações de bloqueio: Configure o CodeQL como uma verificação necessária que deve passar antes da mesclagem.
  • Verificação diferencial: Relata apenas novas vulnerabilidades introduzidas pela solicitação de pull, reduzindo o ruído.
  • Comentários do desenvolvedor: Os desenvolvedores veem problemas de segurança imediatamente enquanto o código está fresco em suas mentes.

GitHub Advanced Security

Para organizações, o GitHub Advanced Security fornece recursos adicionais:

  • Verificação de repositório privado: Execute CodeQL em repositórios privados.
  • Execução de consulta personalizada: Carregue e execute consultas específicas da organização.
  • Visão geral de segurança: Painel mostrando a postura de segurança em todos os repositórios.
  • Gerenciamento de alertas: Triagem, atribuição e acompanhamento de descobertas de segurança entre equipes.

Usando CodeQL em pipelines de CI/CD

O CodeQL vai além do GitHub para integrar-se a vários sistemas de CI/CD:

Abordagens de integração

Integração do GitHub Actions:

- name: Initialize CodeQL
  uses: github/codeql-action/init@v2
  with:
    languages: javascript, python

- name: Perform CodeQL Analysis
  uses: github/codeql-action/analyze@v2

Este fluxo de trabalho:

  • Inicializa o CodeQL para idiomas especificados.
  • Cria seu aplicativo (ou analisa sem criar).
  • Executa consultas de segurança.
  • Carrega os resultados na guia Segurança do GitHub.

Integração do Azure Pipelines:

O CodeQL pode ser executado no Azure Pipelines usando a interface de linha de comando:

  • Instalar a CLI do CodeQL: Baixe e instale o pacote CodeQL em seu pipeline.
  • Criar banco de dados: Execute codeql database create durante o build.
  • Analisar banco de dados: Execute codeql database analyze com pacotes de consulta selecionados.
  • Exportar resultados: Gere arquivos SARIF para visualização no Azure DevOps.

Outros sistemas de CI/CD:

A CLI do CodeQL dá suporte a qualquer plataforma de CI/CD:

  • Jenkins: executa análise do CodeQL como etapas de build.
  • GitLab CI/CD: Executa CodeQL em pipelines do GitLab com saída SARIF.
  • CircleCI: Integre verificações do CodeQL em fluxos de trabalho do CircleCI.
  • Sistemas personalizados: Use a CLI do CodeQL de qualquer ambiente que possa executar ferramentas de linha de comando.

Portões de segurança

Use os resultados do CodeQL como portões de qualidade:

  • Falhas de build: configura pipelines para falhar quando o CodeQL encontrar vulnerabilidades graves.
  • Análise de tendência: Acompanhe as métricas de segurança ao longo do tempo para medir o aprimoramento.
  • Requisitos de conformidade: Gere evidências de verificação de segurança para auditorias e certificações de conformidade.
  • Correção automática: dispara fluxos de trabalho automatizados quando vulnerabilidades específicas forem detectadas.

Ferramentas de desenvolvimento do CodeQL

O CodeQL fornece ferramentas para criar e testar consultas:

Extensão do Visual Studio Code

A extensão oficial do CodeQL para o VS Code oferece:

  • Desenvolvimento de consultas: Escreva e teste consultas CodeQL com realce de sintaxe, preenchimento automático e documentação embutida.
  • Análise de banco de dados local: Execute consultas em bancos de dados criados a partir de bases de código locais.
  • Visualização de resultados: Confira os resultados da consulta com navegação no código-fonte e caminhos de fluxo de dados.
  • Suporte à depuração: Percorra a execução da consulta um passo de cada vez para entender os resultados e otimizar o desempenho.

Interface de linha de comando

A CLI do CodeQL habilita a análise com script:

  • Criação de banco de dados:codeql database create extrai o código no formato queryable.
  • Execução da consulta:codeql database analyze executa consultas e gera resultados.
  • Testar consultas:codeql test run valida consultas em relação a casos de teste.
  • Gerenciamento de pacotes: Baixe e gerencie pacotes de consulta padrão.

Benefícios do CodeQL para automação de segurança

A integração do CodeQL ao processo de DevSecOps oferece vantagens significativas:

Produtividade do desenvolvedor

Detecção antecipada:

  • Segurança Shift-left: encontra vulnerabilidades durante o desenvolvimento e não em produção.
  • Correção mais rápida: Corrija problemas quando o código é novo e as alterações são pequenas.
  • Oportunidades de aprendizagem: Os desenvolvedores aprendem práticas de codificação seguras com base em comentários imediatos.
  • Redução na troca de contexto: As descobertas de segurança aparecem em ferramentas de desenvolvimento familiares.

Resultados precisos:

  • Falsos positivos baixos: A análise semântica produz descobertas mais precisas do que a correspondência de padrões.
  • Informações contextuais: Os resultados incluem caminhos de fluxo de dados mostrando exatamente como as vulnerabilidades ocorrem.
  • Descobertas priorizadas: Concentre-se em questões exploráveis em vez de preocupações teóricas.
  • Descoberta de variantes: Encontre todas as instâncias de um padrão de vulnerabilidade, não apenas exemplos óbvios.

Segurança organizacional

Cobertura abrangente:

  • Base de código inteira: Analise todo o código, incluindo dependências de terceiros e componentes herdados.
  • Vários idiomas: Análise de segurança uniforme em aplicativos poliglotas.
  • Padrões consistentes: Aplique as mesmas regras de segurança em todos os repositórios.
  • Análise histórica: Examine o código existente para estabelecer linhas de base de segurança.

Segurança escalonável:

  • Verificação automatizada: Não é necessário realizar revisões manuais de segurança para cada commit.
  • Monitoramento contínuo: Verificações regulares detectam vulnerabilidades recentemente divulgadas.
  • Segurança como código: Codifique os requisitos de segurança como consultas armazenadas no controle de versão.
  • Compartilhamento de conhecimento: As bibliotecas de consulta capturam o conhecimento de segurança institucional.

Conformidade e governança

Trilhas de auditoria:

  • Histórico de verificações: registra todas as verificações de segurança com carimbos de data/hora e resultados.
  • Ciclo de vida da detecção: acompanha vulnerabilidades da detecção à correção.
  • Imposição de política: Demonstre que verificações de segurança ocorrem para cada versão.
  • Geração de evidências: Produza relatórios para auditores e estruturas de conformidade.

Para obter mais informações sobre o CodeQL, consulte a Visão geral do CodeQL.

Para obter as ferramentas disponíveis, consulte As Ferramentas do CodeQL.