Compartilhar via


Executar a Análise de CodeQL no Código do Driver do Windows

O CodeQL é um poderoso mecanismo de análise estática que ajuda os desenvolvedores a identificar vulnerabilidades de segurança e violações de código no código-fonte do driver do Windows. Este artigo explica como usar a análise do CodeQL para criar um arquivo de verificação de driver para a certificação WHCP (Programa de Compatibilidade de Hardware do Windows).

Neste artigo você:

  • Instale a versão apropriada do CodeQL.
  • Instale os pacotes codeql e os pacotes de consulta necessários.
  • Execute o CodeQL para criar um banco de dados e analisar seu código.
  • Crie um arquivo de verificação de driver.

Selecione a versão apropriada do CodeQL para o driver

Note

O Visual Studio (VS) 17.8 interrompeu a compatibilidade com versões mais antigas do CodeQL usadas nas ramificações WHCP_21H2 e WHCP_22H2. A CLI do CodeQL versão 2.15.4 é validada para uso com WHCP 21H2 e WHCP 22H2 ao usar o Visual Studio 17.8 ou superior. Ao usar o Visual Studio 17.7 ou anterior, use a versão 2.4.6 ou a versão 2.6.3. Para o Programa WHCP, use a versão da CLI do CodeQL e a versão do Windows para a qual você está certificando, de acordo com a tabela a seguir.

Selecione a aba para o seu cenário.

Use essa matriz para determinar as versões a serem baixadas.

Versão do Windows Versão da CLI do CodeQL versão do pacote CodeQL do microsoft/windows-drivers versão do pacote CodeQL da microsoft/cpp-queries Versão do codeql/cpp-queries Branch associado
Windows Server 2022 2.4.6 ou 2.15.4 1.0.13 (Se estiver usando o codeql 2.15.4) N/A 0.9.0 (Se estiver usando o codeql 2.15.4) WHCP_21H2
Windows 11 2.4.6 ou 2.15.4 1.0.13 (Se estiver usando o codeql 2.15.4) N/A 0.9.0 (Se estiver usando o codeql 2.15.4) WHCP_21H2
Windows 11, versão 22H2 2.6.3 ou 2.15.4 1.0.13 (Se estiver usando o codeql 2.15.4) N/A 0.9.0 (Se estiver usando o codeql 2.15.4) WHCP_22H2
Windows 11, versão 23H2 2.6.3 ou 2.15.4 1.0.13 (Se estiver usando o codeql 2.15.4) N/A 0.9.0 (Se estiver usando o codeql 2.15.4) WHCP_22H2
Windows 11, versão 24H2 2.15.4 1.1.0 N/A 0.9.0 WHCP_24H2
Windows Server 2025 2.20.1 1.8.0 0.0.4 N/A WHCP_25H2
Windows 11, versão 25H2 2.20.1 1.8.0 0.0.4 N/A WHCP_25H2
Windows 11, versão 26H1 2.24.1 1.8.2 0.0.4 N/A WHCP_26H1

Note

Uma versão do pacote CodeQL não é especificada para a CLI 2.4.6 e 2.6.3 do CodeQL porque somente versões do CodeQL posteriores à v2.7.0 dão suporte a pacotes CodeQL.

Versões do CodeQL validadas para uso com WHCP

Para obter as informações mais recentes sobre a versão, incluindo o teste das versões mais recentes em desenvolvimento, consulte as ferramentas complementares do desenvolvedor de driver do Windows.

Versão da CLI do CodeQL
2.24.1
2.23.3
2.21.4
2.21.2
2.20.1
2.15.4

Baixar e instalar o CodeQL

  1. Crie um diretório para conter CodeQL. Este exemplo usa C:\codeql-home\

    C:\> mkdir C:\codeql-home
    
  2. Consulte as tabelas anteriores para selecionar qualquer versão da CLI do CodeQL para usar de acordo com a ramificação desejada das consultas de driver da Microsoft. Se você estiver realizando a análise como parte do programa WHCP, consulte a tabela Para Uso do Programa de Compatibilidade de Hardware do Windows; caso contrário, use a branch principal e a versão da CLI listada no README do GitHub ou a tabela anterior mencionada para "uso geral". O uso de uma versão diferente pode resultar em um banco de dados incompatível com as bibliotecas.

  3. Navegue até a versão binária da CLI do CodeQL associada às tabelas anteriores e baixe o arquivo zip de acordo com a arquitetura do projeto. Por exemplo, para o Windows codeql-win64.zipde 64 bits.

  4. Extraia o diretório da CLI do Codeql para aquele que você criou, por exemplo: *C:\codeql-home\codeql*.

  5. Verifique se o CodeQL está instalado corretamente verificando a versão:

     C:\codeql-home\codeql>codeql --version
     CodeQL command-line toolchain release 2.15.4.
     Copyright (C) 2019-2023 GitHub, Inc.
     Unpacked in: C:\codeql-home\codeql
         Analysis results depend critically on separately distributed query and
         extractor modules. To list modules that are visible to the toolchain,
         use 'codeql resolve qlpacks' and 'codeql resolve languages'.
    

Usando a ajuda do CodeQL

C:\codeql-home\codeql\>codeql --help
Usage: codeql <command> <argument>...
Create and query CodeQL databases, or work with the QL language.

GitHub makes this program freely available for the analysis of open-source software and certain other uses, but it is
not itself free software. Type codeql --license to see the license terms.

      --license              Show the license terms for the CodeQL toolchain.
Common options:
  -h, --help                 Show this help text.
  -v, --verbose              Incrementally increase the number of progress messages printed.
  -q, --quiet                Incrementally decrease the number of progress messages printed.
Some advanced options have been hidden; try --help -v for a fuller view.
Commands:
  query     Compile and execute QL code.
  bqrs      Get information from .bqrs files.
  database  Create, analyze and process CodeQL databases.
  dataset   [Plumbing] Work with raw QL datasets.
  test      Execute QL unit tests.
  resolve   [Deep plumbing] Helper commands to resolve disk locations etc.
  execute   [Deep plumbing] Low-level commands that need special JVM options.
  version   Show the version of the CodeQL toolchain.
  generate  Generate formatted QL documentation.

Para obter ajuda em um comando específico, execute o comando< codeql >--help. Por exemplo:

codeql create --help

Para obter ajuda para subcomandos, liste-os hierarquicamente, por exemplo

codeql create language --help

Instalar os pacotes CodeQL

Selecione a guia para o ambiente de build:

Use este procedimento se você estiver usando o Visual Studio 2022 17.8 ou superior para a certificação WHCP para 21H2 ou posterior e a CLI do CodeQL versão 2.15.4 ou posterior.

Note

Se você executou testes codeql com uma versão anterior do CodeQL, certifique-se de remover o submódulo CodeQL antigo se você ainda tiver uma versão antiga do repositório clonado. O CodeQL pode tentar usar as consultas no submódulo por padrão, o que pode causar erros devido a versões incompatíveis.

Baixar os pacotes de consulta CodeQL

O CodeQL introduziu pacotes CodeQL, ou pacotes de consultas, na versão 2.7.0, eliminando a necessidade de clonar o repositório Windows-Driver-Developer-Supplemental-Tools para usar consultas para certificação.

  1. Baixe a versão correta do pacote microsoft/windows-drivers da tabela Uso do Programa de Compatibilidade de Hardware do Windows . Especifique o @<version> no comando a seguir.
C:\codeql-home\> codeql pack download microsoft/windows-drivers@<version>

Por exemplo, se você estiver certificando o WHCP 26H1, execute o seguinte comando para baixar o pacote de consulta windows-drivers 1.8.2:

C:\codeql-home\> codeql pack download microsoft/windows-drivers@1.8.2

Use este comando para baixar a versão 0.0.4 do pacote de consultas cpp-queries da Microsoft.

C:\codeql-home\> codeql pack download microsoft/cpp-queries@0.0.4

O CodeQL instala os pacotes de consulta no diretório padrão:

C:\Users\<current user>\.codeql\packages\microsoft\windows-drivers\<downloaded version>\

Important

Não altere o diretório de instalação nem mova o pacote de consultas instalado.

A Microsoft fornece três pacotes de consultas para simplificar o fluxo de trabalho de desenvolvedor de driver de ponta a ponta. Essas suítes estão incluídas no pacote CodeQL microsoft/windows-drivers.

  • recommended.qls contém um amplo conjunto de verificações para bugs comuns de driver e C/C++. É recomendável executar esse pacote por padrão e examinar os resultados.
  • mustrun.qls contém verificações que devem ser executadas para passar na certificação WHCP (Programa de Compatibilidade de Hardware do Windows). Como essas consultas podem produzir falsos positivos em alguns casos, a falha dessas verificações não resultará em falha no teste do Logotipo das Ferramentas Estáticas, mas os desenvolvedores devem examinar os resultados e corrigir os bugs reais. Um DVL gerado sem resultados para essas verificações falha no teste do Logotipo das Ferramentas Estáticas. Para 26H1, mustrun.qls e recommended.qls são idênticos .
  • mustfix.qls serve como um subconjunto das consultas obrigatórias e contém verificações de problemas que devem ser corrigidos para passar na certificação WHCP. Um DVL gerado com falhas nessas regras não passa no teste do Logotipo das Ferramentas Estáticas.

Para obter detalhes sobre o conteúdo dos conjuntos de consultas, consulte CodeQL Queries and Suites.

Criar o Banco de Dados CodeQL

Esses exemplos pressupõem o uso de um ambiente de desenvolvimento do Windows e que o local de instalação é C:\codeql-home, mas você pode usar a configuração adequada a você. Consulte linguagens e estruturas compatíveis com CodeQL para obter uma lista de quais compiladores têm suporte.

  1. Crie um diretório para CodeQL para colocar os bancos de dados que ele cria. Por exemplo: C:\codeql-home\databases

    mkdir C:\codeql-home\databases
    
  2. Use o comando CodeQL para criar um banco de dados com estes parâmetros:

    • O primeiro parâmetro é um link para o diretório do banco de dados. Por exemplo, C:\codeql-home\databases\MyDriverDatabase. (Esse comando falhará se o diretório já existir.)
    • --language ou -l especifica o idioma ou idiomas em que o código-fonte está. Esse parâmetro pode ser uma lista separada por vírgulas, como [cpp, javascript].
    • --source-root ou -s especifica o caminho para o código-fonte.
    • --command ou -c especifica o comando de build ou o caminho para o arquivo de build.
    codeql database create <path to new database> --language=<cpp> --source-root=<driver parent directory> --command=<build command or path to build file>
    

Examples

Exemplo de driver único.

C:\codeql-home\codeql> codeql database create D:\DriverDatabase --language=cpp --source-root=D:\Drivers\SingleDriver --command="msbuild /t:rebuild D:\Drivers\SingleDriver\SingleDriver.sln"

Exemplo de vários drivers.

C:\codeql-home\codeql> codeql database create D:\SampleDriversDatabase --language=cpp --source-root=D:\AllMyDrivers\SampleDrivers --command=D:\AllMyDrivers\SampleDrivers\BuildAllSampleDrivers.cmd

Para obter mais informações ou ajuda usando o database create comando, consulte Como criar bancos de dados CodeQL ou usar a ajuda do CodeQL.

Executar Análise

Neste ponto, a criação do banco de dados está concluída e a próxima etapa é executar a análise real no código-fonte do driver.

  1. Use o comando CodeQL para analisar seu banco de dados usando os seguintes parâmetros:

    • o primeiro parâmetro é um link para o diretório do banco de dados. Por exemplo, C:\codeql-home\databases\MyDriverDatabase. (Observação: esse comando falhará se o diretório não existir.)
    • --format é o tipo de arquivo do arquivo de saída. As opções incluem: SARIF e CSV. (Para usuários WHCP , use o formato SARIF.)
    • --output é o caminho para onde você deseja que o arquivo de saída inclua o formato no nome do arquivo. (Esse comando falhará se o diretório ainda não existir.)
    • o parâmetro especificadores de consulta é uma lista de argumentos separados por espaço que pode incluir:
      • um caminho para um arquivo de consulta
      • um caminho para um diretório que contém arquivos de consulta
      • um caminho para um arquivo do conjunto de consultas
      • o nome de um pacote de consultas CodeQL
    codeql database analyze <path to database> <path to query suite .qls file> --format=sarifv2.1.0 --output=<outputname>.sarif
    

    Example:

    codeql database analyze D:\DriverDatabase microsoft/windows-drivers:windows-driver-suites/recommended.qls --format=sarifv2.1.0 --output=D:\DriverAnalysis1.sarif
    

    Para obter mais informações ou ajuda usando o database analyze comando, consulte Analisando bancos de dados com a CLI do CodeQL, usando um pacote CodeQL para analisar um banco de dados CodeQL ou usando a ajuda do CodeQL.

Exibir e interpretar resultados

Esta seção se concentra em gerar e interpretar resultados no formato SARIF. Outros formatos de resultados, como CSV, estão disponíveis, mas não são compatíveis com o teste de Logotipo de Ferramentas Estáticas.

O SARIF (Formato de Intercâmbio de Resultados de Análise Estática) é um formato de tipo JSON usado para compartilhar resultados de análise estática. Leia mais sobre o padrão no SARIF (Formato de Intercâmbio de Resultados de Análise Estática) do OASIS, como o CodeQL usa a Saída SARIF e o json de esquema.

Há vários métodos para interpretar os resultados da análise, incluindo a classificação manual por meio dos objetos. Aqui estão alguns que usamos:

  • O Visualizador do Microsoft Sarif (Web) tem funcionalidade que permite arrastar e soltar o arquivo SARIF no visualizador e, em seguida, exibe os resultados categorizados por regra. Esse visualizador é uma maneira rápida e fácil de ver a contagem de violações ou quais consultas têm violações, mas fornece apenas informações limitadas sobre onde no código-fonte a violação ocorreu. A página não será atualizada se não houver violações.

  • O Visualizador do Microsoft SARIF para Visual Studio é ótimo para exibir os resultados no Visual Studio para a transição perfeita de resultados para o código-fonte.

  • A extensão SARIF para Visual Studio Code abre um painel de visualização e exibe erros, avisos ou problemas relatados pelo CodeQL. Para exibir o arquivo Sarif em um formato legível, abra o arquivo no Visual Studio Code e selecione Shift-Alt-F.

A seção mais importante do arquivo SARIF é a Results propriedade dentro do Run objeto. Cada consulta tem uma propriedade Resultados com detalhes sobre quaisquer violações detectadas e onde elas ocorreram. Se nenhuma violação for encontrada, o valor da propriedade estará vazio.

As consultas são classificadas usando status como erro, aviso e problema. No entanto, essa classificação é separada de como o Programa de Compatibilidade de Hardware do Windows e o Teste de Logotipo de Ferramentas Estáticas classificam os resultados. Qualquer driver com defeitos de qualquer consulta no pacote Must-Fixnão passará no Teste de Logotipo de Ferramentas Estáticas e não será certificado, independentemente da classificação de consulta no arquivo de consulta bruto (por exemplo, aviso).

Converter o SARIF em DVL (Formato de Log de Verificação de Driver)

O Teste de Logotipo de Ferramentas Estáticas analisa um DVL (Log de Verificação de Driver), que é o resultado compilado da análise estática codeQL executada no código-fonte do driver. Há três maneiras de converter o arquivo SARIF em formato DVL: Visual Studio, MSBuild ou da linha de comando usando a ferramenta dvl.exe . Para obter as etapas completas, consulte Criando um log de verificação de driver.

Instruções adicionais para o Teste do Kit de Laboratório de Hardware do Logotipo de Ferramentas Estáticas (HLK) e orientações sobre onde colocar o arquivo DVL podem ser encontradas em Execução do Teste do Logotipo de Ferramentas Estáticas.

Troubleshooting

Se você estiver certificando com o WHCP, primeiro verifique se está usando a versão HLK associada à versão do Windows que você está direcionando, o branch associado no repositório ferramentas complementares do desenvolvedor do Windows Driver e a versão subsequente da CLI do CodeQL. Para a matriz de compatibilidade de versão do HLK/Windows, consulte o Kit do Windows Hardware Lab e para o branch de repositório de Ferramentas Complementares do Desenvolvedor do Windows/Windows Driver/versão da CLI do CodeQL, consulte a tabela WHCP na seção Selecionar a versão do CodeQL .

Erros e soluções alternativas

Para problemas de incompatibilidade de versão do banco de dados , as ferramentas a seguir podem ser úteis.

Use o comando de versão codeql para exibir a versão do codeql exe.

C:\codeql-home\codeql\>codeql version
CodeQL command-line toolchain release 2.4.0.
Copyright (C) 2019-2020 GitHub, Inc.
Unpacked in: C:\codeql-home\codeql\
   Analysis results depend critically on separately distributed query and
   extractor modules. To list modules that are visible to the toolchain,
   use 'codeql resolve qlpacks' and 'codeql resolve languages'.

O comando de atualização do banco de dados atualiza um banco de dados. Esta atualização é unilateral e não é reversível. Para obter mais informações, consulte a atualização do banco de dados.

Procedimentos opcionais

Opcionalmente, você pode suprimir os resultados do CodeQL ou executar os procedimentos de build e análise como um evento pós-build no Visual Studio.

Suprimindo resultados do CodeQL

O CodeQL para drivers dá suporte à supressão de resultados. Atualmente, as supressões são fornecidas como uma conveniência para ajudar os desenvolvedores a fazer a triagem de problemas e reduzir o ruído, não como uma maneira de ignorar as verificações de correção de obrigação . Eles não têm nenhum impacto na geração de um Log de Verificação de Driver ou na aprovação do teste de Logotipo de Ferramentas Estáticas no momento. Para usar supressões, você deve executar a consulta DriverAlertSuppression.ql ao mesmo tempo que as outras consultas ou pacotes que deseja executar.

Para verificações portadas da Análise de Código, as supressões de Análise de Código existentes são respeitadas. Para obter mais informações, consulte o pragma de aviso do C++.

  • Known limitation: Você não pode combinar um #pragma(desabilitar) e #pragma(suprimir) na mesma linha no momento.

Para verificações novas no CodeQL, suprime-as fazendo uma de duas coisas:

  • Escreva uma #pragma(suppress:the-rule-id-here) anotação (sem aspas) na linha acima da violação, como você faz para Análise de Código. Substitua "the-rule-id-here" pelo @id valor nos metadados da consulta, que podem ser exibidos na parte superior do arquivo.

  • Escreva um comentário na linha acima composta pelo texto "lgtm[the-rule-id-here]" (menos aspas). Você precisa executar a consulta padrão de supressão de alerta C/C++ ao invés da consulta para supressão de alerta do driver.

Depois que uma supressão é identificada e reconhecida, o arquivo SARIF resultante incluirá dados indicando que um resultado foi suprimido. A maioria dos visualizadores de resultados não mostra resultados suprimidos por padrão.

Evento pós-build do Visual Studio

Se você estiver criando o driver usando o Visual Studio, poderá configurar consultas CodeQL para serem executadas como um evento pós-build.

Neste exemplo, um pequeno arquivo em lote é criado no local de destino e chamado como um evento pós-compilação. Para obter mais informações sobre eventos de build do Visual Studio C++, consulte Especificando eventos de build.

  1. Crie um pequeno arquivo em lote que recria o banco de dados CodeQL e execute as consultas desejadas nele. Neste exemplo, o arquivo em lote é nomeado RunCodeQLRebuildQuery.bat. Modifique os caminhos mostrados no arquivo de lote de exemplo para coincidir com os locais do diretório.

    ECHO ">>> Running CodeQL Security Rule V 1.0 <<<"
    ECHO ">>> Removing previously created rules database <<<"
    rmdir /s/q C:\codeql-home\databases\kmdf
    CALL C:\codeql-home\codeql\codeql\codeql.cmd database create -l=cpp -s="C:\codeql-home\drivers\kmdf" -c "msbuild /p:Configuration=Release /p:Platform=x64 C:\codeql-home\drivers\kmdf\kmdfecho.sln /t:rebuild /p:PostBuildEventUseInBuild=false " "C:\codeql-home\databases\kmdf" -j 0
    CALL C:\codeql-home\codeql\codeql\codeql database analyze "C:\codeql-home\databases\kmdf" "<path to query suite .qls file>" --format=sarifv2.1.0 --output=C:\codeql-home\databases\kmdf.sarif -j 0 --rerun
    ECHO ">>> Loading SARIF Results in Visual Studio <<<"
    CALL devenv /Edit C:\codeql-home\databases\kmdf.sarif
    SET ERRORLEVEL = 0
    
  2. A opção devenv.exe/Editar é usada no arquivo em lote para abrir o arquivo de resultados SARIF na instância existente do Visual Studio. Para exibir os resultados do SARIF, instale o Visualizador do Microsoft SARIF para Visual Studio e consulte as instruções para obter mais informações.

  3. No projeto de driver, navegue até as propriedades do projeto. No menu suspenso de Configuração, selecione a configuração de build que você deseja verificar com o CodeQL – recomendamos Liberação. Criar o banco de dados CodeQL e executar as consultas leva alguns minutos, portanto, não recomendamos que você execute o CodeQL na configuração de depuração do seu projeto.

  4. Selecione Eventos de Build e Evento pós-build nas propriedades do projeto do driver.

  5. Forneça um caminho para o arquivo em lote e uma descrição do evento pós-compilação.

Configuração de evento pós-build do Visual Studio mostrando um arquivo em lote configurado como uma opção de linha de comando.

  1. Os resultados do arquivo em lote são exibidos no final da saída do build.

    1>Starting evaluation of codeql-cpp\Likely Bugs\Underspecified Functions\MistypedFunctionArguments.ql.
    1>Starting evaluation of codeql-cpp\Likely Bugs\Underspecified Functions\TooManyArguments.ql.
    1>Starting evaluation of codeql-cpp\Likely Bugs\Underspecified Functions\TooFewArguments.ql.
    1>Starting evaluation of codeql-cpp\Likely Bugs\Underspecified Functions\ImplicitFunctionDeclaration.ql.
    1>[1/4 eval 4.4s] Evaluation done; writing results to codeql-cpp\Likely Bugs\Underspecified Functions\TooManyArguments.bqrs.
    1>[2/4 eval 4.4s] Evaluation done; writing results to codeql-cpp\Likely Bugs\Underspecified Functions\TooFewArguments.bqrs.
    1>[3/4 eval 4.5s] Evaluation done; writing results to codeql-cpp\Likely Bugs\Underspecified Functions\ImplicitFunctionDeclaration.bqrs.
    1>[4/4 eval 5.2s] Evaluation done; writing results to codeql-cpp\Likely Bugs\Underspecified Functions\MistypedFunctionArguments.bqrs.
    1>Shutting down query evaluator.
    1>Interpreting results.
    1>">>> Loading SARIF Results in Visual Studio <<<"