Explorar o CodeQL no GitHub
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 createdurante o build. -
Analisar banco de dados: Execute
codeql database analyzecom 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 createextrai o código no formato queryable. -
Execução da consulta:
codeql database analyzeexecuta consultas e gera resultados. -
Testar consultas:
codeql test runvalida 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.