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 – versão 2.4.6, versão 2.6.3 ou versão 2.15.4. Para uso geral com o branch principal, use a CLI do CodeQL versão 2.15.4.

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 de repositório associado a ser usado
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.6.0 0.0.4 N/A WHCP_25H2
Windows 11, versão 25H2 2.20.1 1.6.0 0.0.4 N/A WHCP_25H2

Note

Uma versão do pacote CodeQL não é especificada para a CLI 2.4.6 e 2.6.3 do CodeQL porque apenas 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.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 executando 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 o ramo Principal e 2.15.4. 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ê acabou de criar, 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 com WHCP_21H2 ou WHCP_22H2 e a CLI do CodeQL versão 2.15.4.

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.

Note

É possível ignorar a etapa 1, pois a opção --download baixa as consultas necessárias mais tarde ao executar o processo de análise.

  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 estiver usando WHCP_24H2, execute o seguinte comando para baixar o pacote de consulta 1.1.0 windows-drivers:

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

Use este comando para baixar a versão 0.9.0 do pacote de consultas cpp-queries do CodeQL.

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

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.

Baixar as suítes de consulta de driver do Windows

A Microsoft fornece dois conjuntos de consultas para simplificar o fluxo de trabalho do desenvolvedor de driver de ponta a ponta. O pacote recommended.qls é um superconjunto de todas as consultas que a Microsoft considera valiosas para desenvolvedores de driver e o pacote mustfix.qls contém consultas consideradas "Must-Fix" para certificação WHCP. mustfix.qls deve ser executado e passado para passar no Teste de Logotipo de Ferramentas Estáticas.

Copie os dois arquivos do pacote de consultas de https://github.com/microsoft/Windows-Driver-Developer-Supplemental-Tools/tree/main/src/windows-driver-suites para o seu computador local.

  • recommended.qls
  • mustfix.qls

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á. 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 suites/windows\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

Vamos nos concentrar no formato SARIF desta seção, pois é o que é necessário para as etapas a seguir, embora você seja bem-vindo a usar o formato CSV se ele atender melhor às suas necessidades.

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. Essa é uma maneira muito rápida e fácil de ver a contagem de violações ou quais consultas têm violações, mas menos fácil de encontrar informações de código-fonte além do número de linha. Observe que 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 terá uma propriedade Resultados com detalhes sobre as violações detectadas e onde ela ocorreu. 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.

Mais instruções para o teste HLK do logotipo de ferramentas estáticas e orientações sobre onde colocar o arquivo DVL podem ser encontradas na execução do teste de 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 atualizará um banco de dados. Lembre-se de que essa é uma atualização unidirecional 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. Por padrão, essa consulta é habilitada ao executar nossos pacotes do nosso branch de desenvolvimento/principal do githubs.

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

  • Known limitation: Não é possível 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ê precisará executar a consulta de supressão de alerta C/C++ padrão em vez da consulta de supressão de alerta do driver.

Depois que uma supressão estiver presente e reconhecida, o arquivo SARIF resultante incluirá dados que um resultado foi suprimido e a maioria dos visualizadores de resultados não mostrará o resultado 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 será 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 <<<"