O que é CodeQL?
O CodeQL é o mecanismo de análise usado pelos desenvolvedores para automatizar verificações de segurança e por pesquisadores de segurança para executar a análise de variante.
No CodeQL, o código é tratado como dados. Vulnerabilidades de segurança, bugs e outros erros são modelados como consultas que podem ser executadas em bancos de dados extraídos do código. Você pode executar as consultas padrão do CodeQL, escritas por pesquisadores do GitHub e colaboradores da comunidade, ou escrever suas próprias para uso em análises personalizadas. As consultas que encontram possíveis bugs realçam o resultado diretamente no arquivo de origem.
Nesta unidade, você aprenderá sobre a ferramenta de análise estática CodeQL e como ela usa bancos de dados, conjuntos de consulta e pacotes de idiomas de consulta para executar a análise de variantes.
Análise de variante
A análise de variante é o processo de usar uma vulnerabilidade de segurança conhecida como semente para encontrar problemas semelhantes em seu código. É uma técnica que os engenheiros de segurança usam para identificar possíveis vulnerabilidades e garantir que essas ameaças sejam corrigidas corretamente em várias bases de código.
Consultar o código usando CodeQL é a maneira mais eficiente de executar a análise de variante. Você pode usar as consultas padrão do CodeQL para identificar vulnerabilidades de propagação ou encontrar novas vulnerabilidades escrevendo suas próprias consultas CodeQL personalizadas. Em seguida, você pode desenvolver ou iterar a consulta para localizar automaticamente variantes lógicas do mesmo bug que podem ser perdidas usando técnicas manuais tradicionais.
Bancos de dados CodeQL
Os bancos de dados CodeQL contêm dados consultáveis extraídos de uma base de código para um único idioma em um determinado momento. O banco de dados contém uma representação hierárquica completa do código, incluindo uma representação da árvore de sintaxe abstrata, o grafo de fluxo de dados e o grafo de fluxo de controle.
Cada linguagem tem seu próprio esquema de banco de dados exclusivo que define as relações usadas para criar um banco de dados. O esquema fornece uma interface entre a análise lexical inicial executada durante o processo de extração e a análise complexa real do avaliador de consulta do CodeQL. O esquema especifica, por exemplo, que há uma tabela para cada constructo de linguagem.
Para cada idioma, as bibliotecas CodeQL definem classes para fornecer uma camada de abstração nas tabelas de banco de dados. Isso fornece uma visão orientada a objetos dos dados, o que facilita escrever consultas.
Por exemplo, em um banco de dados CodeQL para um programa Java, duas tabelas-chave são:
- A tabela
expressions, que contém uma linha para cada instrução única no código-fonte que foi analisado durante o processo de compilação. - A tabela
statements, que contém uma linha para cada instrução única no código-fonte que foi analisado durante o processo de compilação.
A biblioteca CodeQL define classes para fornecer uma camada de abstração sobre cada uma dessas tabelas (e as tabelas auxiliares relacionadas): Expr e Stmt.
Pacotes de consulta
Os conjuntos de consultas CodeQL fornecem uma maneira de selecionar consultas com base em seu nome de arquivo, propriedades de metadados ou localização em disco ou em um pacote QL. Crie pacotes de consulta para as consultas que você deseja usar com frequência em suas análises de CodeQL.
Os pacotes de consulta permitem que você passe várias consultas para o CodeQL sem precisar especificar o caminho para cada arquivo de consulta individualmente. As definições do pacote de consultas são armazenadas em arquivos YAML com a extensão .qls. Uma definição de pacote é uma sequência de instruções, em que cada instrução é um mapeamento YAML com (geralmente) uma só chave. As instruções são executadas na ordem em que aparecem na definição do pacote de consultas. Depois que todas as instruções na definição do conjunto tiverem sido executadas, o resultado será um pacote de consultas selecionadas.
Pacotes de consulta padrão
Há dois conjuntos de consultas internos para CodeQL:
-
default: Essas são as consultas executadas por padrão na verificação de código do CodeQL no GitHub, disponível com a configuração padrão da verificação de código. As consultas neste conjunto de consultas são altamente precisas e retornam poucos resultados de verificação de código falso positivo. Em relação ao conjunto de consultassecurity-extended, o pacote padrão retorna menos resultados de verificação de código de baixa confiança. -
security-extended: Este pacote contém todas as consultas do pacotedefault, além de consultas de segurança extras com precisão e gravidade ligeiramente menores. Ele está disponível com a configuração padrão da verificação de código e está listado como a opção "Estendido" na lista suspensa de pacotes de consultas. Em relação ao conjunto de consultasdefault, esse pacote pode retornar um número maior de resultados de verificação de código falso positivo.
A configuração padrão da verificação de código usará o conjunto de consultas default. Isso pode ser alterado selecionando o ícone de mais opções para exibir a configuração do CodeQL e, em seguida, selecionando o botão de edição. Em "Configurações de verificação", você pode escolher uma das duas opções acima como o conjunto de consultas.
Pacotes do CodeQL
Os pacotes do CodedQL são usados para organizar os arquivos usados na análise do CodeQL para que você possa criar, compartilhar, criar dependências e executar facilmente consultas e bibliotecas do CodeQL. Eles contêm consultas, arquivos de biblioteca, pacotes de consultas e metadados importantes. Com os pacotes do CodeQL e os comandos de gerenciamento de pacotes na CLI do CodeQL, você pode publicar suas consultas personalizadas e integrá-las à sua análise de base de código.
Há três tipos de pacotes do CodeQL: pacotes de consultas, pacotes de biblioteca e pacotes de modelos.
- Os pacotes de consultas foram projetados para serem executados. Quando um pacote de consultas é publicado, o pacote inclui todas as dependências transitivas e representações pré-compiladas de cada consulta, além das fontes de consulta. Isso garante a execução consistente e eficiente das consultas no pacote.
- Os pacotes de biblioteca são projetados para serem usados por pacotes de consulta (ou outros pacotes de biblioteca) e não contêm consultas por conta própria. As bibliotecas não são compiladas separadamente.
- Pacotes de modelos podem ser usados para expandir a análise de verificação de código para incluir dependências que não têm suporte por padrão. Pacotes de modelos estão atualmente em versão beta e sujeitos a alterações. Durante o beta, pacotes de modelo estão disponíveis para análise Java no nível do repositório. Para obter mais informações sobre como criar seus próprios pacotes de modelos, consulte "Criando um pacote de modelos do CodeQL".
Estrutura do pacote do CodeQL
A CLI do CodeQL pode ser usada para desenvolver e publicar um pacote usando o pack init comando. Esse comando criará a estrutura de diretório e os arquivos necessários, incluindo o arquivo principal chamado qlpack.yml em seu diretório raiz. Os metadados em cada arquivo qlpack.yml informa ao CodeQL como compilar quaisquer consultas no pacote, de quais bibliotecas o pacote depende e de onde encontrar definições do conjunto de consultas.
O conteúdo do pacote do CodeQL (consultas ou bibliotecas usadas na análise do CodeQL) está incluído no mesmo diretório onde está o arquivo qlpack.yml, ou em seus subdiretórios.
O diretório que contém o arquivo qlpack.yml serve como o diretório raiz para o conteúdo do pacote do CodeQL. Ou seja, para todos os arquivos .ql e .qll do pacote, o CodeQL resolverá todas as instruções de importação no diretório relativo ao arquivo qlpack.yml na raiz do pacote.
Veja um arquivo qlpack.yml de exemplo:
name: codeql/java-queries
version: 0.0.6-dev
groups: java
suites: codeql-suites
extractor: java
defaultSuiteFile: codeql-suites/java-code-scanning.qls
dependencies:
codeql/java-all: "*"
codeql/suite-helpers: "*"
Para obter mais informações sobre como criar e publicar seus próprios pacotes do CodeQL, consulte "Publicando e usando pacotes do CodeQL".[1]