O que é CodeQL?

Concluído

CodeQL é o mecanismo de análise usado por desenvolvedores para automatizar verificações de segurança e por pesquisadores de segurança para realizar análises de variantes.

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 as suas próprias para usar em análises personalizadas. As consultas que encontram possíveis bugs destacam 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, pacotes de consultas e pacotes de idiomas de consulta para executar análises de variantes.

Análise de variantes

A análise de variantes é o processo de usar uma vulnerabilidade de segurança conhecida como uma 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 adequadamente em várias bases de código.

Consultar código usando CodeQL é a maneira mais eficiente de realizar análise de variantes. 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 sobre a consulta para encontrar automaticamente variantes lógicas do mesmo bug que podem ser perdidas usando técnicas manuais tradicionais.

Bases 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 completa e hierárquica do código, incluindo uma representação da árvore de sintaxe abstrata, o gráfico de fluxo de dados e o gráfico 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 realizada durante o processo de extração e a análise complexa real do avaliador de consulta CodeQL. O esquema especifica, por exemplo, que há uma tabela para cada construção de linguagem.

Para cada linguagem, as bibliotecas CodeQL definem classes para fornecer uma camada de abstração sobre as tabelas de banco de dados. Isso fornece uma visão orientada a objetos dos dados, o que facilita a gravação de consultas.

Por exemplo, em um banco de dados CodeQL para um programa Java, duas tabelas principais são:

  • A expressions tabela, contendo uma linha para cada expressão no código-fonte que foi analisada durante o processo de compilação.
  • A statements tabela, contendo uma linha para cada instrução no código-fonte que foi analisada 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 consultas

Os pacotes de consulta CodeQL fornecem uma maneira de selecionar consultas com base em seu nome de arquivo, propriedades de metadados ou localização no disco ou em um pacote de QL. Crie conjuntos de consultas para as consultas que você deseja usar com freqüência em suas análises do CodeQL.

Os pacotes de consultas 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 conjunto de consultas são armazenadas em arquivos YAML com a extensão .qls. Uma definição de suíte é uma sequência de instruções onde cada instrução é um mapeamento YAML com (geralmente) uma única chave. As instruções são executadas na ordem em que aparecem na definição do conjunto de consultas. Depois de todas as instruções na definição do pacote terem sido executadas, o resultado é um conjunto de consultas selecionadas.

Pacotes de consultas padrão

Há dois pacotes de consulta integrados para o CodeQL:

  • default: Estas são as consultas executadas por padrão na varredura de código CodeQL no GitHub, disponível com a configuração padrão de verificação de código. As consultas neste conjunto de consultas são altamente precisas e retornam alguns resultados de verificação de código falso positivo. Em relação ao security-extended conjunto de consultas, o conjunto padrão retorna menos resultados de varredura de código de baixa confiança.
  • security-extended: Esta suíte contém todas as consultas da suíte, além de default consultas de segurança extras com precisão e gravidade um pouco menores. Está disponível com a configuração padrão de análise de código e está listado como a opção "Extended" no menu suspenso das suites de consulta. Em relação ao default conjunto de consultas, esse conjunto 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 default pacote de consultas. Isso pode ser alterado ao selecionar o ícone de opções para visualizar a configuração do CodeQL e, em seguida, selecionar o botão de edição. Em "Configurações de digitalização", você pode escolher uma das duas opções descritas como o conjunto de consultas.

Pacotes CodeQL

Os pacotes CodedQL são usados para organizar os arquivos usados na análise do CodeQL para que você possa criar, compartilhar, depender e executar consultas e bibliotecas do CodeQL facilmente. Eles contêm consultas, arquivos de biblioteca, pacotes de consultas e metadados importantes. Com os pacotes 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.

Existem três tipos de pacotes CodeQL: pacotes de consulta, pacotes de biblioteca e pacotes de modelo.

  • Os pacotes de consultas são 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 uma execução consistente e eficiente das consultas no pacote.
  • Os pacotes de bibliotecas são projetados para serem usados por pacotes de consulta (ou outros pacotes de biblioteca) e não contêm consultas em si. As bibliotecas não são compiladas separadamente.
  • Os pacotes de modelos podem ser usados para expandir a análise de varredura de código para incluir dependências que não são suportadas por padrão. Os pacotes de modelos estão atualmente em versão beta e sujeitos a alterações. Durante a versão beta, pacotes de modelos 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 CodeQL".

Estrutura do pacote CodeQL

A CLI CodeQL pode ser usada para desenvolver e publicar um pacote usando o pack init comando. Este comando criará a estrutura de diretórios e os arquivos necessários, incluindo o arquivo principal chamado qlpack.yml em seu diretório raiz. Os metadados em cada qlpack.yml arquivo informam ao CodeQL como compilar quaisquer consultas no pacote, de quais bibliotecas o pacote depende e onde encontrar definições do conjunto de consultas.

O conteúdo do pacote CodeQL (consultas ou bibliotecas usadas na análise CodeQL) está incluído no mesmo diretório que qlpack.yml, ou 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 CodeQL. Isto é, para todos os arquivos .ql e .qll no pacote, o CodeQL resolverá todas as declarações de importação relativas ao diretório que contém o arquivo qlpack.yml na raiz do pacote.

Aqui está um arquivo de exemplo qlpack.yml :

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 CodeQL, consulte "Publicando e usando pacotes CodeQL". [1]