次の方法で共有


Windows ドライバー コードで CodeQL 分析を実行する

CodeQL は、開発者が Windows ドライバーのソース コードでセキュリティの脆弱性とコード違反を特定するのに役立つ強力な静的分析エンジンです。 この記事では、CodeQL 分析を使用して、Windows ハードウェア互換性プログラム (WHCP) 認定用のドライバー検証ファイルを作成する方法について説明します。

この記事では、次のことを行います:

  • 適切な CodeQL バージョンをインストールします。
  • 必要な CodeQL パッケージとクエリ スイートをインストールします。
  • CodeQL を実行してデータベースを構築し、コードを分析します。
  • ドライバー検証ファイルをビルドします。

ドライバーに適した CodeQL バージョンを選択する

Visual Studio (VS) 17.8 は、WHCP_21H2および WHCP_22H2 ブランチで使用される古いバージョンの CodeQL との互換性を解除します。 CodeQL CLI バージョン 2.15.4 は、Visual Studio 17.8 以降を使用する場合に WHCP 21H2 および WHCP 22H2 で使用することが検証されます。 Visual Studio 17.7 以前を使用する場合は、バージョン 2.4.6 またはバージョン 2.6.3 を使用します。 WHCP プログラムの場合は、認定対象の CodeQL CLI バージョンと Windows リリース (バージョン 2.4.6、バージョン 2.6.3、またはバージョン 2.15.4) を使用します。 メイン ブランチで一般的に使用する場合は、CodeQL CLI バージョン 2.15.4 を使用します。

シナリオのタブを選択します。

このマトリックスを使用して、ダウンロードするバージョンを決定します。

Windows リリース CodeQL CLI のバージョン microsoft/windows-drivers CodeQL パッケージのバージョン codeql/cpp-queries CodeQL パックのバージョン 使用するブランチ
Windows Server 2022 2.4.6 または 2.15.4 1.0.13 (codeql 2.15.4 を使用している場合) 0.9.0 (codeql 2.15.4 を使用している場合) WHCP_21H2
Windows 11 2.4.6 または 2.15.4 1.0.13 (codeql 2.15.4 を使用している場合) 0.9.0 (codeql 2.15.4 を使用している場合) WHCP_21H2
Windows 11、 バージョン 22H2 2.6.3 または 2.15.4 1.0.13 (codeql 2.15.4 を使用している場合) 0.9.0 (codeql 2.15.4 を使用している場合) WHCP_22H2
Windows 11 バージョン 23H2 2.6.3 または 2.15.4 1.0.13 (codeql 2.15.4 を使用している場合) 0.9.0 (codeql 2.15.4 を使用している場合) WHCP_22H2
Windows 11、 バージョン 24H2 2.15.4 1.1.0 0.9.0 WHCP_24H2

CodeQL CLI 2.4.6 および 2.6.3 には CodeQL パックのバージョンが指定されていません。これは、v2.7.0 より後のバージョンの CodeQL では CodeQL パックがサポートされているためです。

CodeQL をダウンロードしてインストールする

  1. CodeQL を含むディレクトリを作成します。 この例では、 C:\codeql-home\

    C:\> mkdir C:\codeql-home
    
  2. 前の表を参照して、Microsoft のドライバー クエリの目的のブランチに従って使用する CodeQL CLI のバージョンを選択します。 WHCP プログラムの一部として分析を実行する場合は、「 Windows ハードウェア互換性プログラムの使用」の表を参照してください。それ以外の場合は Main Branch と 2.15.4 を使用します。 別のバージョンを使用すると、データベースがライブラリと互換性がない可能性があります。

  3. 前のテーブルに関連付けられている CodeQL CLI バイナリ リリースに移動し、プロジェクトのアーキテクチャに従って zip ファイルをダウンロードします。 たとえば、64 ビット Windows codeql-win64.zipの場合です。

  4. 先ほど作成したディレクトリに Codeql CLI ディレクトリを抽出します (例: *C:\codeql-home\codeql*)。

  5. バージョンを確認して、CodeQL が正しくインストールされていることを確認します。

     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'.
    

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.

特定のコマンドのヘルプについては、 codeql <command> --help を実行します。 例えば次が挙げられます。

codeql create --help

サブコマンドのヘルプを表示するには、次に例を示します。

codeql create language --help

CodeQL パッケージをインストールする

ビルド環境のタブを選択します。

WHCP_21H2 または WHCP_22H2 および CodeQL CLI バージョン 2.15.4 で Visual Studio 2022 17.8 以降を使用している場合は、この手順を使用します。

以前のバージョンの CodeQL で CodeQL テストを実行した場合は、複製されたリポジトリの古いバージョンが残っている場合は、必ず古い CodeQL サブモジュールを削除してください。 CodeQL では、既定でサブモジュール内のクエリを使用しようとする場合があり、バージョンが一致しないためにエラーが発生する可能性があります。

CodeQL クエリ パッケージをダウンロードする

CodeQL では、バージョン 2.7.0 で CodeQL パッケージ (CodeQL パック または クエリ パック) が導入されました。そのため、 Windows-Driver-Developer-Supplemental-Tools リポジトリを複製して、認定にクエリを使用する必要がなくなります。

--download オプションを使用すると、後で分析プロセスを実行するときに必要なクエリがダウンロードされるため、手順 1 をスキップできます。

  1. Windows ハードウェア互換性プログラムの使用 テーブルから、正しいバージョンの microsoft/windows ドライバー パックをダウンロードします。 次のコマンドで @<version> を指定します。
C:\codeql-home\> codeql pack download microsoft/windows-drivers@<version>

たとえば、WHCP_24H2を使用している場合は、次のコマンドを実行して、1.1.0 windows-drivers クエリ パックをダウンロードします。

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

このコマンドを使用して、CodeQL cpp-queries クエリ パックのバージョン 0.9.0 をダウンロードします。

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

CodeQL は、クエリ パックを既定のディレクトリにインストールします。

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

Von Bedeutung

インストール ディレクトリを変更したり、インストールされているクエリ パックを移動したりしないでください。

Windows ドライバー クエリ スイートをダウンロードする

Microsoft では、エンドツーエンドのドライバー開発者ワークフローを簡略化するための 2 つのクエリ スイートを提供しています。 windows_driver_recommended.qls スイートは、Microsoft がドライバー開発者にとって価値があると判断するすべてのクエリのスーパーセットであり、windows_driver_mustfix.qls スイートには WHCP 認定の "修正が必要" と見なされるクエリが含まれています。 静的ツール ロゴ テストに合格するには、windows_driver_mustfix.qls を実行して渡す必要があります。

https://github.com/microsoft/Windows-Driver-Developer-Supplemental-Tools/tree/main/suitesからローカル PC に 2 つのクエリ スイート ファイルをコピーします。

  • windows_driver_recommended.qls
  • windows_driver_mustfix.qls

クエリ スイートの内容の詳細については、「 CodeQL クエリとスイート」を参照してください。

CodeQL データベースをビルドする

これらの例では、Windows 開発環境を使用し、インストール場所が C:\codeql-home であることを前提としていますが、適切なセットアップを使用できます。 サポートされているコンパイラの一覧については、CodeQL でサポートされている 言語とフレームワーク を参照してください。

  1. CodeQL 用のディレクトリを作成して、作成するデータベースを配置します。 例: C:\codeql-home\databases

    mkdir C:\codeql-home\databases
    
  2. CodeQL コマンドを使用して、次のパラメーターを使用してデータベースを作成します。

    • 最初のパラメーターは、データベース ディレクトリへのリンクです。 たとえば、C:\codeql-home\databases\MyDriverDatabase です。 (ディレクトリが既に存在する場合、このコマンドは失敗します)。
    • --language または -l ソース コードが含まれる言語を指定します。 [cpp, javascript] などのコンマ区切りのリストを指定できます。
    • --source または -s ソース コードへのパスを指定します。
    • --command または -c ビルド コマンドまたはビルド ファイルへのパスを指定します。
    codeql database create <database directory> --language=<language> --source=<path to source code> --command=<build command or path to build file>
    

例示

1 つのドライバーの例。

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"

複数のドライバーの例。

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

database create コマンドの詳細またはヘルプについては、「CodeQL データベースの作成」または「CodeQL ヘルプの使用」を参照してください。

分析の実行

この時点で、データベースの作成が完了し、次の手順では、ドライバーのソース コードで実際の分析を実行します。

  1. CodeQL コマンドを使用して、次のパラメーターを使用してデータベースを分析します。

    • 最初のパラメーターは、データベース ディレクトリへのリンクです。 たとえば、 C:\codeql-home\databases\MyDriverDatabase です。 (注: ディレクトリが存在しない場合、このコマンドは失敗します)。
    • --download フラグは、クエリを実行する前に依存関係をダウンロードするように CodeQL に指示します。
    • --format は出力ファイルのファイルの種類です。 オプションには、SARIF と CSV があります。 (WHCP ユーザーの場合は SARIF 形式を使用します)。
    • --output は出力ファイルが必要な場所へのパスです。必ずファイル名に形式を含めます。 (ディレクトリがまだ存在しない場合、このコマンドは失敗します)。
    • クエリ指定子パラメーターは、次のような引数のスペース区切りのリストです。
      • クエリ ファイルへのパス
      • クエリ ファイルを含むディレクトリへのパス
      • クエリ スイート ファイルへのパス
      • CodeQL クエリ パックの名前
    codeql database analyze --download <path to database> <path to query suite .qls file> --format=sarifv2.1.0 --output=<outputname>.sarif
    

    例:

    codeql database analyze --download D:\DriverDatabase suites/windows\_driver_recommended.qls --format=sarifv2.1.0 --output=D:\DriverAnalysis1.sarif 
    

    database analyze コマンドの詳細またはヘルプについては、「CodeQL CLI を使用したデータベースの分析」、CodeQL パックを使用した CodeQL データベースの分析、または CodeQL ヘルプの使用を参照してください。

結果の表示と解釈

このセクションでは、次の手順に必要な SARIF 形式に焦点を当てますが、必要に応じて CSV 形式を使用することもできます。

静的分析結果交換形式 (SARIF) は、静的分析結果を共有するために使用される JSON 型の形式です。 OASIS 静的分析結果交換形式 (SARIF) の標準、CodeQL での SARIF 出力の使用方法、およびスキーマ json の詳細を確認します。

分析結果を解釈するには、オブジェクトを手動で並べ替える方法など、いくつかの方法があります。 ここでは、いくつかの方法を使用します。

  • Microsoft Sarif Viewer (Web) には、SARIF ファイルをビューアーにドラッグ アンド ドロップし、ルール別に分類された結果を表示できる機能があります。 これは、違反の数や違反のあるクエリを確認する非常に迅速かつ簡単な方法ですが、行番号以外のソース コード情報を見つけるのは簡単ではありません。 違反がない場合、ページは更新されないことに注意してください。

  • Microsoft SARIF Viewer for Visual Studio は、結果からソース コードにシームレスに移行するために、Visual Studio 内で結果を表示するのに最適です。

  • Visual Studio Code の SARIF 拡張機能によってプレビュー ウィンドウが開き、CodeQL によって報告されたエラー、警告、または問題が表示されます。 Sarif ファイルを読み取り可能な形式で表示するには、Visual Studio Code でファイルを開き、 Shift キーを押しながら Alt キーを押しながら F キーを押します。

SARIFファイルの最も重要なセクションは、Resultsオブジェクト内のRunプロパティです。 各クエリには、検出された違反とその発生場所に関する詳細を含む Results プロパティがあります。 違反が見つからない場合、プロパティ値は空になります。

クエリは、 エラー警告問題などの状態を使用して分類されます。 ただし、この分類は、Windows ハードウェア互換性プログラムと静的ツール ロゴ テストで結果を評価する方法とは別です。 Must-Fix スイート内のクエリに欠陥があるドライバーは、静的ツール ロゴ テストに合格せず、未加工のクエリ ファイル内のクエリ分類 (警告など) に関係なく認定に失敗します。

SARIF をドライバー検証ログ形式 (DVL) に変換する

静的ツール ロゴ テストは、 ドライバー検証ログ (DVL) を解析します。これは、ドライバーのソース コードで実行する CodeQL 静的分析のコンパイル結果です。 SARIF ファイルを DVL 形式に変換するには、Visual Studio、MSBuild、または dvl.exe ツールを使用したコマンド ラインの 3 つの方法があります。 完全な手順については、「 ドライバー検証ログの作成」を参照してください。

静的ツール ロゴ HLK テストの詳細な手順と、DVL ファイルを配置する場所に関するガイダンスについては、 静的ツール ロゴ テストの実行に関する記事を参照してください。

トラブルシューティング

WHCP で認定する場合は、まず、対象とする Windows リリースに関連付けられている HLK バージョン、Windows Driver Developer Supplemental Tools リポジトリ内の関連ブランチ、およびそれ以降の CodeQL CLI バージョンを使用していることを確認します。 HLK/Windows リリースの互換性マトリックスについては、「 Windows Hardware Lab Kit」 および「Windows リリース/Windows Driver Developer Supplemental Tools リポジトリ ブランチ/CodeQL CLI バージョン」の「 CodeQL バージョンの選択 」セクションの WHCP テーブルを参照してください。

エラーと回避策

データベースのバージョンの不一致の問題については、次のツールが役立つ場合があります。

codeql version コマンドを使用して、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'.

データベース アップグレード コマンドによってデータベースが更新されます。 これは一方向のアップグレードであり、元に戻すことはできません。 詳細については、データベースの アップグレードを参照してください。

省略可能な手順

必要に応じて、CodeQL の結果を抑制したり、ビルドを実行したり、Visual Studio のビルド後イベントとしてプロシージャを分析したりできます。

CodeQL の結果の抑制

ドライバーの CodeQL では、結果の抑制がサポートされています。 抑制は現在、開発者が問題をトリアージし、ノイズを減らすのに役立つ便利な機能として提供されています。 これは、必ず修正する チェックをバイパスする方法ではありません。 現時点では、ドライバー検証ログの生成や静的ツール ロゴ テストの合格に影響はありません。 抑制を使用するには、DriverAlertSuppression.ql クエリを、実行する他のクエリまたはスイートと同時に実行する必要があります。 既定では、このクエリは githubs main/development ブランチからスイートを実行するときに有効になります。

コード分析から移植されたチェックでは、既存のコード分析抑制が受け入れられます。 詳細については、「 C++ 警告プラグマ」を参照してください。

  • Known limitation: 現時点では、同じ行に #pragma(disable) と #pragma(suppress) を組み合わせることはできません。

CodeQL を初めて使用するチェックの場合は、次の 2 つのいずれかを実行してそれらを抑制します。

  • コード分析の場合と同様に、違反の上の行に #pragma(suppress:the-rule-id-here) 注釈 (引用符なし) を記述します。 "the-rule-id-here" を、ファイルの先頭に表示可能なクエリのメタデータの @id 値に置き換えます。

  • テキスト "lgtm[the-rule-id-here]" (マイナス引用符) で構成される上の行にコメントを書きます。 ドライバーアラート抑制クエリではなく、標準 の C/C++ アラート抑制 クエリを実行する必要があります。

抑制が存在して認識されると、結果の SARIF ファイルには結果が抑制されたデータが含まれ、ほとんどの結果ビューアーは既定では結果を表示しません。

Visual Studio ビルド後イベント

Visual Studio を使用してドライバーをビルドする場合は、ビルド後のイベントとして実行するように CodeQL クエリを構成できます。

この例では、小さなバッチ ファイルがターゲットの場所に作成され、ビルド後イベントとして呼び出されます。 Visual Studio C++ ビルド イベントの詳細については、「 ビルド イベントの指定」を参照してください。

  1. 小さなバッチ ファイルを作成し、CodeQL データベースを再作成し、必要なクエリを実行します。 この例では、バッチ ファイルに RunCodeQLRebuildQuery.bat という名前が付けられます。 サンプル バッチ ファイルに示されているパスを、ディレクトリの場所と一致するように変更します。

    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. devenv.exe/編集オプションは、Visual Studio の既存のインスタンスで SARIF 結果ファイルを開くためにバッチ ファイルで使用されます。 SARIF の結果を表示するには、 Microsoft SARIF Viewer for Visual Studio をインストールし、詳細については、その手順を参照してください。

  3. ドライバー プロジェクトで、プロジェクトのプロパティに移動します。 [構成] プルダウンで、CodeQL で確認するビルド構成を選択します。リリースをお勧めします。 CodeQL データベースの作成とクエリの実行には数分かかるため、プロジェクトのデバッグ構成で CodeQL を実行することはお勧めしません。

  4. ドライバー プロジェクトのプロパティで [ ビルド イベント ] と [ ビルド後イベント ] を選択します。

  5. バッチ ファイルへのパスとビルド後イベントの説明を指定します。

コマンド ライン オプションとして構成されたバッチ ファイルを示す Visual Studio ビルド 後のイベント構成。

  1. ビルド出力の最後にバッチ ファイルの結果が表示されます。

    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 <<<"