Explore 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 procurar padrões de texto, o CodeQL entende a estrutura e o significado do seu código, permitindo análises sofisticadas de segurança e qualidade.

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

Principais características do CodeQL

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, gráficos de fluxo de controle e caminhos de fluxo de dados.
  • Formato consultável: Torna o código consultável usando uma linguagem de consulta especializada, semelhante à consulta de um banco de dados tradicional.
  • Abordagem agnóstica da linguagem: Suporta 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 permite uma análise de segurança precisa:

  • Análise de variantes: 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 se movem pelo seu aplicativo de fontes (entrada do usuário) para destinos (operações sensíveis).
  • Rastreamento de manchas: Identifica quando dados não confiáveis atingem operações confidenciais sem validação ou higienização adequadas.
  • Análise de fluxo de controle: Compreende os caminhos de execução e a lógica condicional para encontrar vulnerabilidades que só ocorrem sob condições específicas.

Como funciona o CodeQL

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 seu código:

  • Extração de código: Analisa seus arquivos de origem durante a compilação ou através da análise estática.
  • Criação de bases de dados: Cria um banco de dados abrangente que representa a estrutura do seu código, incluindo árvores de sintaxe abstratas, gráficos de fluxo de controle e dependências de dados.
  • Captura de metadados: Registra locais de arquivos, números de linha, escopos variáveis, chamadas de função e hierarquias de classe.
  • Otimização: Indexa o banco de dados para consultas eficientes, mesmo em grandes bases de código.

Esta base de dados torna-se 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

Quando o banco de dados existir, você executa consultas para encontrar problemas de segurança:

  • Pacotes de consulta padrão: O GitHub fornece conjuntos de consultas com curadoria para vulnerabilidades comuns (OWASP Top 10, padrões 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 às assinaturas de vulnerabilidade.
  • Desempenho: As consultas são executadas rapidamente porque operam no banco de dados indexado em vez de arquivos de origem brutos.

Exemplos de categorias de consulta incluem:

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

Fase 3: Interpretar os resultados

A fase final apresenta os resultados em formatos acionáveis:

  • Classificação dos resultados: O CodeQL prioriza as descobertas por gravidade, nível de confiança e capacidade de exploração.
  • Informações contextuais: Cada localização inclui locais de arquivos, números de linha, trechos de código afetados e caminhos de fluxo de dados.
  • Orientação de remediação: Os resultados incluem explicações sobre a vulnerabilidade e recomendações para corrigi-la.
  • Integração: Os resultados integram-se com a guia Segurança do GitHub, anotações de solicitação 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 código:

Estrutura e sintaxe da 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.
  • Composabilidade: 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"

Esta consulta identifica vulnerabilidades específicas de injeção de SQL através de:

  • Identificação de pontos de execução SQL.
  • Encontrar fontes de entrada do usuário.
  • Acompanhamento do fluxo de dados desde a entrada até a execução do SQL.
  • Relatar vulnerabilidades com contexto.

Bibliotecas de consulta padrão

O GitHub fornece extensas bibliotecas de consultas:

  • Consultas de segurança: Detete as 10 principais vulnerabilidades do OWASP, categorias de CWE e problemas de segurança específicos do idioma.
  • 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 comunitárias: 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 com os recursos de segurança do GitHub:

Digitalizaçã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: Analise automaticamente em cada push, request pull, ou num horário definido.
  • Suporte multi-idioma: Deteta automaticamente idiomas em seu repositório e executa consultas apropriadas.
  • Apresentação dos resultados: As descobertas de segurança aparecem na guia Segurança com explicações detalhadas.

Integração de pull request:

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

GitHub Advanced Security

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

  • Varredura de repositório privado: Execute o 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.
  • Gestão de alertas: Triagem, atribuição e acompanhamento de descobertas de segurança entre as equipes.

Usando o CodeQL em pipelines de CI/CD

O CodeQL se estende além do GitHub para se integrar com vários sistemas CI/CD:

Abordagens de integração

Integração com o 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 compilação).
  • Executa consultas de segurança.
  • Carrega os resultados para a 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:

  • Instale o CodeQL CLI: Baixe e instale o pacote CodeQL em seu pipeline.
  • Criar base de dados: Execute codeql database create durante a sua compilação.
  • Analise o 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 CI/CD:

CodeQL CLI suporta qualquer plataforma CI/CD:

  • Jenkins: Execute a análise do CodeQL como passos de construção.
  • CI/CD do GitLab: Execute o CodeQL em pipelines do GitLab com saída SARIF.
  • CircleCI: Integre digitalizações do CodeQL em fluxos de trabalho do CircleCI.
  • Sistemas personalizados: Use a CLI do CodeQL em qualquer ambiente que possa executar ferramentas de linha de comando.

Portões de segurança

Use os resultados do CodeQL como portas de qualidade:

  • Falha nas compilações: Configure pipelines para falhar quando o CodeQL encontrar vulnerabilidades de alta gravidade.
  • Análise de tendências: Acompanhe as métricas de segurança ao longo do tempo para medir a melhoria.
  • Requisitos de conformidade: Gere evidências de verificação de segurança para auditorias e certificações de conformidade.
  • Remediação automática: Acione fluxos de trabalho automatizados quando vulnerabilidades específicas forem detetadas.

Ferramentas de desenvolvimento CodeQL

O CodeQL fornece ferramentas para criar e testar consultas:

Extensão do Visual Studio Code

A extensão oficial do CodeQL para 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 dos resultados: Veja os resultados da consulta com a navegação do código-fonte e os caminhos de fluxo de dados.
  • Suporte de depuração: Percorra a execução da consulta para entender os resultados e otimizar o desempenho.

Interface de linha de comando

A CLI do CodeQL permite a análise programável:

  • Criação de bases de dados:codeql database create extrai o código em formato consultável.
  • Execução da consulta:codeql database analyze Executa consultas e gera resultados.
  • Consultas de teste:codeql test run Valida as consultas com base nos casos de teste.
  • Gestão de pacotes: Transfira e faça a gestão dos pacotes de consulta padrão.

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

A integração do CodeQL em seu processo DevSecOps oferece vantagens significativas:

Produtividade do desenvolvedor

Deteção precoce:

  • Segurança Shift-left: Encontre vulnerabilidades durante o desenvolvimento e não na produção.
  • Remediaçã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 a partir de feedback imediato.
  • Comutação de contexto reduzida: As descobertas de segurança aparecem em ferramentas de desenvolvimento conhecidas.

Resultados precisos:

  • Baixos falsos positivos: A análise semântica produz resultados mais precisos do que a correspondência de padrões.
  • Informações contextuais: Os resultados incluem caminhos de fluxo de dados que mostram exatamente como as vulnerabilidades ocorrem.
  • Resultados priorizados: 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 completa: Analise todo o código, incluindo dependências de terceiros e componentes herdados.
  • Vários idiomas: Análise de segurança uniforme em aplicações poliglotas.
  • Padrões consistentes: Aplique as mesmas regras de segurança em todos os repositórios.
  • Análise histórica: Analise o código existente para estabelecer linhas de base de segurança.

Segurança escalável:

  • Varredura automatizada: Não são necessárias análises de segurança manuais para cada commit.
  • Monitorização contínua: Verificações regulares detetam vulnerabilidades recém-divulgadas.
  • Segurança como código: Codificar requisitos de segurança como consultas armazenadas no controle de versão.
  • Partilha de conhecimentos: As bibliotecas de consulta capturam o conhecimento de segurança institucional.

Conformidade e governança

Pistas de auditoria:

  • Histórico de digitalização: Registro de todas as verificações de segurança com carimbos de data/hora e resultados.
  • Encontrar o ciclo de vida: Rastreie vulnerabilidades desde a deteção até a correção.
  • Aplicação da política: Demonstre que as verificações de segurança ocorrem para cada versão.
  • Geração de provas: Produzir relatórios para auditores e estruturas de conformidade.

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

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