Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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
Crie um diretório para conter CodeQL. Este exemplo usa
C:\codeql-home\C:\> mkdir C:\codeql-homeConsulte 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.
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.
Extraia o diretório da CLI do Codeql para aquele que você acabou de criar, por exemplo: C:\codeql-home\codeql\.
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.
- 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.
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\databasesUse 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.)
-
--languageou-lespecifica o idioma ou idiomas em que o código-fonte está. Pode ser uma lista separada por vírgulas, como [cpp, javascript]. -
--source-rootou-sespecifica o caminho para o código-fonte. -
--commandou-cespecifica 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.
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>.sarifExample:
codeql database analyze D:\DriverDatabase suites/windows\recommended.qls --format=sarifv2.1.0 --output=D:\DriverAnalysis1.sarifPara obter mais informações ou ajuda usando o
database analyzecomando, 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@idvalor 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.
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 = 0A 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.
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.
Selecione Eventos de Build e Evento pós-build nas propriedades do projeto do driver.
Forneça um caminho para o arquivo em lote e uma descrição do evento pós-compilação.
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 <<<"