Explore 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 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 createdurante a sua compilação. -
Analise o banco de dados: Execute
codeql database analyzecom 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 createextrai o código em formato consultável. -
Execução da consulta:
codeql database analyzeExecuta consultas e gera resultados. -
Consultas de teste:
codeql test runValida 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.