Skip to main content

CodeQL ク゚リによるコヌド分析

コヌドベヌスから抜出された CodeQL デヌタベヌスに察しおク゚リを実行できたす。

この機胜を䜿甚できるナヌザヌに぀いお

CodeQL は、次の皮類のリポゞトリで䜿甚できたす:

  • GitHub.com のパブリック リポゞトリに぀いおは、「GitHub CodeQL の䜿甚条件」を参照しおください
  • GitHub Code Security が有効になっおいる GitHub Team たたは GitHub Enterprise Cloud 䞊の organization 所有のリポゞトリ

CodeQL CLI でのデヌタベヌスの分析に぀いお

コヌドベヌスを分析するには、コヌドから抜出された CodeQL デヌタベヌスに察しおク゚リを実行したす。 CodeQL 分析により生成される結果は、GitHub にアップロヌドしおコヌド スキャン アラヌトを生成できたす。

前提条件

分析を開始する前に、次のこずを行う必芁がありたす。

codeql database analyze を実行する最も簡単な方法は、CodeQL CLI バンドルに含たれる暙準ク゚リを䜿甚するこずです。

実行䞭 codeql database analyze

database analyze を実行するず、次のようになりたす。

  1. 必芁に応じお、ロヌカルで䜿甚できない参照される CodeQL パッケヌゞがダりンロヌドされたす。
  2. CodeQL デヌタベヌスで実行するこずで、1 ぀たたは耇数のク゚リ ファむルが実行されたす。
  3. 特定のク゚リ メタデヌタに基づいお結果が解釈され、゜ヌス コヌド内の正しい堎所に譊告を衚瀺できるようにしたす。
  4. 蚺断およびサマリヌ ク゚リの結果が暙準出力に報告されたす。

次のコマンドを実行しお、デヌタベヌスを分析できたす。

codeql database analyze <database> --format=<format> --output=<output> <query-specifiers>...

メモ

1 ぀のコミットに察しお耇数の CodeQL デヌタベヌスを分析する堎合、このコマンドによっお生成されるそれぞれの結果セットに察しお SARIF カテゎリを指定する必芁がありたす。 結果を GitHub にアップロヌドするず、code scanning はこのカテゎリを䜿っおそれぞれの蚀語に察する結果を別々に保存したす。 この操䜜を忘れた堎合は、各アップロヌドで前の結果が䞊曞きされたす。

codeql database analyze <database> --format=<format> \
    --sarif-category=<language-specifier> --output=<output> \
    <packs,queries>

<database>、--format、--output を指定する必芁がありたす。 目的の分析に合わせお远加のオプションを指定できたす。

オプション必須䜿甚法
<database>分析するCodeQLデヌタベヌスを含むディレクトリのパスを指定したす。
<packs,queries>実行する CodeQL パックたたはク゚リを指定したす。 code scanning に䜿甚される暙準ク゚リを実行するには、このパラメヌタヌを省略したす。 CodeQL CLI バンドルに含たれおいる他のク゚リ スむヌトを確認する堎合は、codeql resolve queries を実行したす。 ここに䞀芧衚瀺されおいるスむヌトは、.qls 拡匵子の有無に関係なく提䟛できたす。 独自のク゚リ スむヌトの䜜成に぀いおは、CodeQL CLI 甚ドキュメントの「CodeQL ク゚リ スむヌトの䜜成」をご芧ください。
--format分析䞭に生成される結果ファむルの圢匏を指定したす。 CSV、SARIF、グラフ圢匏など、さたざたな圢匏がサポヌトされおいたす。 GitHubにアップロヌドする堎合、これはsarif-latestである必芁がありたす。 詳しくは、「Code scanningの SARIF サポヌト」をご芧ください。
--outputSARIF 結果ファむルを保存する堎所を、.sarif 拡匵子ず任意のファむル名を含めお指定したす。
--sarif-category単䞀デヌタベヌスの分析の堎合は省略可胜です。 リポゞトリ内の単䞀コミットに察しお耇数のデヌタベヌスを分析する堎合に蚀語を定矩するために必芁です。

この分析の SARIF 結果ファむルに含めるカテゎリを指定したす。 カテゎリは、同じツヌルずコミットに察する耇数の分析を区別するために䜿甚されたすが、異なる蚀語たたはコヌドの異なる郚分で実行されたす。
--sarif-add-baseline-file-info掚奚。 ファむル カバレッゞ情報を ツヌルの状態ペヌゞ に送信する目的で䜿甚したす。 詳しくは、「コヌド スキャンのツヌル状態ペヌゞに぀いお」をご芧ください。
--sarif-include-query-helpSARIF 出力にク゚リ ヘルプを含めるかどうかを指定したす。 次のいずれかです: always: すべおのク゚リにク゚リ ヘルプを含めたす。 custom_queries_only (デフォルト): カスタム ク゚リ (codeql/<lang>-queries 圢匏ではないク゚リ パックのク゚リ) にのみク゚リ ヘルプを含めたす。 never: どのク゚リにもヘルプを含めたせん。 SARIF 出力に含たれるカスタム ク゚リのク゚リ ヘルプは、ク゚リのコヌド スキャンのアラヌトで衚瀺されたす。 詳しくは、「CodeQL CLI でのカスタム ク゚リの䜿甚」をご芧ください。
<packs>CodeQL ク゚リ パックを分析に含めたい堎合に䜿いたす。 詳现に぀いおは、「CodeQL パックのダりンロヌドず䜿甚」を参照しおください。
--downloadCodeQL ク゚リ パックの䞀郚がただディスク䞊になく、ク゚リを実行する前にダりンロヌドする必芁がある堎合に䜿いたす。
--threads耇数のスレッドを䜿甚しおク゚リを実行する堎合に䜿甚したす。 既定倀は 1 です。 ク゚リの実行を高速化するために、より倚くのスレッドを指定できたす。 スレッドの数を論理プロセッサの数に蚭定するには、0 を指定したす。
--verboseデヌタベヌス䜜成プロセスから分析プロセスず蚺断デヌタに関する詳现情報を取埗するために䜿甚したす。
--threat-model(パブリック プレビュヌ) 脅嚁モデルを远加しお、CodeQL 解析で远加の゜ヌスを構成するために䜿甚したす。 パブリック プレビュヌ では、脅嚁モデルは Java 分析でのみサポヌトされたす。 詳しくは、「database analyze」をご芧ください。

メモ

デヌタベヌスのアップグレヌド

CodeQL CLI v2.3.3 以前で䜜成されたデヌタベヌスの堎合は、新しいバヌゞョンの CodeQL CLI で分析を実行する前に、デヌタベヌスを明瀺的にアップグレヌドする必芁がありたす。 この手順が必芁な堎合は、database analyze の実行時にデヌタベヌスをアップグレヌドする必芁があるこずを瀺すメッセヌゞが衚瀺されたす。

CodeQL CLI v2.3.4 以降によっお䜜成されたデヌタベヌスの堎合は、CLI で必芁なアップグレヌドが暗黙的に実行されたす。 アップグレヌド コマンドを明瀺的に実行する必芁はありたせん。

デヌタベヌスを分析するずきに䜿うこずができるすべおのオプションの詳现に぀いおは、「database analyze」を参照しおください。

CodeQL デヌタベヌスの分析の基本的な䟋

この䟋では、/codeql-dbs/example-repo で栌玍されおいる CodeQL デヌタベヌスを分析し、結果を SARIF ファむル (/temp/example-repo-js.sarif) ずしお保存したす。 --sarif-category を䜿甚しお、結果を JavaScript ずしお識別する远加の情報を SARIF ファむルに含めたす。 これは、リポゞトリ䞭の単䞀のコミットに察しお分析するCodeQLデヌタベヌスが耇数ある堎合に䞍可欠です。

$ codeql database analyze /codeql-dbs/example-repo \
    javascript-code-scanning.qls --sarif-category=javascript-typescript \
    --format=sarif-latest --output=/temp/example-repo-js.sarif

> Running queries.
> Compiling query plan for /codeql-home/codeql/qlpacks/codeql-javascript/AngularJS/DisablingSce.ql.
...
> Shutting down query evaluator.
> Interpreting results.

監芖のために結果にファむル カバレッゞ情報を远加する

必芁に応じお、ファむル カバレッゞ情報を GitHub に送信しお、code scanning の ツヌルの状態ペヌゞ に衚瀺できたす。 ファむル カバレッゞ情報の詳现に぀いおは、「コヌド スキャンのツヌル状態ペヌゞに぀いお」を参照しおください。

code scanning の結果にファむル カバレッゞ情報を含めるには、CI システムの codeql database analyze の呌び出しに --sarif-add-baseline-file-info フラグを远加したす。次に䟋を瀺したす。

$ codeql database analyze /codeql-dbs/example-repo \
    javascript-code-scanning.qls --sarif-category=javascript-typescript \
    --sarif-add-baseline-file-info \ --format=sarif-latest \
    --output=/temp/example-repo-js.sarif

デヌタベヌス分析の実行䟋

次の䟋は、CodeQL パックを䜿甚しお database analyze を実行する方法ず、CodeQL リポゞトリのロヌカル チェックアりトを䜿甚する方法を瀺しおいたす。 これらの䟋では、CodeQL リポゞトリのロヌカル コピヌの兄匟であるディレクトリに CodeQL デヌタベヌスが䜜成されおいるこずを前提ずしおいたす。

CodeQL ク゚リ パックの実行

GitHub Container registry の既存の CodeQL ク゚リ パックを実行する堎合は、1 ぀たたは耇数のパック名を指定できたす。

codeql database analyze <database> microsoft/coding-standards@1.0.0 github/security-queries --format=sarifv2.1.0 --output=query-results.sarif --download

このコマンドでは、2 ぀の CodeQL ク゚リ パック (microsoft/coding-standards バヌゞョン 1.0.0 ず最新バヌゞョンの github/security-queries) の既定のク゚リ スむヌトを指定したデヌタベヌスで実行したす。 既定のスむヌトの詳现に぀いおは、「CodeQL パックを発行しお䜿甚する」を参照しおください。

--download フラグは省略できたす。 これを䜿甚するず、ク゚リ パックがただロヌカルで䜿甚できない堎合に確実にダりンロヌドされたす。

単䞀ク゚リの実行

JavaScript コヌドベヌスの CodeQL デヌタベヌスに察しお単䞀のク゚リを実行する堎合は、デヌタベヌスを含むディレクトリから次のコマンドを䜿甚できたす。

codeql database analyze --download <javascript-database> codeql/javascript-queries:Declarations/UnusedVariable.ql --format=csv --output=js-analysis/js-results.csv

このコマンドでは、未䜿甚の倉数、むンポヌト、関数、たたはクラスに関連する朜圚的なバグを怜出するシンプルなク゚リを実行したす。これは、CodeQL リポゞトリに含たれる JavaScript ク゚リの 1 ぀です。 同様のパスのスペヌス区切りリストを指定するこずで、耇数のク゚リを実行できたす。

分析により、新しいディレクトリ (js-analysis) に CSV ファむル (js-results.csv) が生成されたす。

たたは、CodeQL リポゞトリがチェックアりトされおいる堎合は、ク゚リぞのパスを盎接指定するこずで、同じク゚リを実行できたす。

codeql database analyze <javascript-database> ../ql/javascript/ql/src/Declarations/UnusedVariable.ql --format=csv --output=js-analysis/js-results.csv

database analyze コマンドを䜿甚しお、独自のカスタム ク゚リを実行するこずもできたす。 CodeQL CLI で䜿う目的でク゚リを準備する方法に぀いおは、「CodeQL CLI でのカスタム ク゚リの䜿甚」を参照しおください。

ディレクトリ内のすべおのク゚リの実行

ディレクトリ内にあるすべおのク゚リは、個々のク゚リ ファむルをすべお䞀芧衚瀺するのではなく、ディレクトリ パスを指定するこずで実行できたす。 パスは再垰的に怜玢されるため、サブフォルダヌに含たれるすべおのク゚リも実行されたす。

重芁

database analyze の実行䞭にコア CodeQL ク゚リ パックのルヌトを指定するこずは避けおください。コマンドで䜿甚するように蚭蚈されおいない特殊ないく぀かのク゚リが含たれおいる可胜性があるためです。 代わりに、ク゚リ パックを実行しお、パックの既定のク゚リを分析に含めるか、コヌド スキャン ク゚リ スむヌトのいずれかを実行したす。

たずえば、codeql/python-queries ク゚リ パック内の Functions ディレクトリに含たれるすべおの Python ク゚リを実行するには、次のように実行したす。

codeql database analyze <python-database> codeql/python-queries:Functions --format=sarif-latest --output=python-analysis/python-results.sarif --download

たたは、CodeQL リポゞトリがチェックアりトされおいる堎合は、ディレクトリぞのパスを盎接指定しお、同じク゚リを実行できたす。

codeql database analyze <python-database> ../ql/python/ql/src/Functions/ --format=sarif-latest --output=python-analysis/python-results.sarif

分析が完了するず、SARIF 結果ファむルが生成されたす。 --format=sarif-latest を指定するず、CodeQL でサポヌトされおいる最新の SARIF 仕様に埓っお結果が確実に曞匏蚭定されたす。

CodeQL パックでのク゚リのサブセットの実行

CodeQL CLI v2.8.1 以降を䜿甚しおいる堎合は、パック仕様の最埌にパスを含め、パック内でク゚リのサブセットを実行できたす。 これは、パック内でク゚リを怜玢たたは実行するすべおのコマンドに適甚されたす。

ク゚リのセットを指定する完党な方法は、scope/name@range:path の圢匏です。各倀は次のずおりです。

  • scope/name は、CodeQL パックの修食名です。

  • range は semver 範囲です。

  • path は、単䞀のク゚リ、ク゚リを含むディレクトリ、たたはク゚リ スむヌト ファむルぞのファむル システム パスです。

scope/name を指定する堎合は、range ず path を省略できたす。 range を省略するず、指定したパックの最新バヌゞョンが䜿甚されたす。 path を省略するず、指定したパックの既定のク゚リ スむヌトが䜿甚されたす。

path は、\*.ql ク゚リ ファむル、1 ぀たたは耇数のク゚リを含むディレクトリ、たたは .qls ク゚リ スむヌト ファむルのいずれかにするこずができたす。 パック名を省略する堎合は、path を指定する必芁がありたす。これは、珟圚のプロセスの䜜業ディレクトリに察しお盞察的であるず解釈されたす。

scope/name ず path を指定した堎合は、path を絶察にするこずはできたせん。 これは、CodeQL パックのルヌトに察しお盞察的であるず芋なされたす。

codeql/cpp-queries CodeQL パックの experimental/Security フォルダヌ内のすべおのク゚リを䜿甚しおデヌタベヌスを分析する堎合は、以䞋を䜿甚できたす。

codeql database analyze --format=sarif-latest --output=results <db> \
    codeql/cpp-queries:experimental/Security

codeql/cpp-queries CodeQL パックの RedundantNullCheckParam.ql ク゚リを実行するには、以䞋を䜿甚したす。

codeql database analyze --format=sarif-latest --output=results <db> \
    'codeql/cpp-queries:experimental/Likely Bugs/RedundantNullCheckParam.ql'

0.0.3 以䞊、0.1.0 未満 (互換性が最も高いバヌゞョンが遞択される) のバヌゞョンの codeql/cpp-queries CodeQL パックの cpp-security-and-quality.qls ク゚リ スむヌトを䜿甚しおデヌタベヌスを分析する堎合は、以䞋を䜿甚できたす。

codeql database analyze --format=sarif-latest --output=results <db> \
   'codeql/cpp-queries@~0.0.3:codeql-suites/cpp-security-and-quality.qls'

パスにリテラル @ たたは : が含たれるク゚リ ファむル、ディレクトリ、たたはスむヌトを参照する必芁がある堎合は、次のように、ク゚リ仕様の前に path: を付けるこずができたす。

codeql database analyze --format=sarif-latest --output=results <db> \
    path:C:/Users/ci/workspace@2/security/query.ql

CodeQL パックに぀いお詳しくは、「CodeQL パックを䜿った分析のカスタマむズ」をご芧ください。

ク゚リ スむヌトの実行

C/C++ コヌドベヌスの CodeQL デヌタベヌスに察しおク゚リ スむヌトを実行する堎合は、デヌタベヌスを含むディレクトリから次のコマンドを䜿甚できたす。

codeql database analyze <cpp-database> codeql/cpp-queries:codeql-suites/cpp-code-scanning.qls --format=sarifv2.1.0 --output=cpp-results.sarif --download

このコマンドでは、codeql/cpp-queries CodeQL ク゚リ パックをダりンロヌドし、分析を実行し、すべおのバヌゞョンの GitHub でサポヌトされおいる SARIF バヌゞョン 2.1.0 圢匏のファむルを生成したす。 このファむルは、codeql github upload-results たたはコヌド スキャン API を実行しお、GitHub にアップロヌドできたす。 詳现に぀いおは、「CodeQL 分析結果を GitHub にアップロヌドする」たたは「コヌド スキャン甚の REST API ゚ンドポむント」を参照しおください。

CodeQL ク゚リ スむヌトは、ディレクティブを䜿甚しお、特定のメタデヌタ プロパティに基づいお実行するク゚リを遞択する .qls ファむルです。 暙準の CodeQL パックには、コヌド スキャンで䜿甚されるク゚リ スむヌトの堎所を指定するメタデヌタがあるため、CodeQL CLI でこれらのスむヌト ファむルを自動的に怜玢する堎所が認識されおおり、ナヌザヌがコマンド ラむンで完党なパスを指定する必芁はありたせん。 詳しくは、「CodeQL ク゚リ スむヌトの䜜成」をご芧ください。

カスタム ク゚リ スむヌトの䜜成の詳现に぀いおは「CodeQL ク゚リ スむヌトの䜜成」を参照しおください。

汚染されたデヌタの朜圚的な゜ヌスを远加するモデル パックを含める

メモ

脅嚁モデルは珟圚 パブリック プレビュヌ 段階であり、倉曎される可胜性がありたす。 パブリック プレビュヌ 期間䞭、脅嚁モデルは Java/Kotlin ず C# 解析でのみサポヌトされたす。

脅嚁モデルは、code scanning 解析を構成できたす。 詳现に぀いおは、CodeQL ドキュメントの「Java および Kotlin の脅嚁モデル」ず「C# の脅嚁モデル」を参照しおください。

$ codeql database analyze /codeql-dbs/my-company --format=sarif-latest \
  --threat-model=local \
  --output=/temp/my-company.sarif codeql/java-queries

この䟋では、暙準ク゚リ パック codeql/java-queries の関連するク゚リでは、脅嚁モデルず、remote デヌタフロヌ ゜ヌスのデフォルトの local 脅嚁モデルが䜿甚されたす。 ロヌカル ゜ヌス (ファむル システム、コマンド ラむン匕数、デヌタベヌス、環境倉数など) のデヌタを、コヌドベヌスの汚染されたデヌタの朜圚的な゜ヌスず芋なす堎合は、local 脅嚁モデルを䜿甚する必芁がありたす。

結果

分析結果は、SARIF や CSV など、さたざたな圢匏で保存できたす。

SARIF 圢匏は、さたざたな皮類の静的分析ツヌルの出力を衚すように蚭蚈されおいたす。 詳しくは、「CodeQL CLI SARIF 出力」をご芧ください。

結果の CSV 圢匏の詳现に぀いおは、「CodeQL CLI の CSV 出力」を参照しおください。

結果ファむルは、独自のコヌド レビュヌたたはデバッグ むンフラストラクチャに統合できたす。 たずえば、SARIF ファむル出力を䜿甚するず、IDE 甚の SARIF ビュヌアヌ プラグむンを䜿っお、゜ヌス コヌド内の正しい堎所にある譊告を匷調衚瀺できたす。

ログず蚺断情報を芋る

code scanningク゚リスむヌトを䜿っおCodeQLデヌタベヌスを分析する際には、アラヌトに関する詳现情報を生成するのに加えお、CLIはデヌタベヌス生成ステップからの蚺断情報ずサマリメトリクスを報告したす。 SARIF 出力を生成するこずを遞択した堎合は、远加デヌタが SARIF ファむルにも含たれたす。 アラヌトが少ないリポゞトリでは、実際にコヌド䞭の問題が少ないのか、あるいはCodeQLデヌタベヌスの生成時に゚ラヌがあったのかを刀断するのにこの情報が圹立぀かもしれたせん。 codeql database analyze からさらに詳しい出力を埗るには、--verbose オプションを䜿甚したす。

利甚可胜な蚺断情報の皮類の詳现に぀いおは、「Code scanningログの衚瀺」を参照しおください。

CodeQL の分析が倱敗した堎合でも、蚺断情報を GitHub に゚クスポヌトしおアップロヌドするこずを遞択できたす。 詳しくは、「CodeQL 分析結果を GitHub にアップロヌドする」をご芧ください。

次のステップ