以下の内容はhttps://daisuke20240310.hatenablog.com/entry/codeql_vscodeより取得しました。


CodeQL(静的解析ツール)をVSCodeで使う方法を理解する

前回 は、GitHub が開発した CodeQL(セキュリティ脆弱性を検出するオープンソースのツール)で使われているパスクエリについて、実際に内容を見ていきました。

今回は、VSCode(Visual Studio Code)で、CodeQL を使う方法について調べていきたいと思います。

それでは、やっていきます。

はじめに

「セキュリティ」の記事一覧です。良かったら参考にしてください。

セキュリティの記事一覧
・第1回:Ghidraで始めるリバースエンジニアリング(環境構築編)
・第2回:Ghidraで始めるリバースエンジニアリング(使い方編)
・第3回:VirtualBoxにParrotOS(OVA)をインストールする
・第4回:tcpdumpを理解して出力を正しく見れるようにする
・第5回:nginx(エンジンエックス)を理解する
・第6回:Python+Flask(WSGI+Werkzeug+Jinja2)を動かしてみる
・第7回:Python+FlaskのファイルをCython化してみる
・第8回:shadowファイルを理解してパスワードを解読してみる
・第9回:安全なWebアプリケーションの作り方(徳丸本)の環境構築
・第10回:Vue.jsの2.xと3.xをVue CLIを使って動かしてみる(ビルドも行う)
・第11回:Vue.jsのソースコードを確認する(ビルド後のソースも見てみる)
・第12回:徳丸本:OWASP ZAPの自動脆弱性スキャンをやってみる
・第13回:徳丸本:セッション管理を理解してセッションID漏洩で成りすましを試す
・第14回:OWASP ZAPの自動スキャン結果の分析と対策:パストラバーサル
・第15回:OWASP ZAPの自動スキャン結果の分析と対策:クロスサイトスクリプティング(XSS)
・第16回:OWASP ZAPの自動スキャン結果の分析と対策:SQLインジェクション
・第17回:OWASP ZAPの自動スキャン結果の分析と対策:オープンリダイレクト
・第18回:OWASP ZAPの自動スキャン結果の分析と対策:リスク中すべて
・第19回:CTF初心者向けのCpawCTFをやってみた
・第20回:hashcatの使い方(GPU実行時間の見積りとパスワード付きZIPファイル)
・第21回:Scapyの環境構築とネットワークプログラミング
・第22回:CpawCTF2にチャレンジします(クリア状況は随時更新します)
・第23回:K&Rのmalloc関数とfree関数を理解する
・第24回:C言語、アセンブラでシェルを起動するプログラムを作る(ARM64)
・第25回:機械語でシェルを起動するプログラムを作る(ARM64)
・第26回:入門セキュリhttps://github.com/SECCON/SECCON2017_online_CTF.gitティコンテスト(CTFを解きながら学ぶ実践技術)を読んだ
・第27回:x86-64 ELF(Linux)のアセンブラをGDBでデバッグしながら理解する(GDBコマンド、関連ツールもまとめておく)
・第28回:入門セキュリティコンテスト(CTFを解きながら学ぶ実践技術)のPwnable問題をやってみる
・第29回:実行ファイルのセキュリティ機構を調べるツール「checksec」のまとめ
・第30回:setodaNote CTF Exhibitionにチャレンジします(クリア状況は随時更新します)
・第31回:常設CTFのksnctfにチャレンジします(クリア状況は随時更新します)
・第32回:セキュリティコンテストチャレンジブックの「Part2 pwn」を読んだ
・第33回:セキュリティコンテストチャレンジブックの「付録」を読んでx86とx64のシェルコードを作った
・第34回:TryHackMeを始めてみたけどハードルが高かった話
・第35回:picoCTFを始めてみた(Beginner picoMini 2022:全13問完了)
・第36回:picoCTF 2024:Binary Exploitationの全10問をやってみた(Hardの1問は後日やります)
・第37回:picoCTF 2024:Reverse Engineeringの全7問をやってみた(Windowsプログラムの3問は後日やります)
・第38回:picoCTF 2024:General Skillsの全10問をやってみた
・第39回:picoCTF 2024:Web Exploitationの全6問をやってみた(最後の2問は解けず)
・第40回:picoCTF 2024:Forensicsの全8問をやってみた(最後の2問は解けず)
・第41回:picoCTF 2024:Cryptographyの全5問をやってみた(最後の2問は手つかず)
・第42回:picoCTF 2023:General Skillsの全6問をやってみた
・第43回:picoCTF 2023:Reverse Engineeringの全9問をやってみた
・第44回:picoCTF 2023:Binary Exploitationの全7問をやってみた(最後の1問は後日やります)
・第45回:書籍「セキュリティコンテストのためのCTF問題集」を読んだ
・第46回:書籍「詳解セキュリティコンテスト」のReversingを読んだ
・第47回:書籍「詳解セキュリティコンテスト」のPwnableのシェルコードを読んだ
・第48回:書籍「バイナリファイル解析 実践ガイド」を読んだ
・第49回:書籍「詳解セキュリティコンテスト」Pwnableのスタックベースエクスプロイトを読んだ
・第50回:書籍「詳解セキュリティコンテスト」Pwnableの共有ライブラリと関数呼び出しを読んだ
・第51回:picoCTF 2025:General Skillsの全5問をやってみた
・第52回:picoCTF 2025:Reverse Engineeringの全7問をやってみた
・第53回:picoCTF 2025:Binary Exploitationの全6問をやってみた
・第54回:書籍「詳解セキュリティコンテスト」Pwnableの仕様に起因する脆弱性を読んだ
・第55回:システムにインストールされたものと異なるバージョンのglibcを使う方法
・第56回:書籍「詳解セキュリティコンテスト」Pwnableのヒープベースエクスプロイトを読んだ
・第57回:書籍「解題pwnable」の第1章「準備」を読んだ
・第58回:書籍「解題pwnable」の第2章「login1(スタックバッファオーバーフロー1)」を読んだ
・第59回:書籍「解題pwnable」の第3章「login2(スタックバッファオーバーフロー2)」を読んだ
・第60回:書籍「解題pwnable」の第4章「login3(スタックバッファオーバーフロー3)」を読んだ
・第61回:書籍「解題pwnable」の第5章「rot13(書式文字列攻撃)」を読んだ
・第62回:GitHubが開発した静的解析ツール(脆弱性検出ツール)のCodeQLを使ってみる
・第63回:CodeQL(静的解析ツール)で使われるクエリの選ばれ方を調べた
・第64回:CodeQL(静的解析ツール)のクエリの書き方を調べた
・第65回:CodeQL(静的解析ツール)で使われているアラートクエリの中身を調べる
・第66回:CodeQL(静的解析ツール)で使われているパスクエリの中身を調べる
・第67回:CodeQL(静的解析ツール)をVSCodeで使う方法を理解する ← 今回

以下は、CodeQL の公式サイトです。

codeql.github.com

上のトップページの右上にある「Docs」というリンクをクリックすると、公式ドキュメントのトップページに飛びます。ただ、このページから、全てのドキュメントに行けるわけではなく、なんとなく、よく読まれそうなリンクをいくつか貼っただけのようです。実際は、このページの一番下の「Support」の「GitHub Docs」をクリックします。さらに、いくつかの項目が並んでいる中の「セキュリティ」という中の「安全なコーディング」をクリックします。このページの下の方に、CodeQL に関するドキュメントのサイトマップが見つかります。

docs.github.com

私の記事の「GitHubが開発した静的解析ツール(脆弱性検出ツール)のCodeQLを使ってみる - 土日の勉強ノート」は、「CodeQL CLI を使用してコードをセキュリティで保護する」の「CodeQL CLI の使用を開始する」を参考に書いたものです。

今回は、「Visual Studio Code 内での CodeQL の使用」を読みながらやっていきたいと思います。

Visual Studio Code 拡張機能の CodeQL の概要

6個の項目が並んでいます。順番に見ていきます。

docs.github.com

VS Code 用 CodeQL について

現時点(2025/8/17)で、なぜか、ここだけ日本語化されていません。

ここでは、VSCode用の CodeQL拡張機能プラグイン(CodeQLプラグイン)で出来ることが説明されています。

機能の概要が書かれているだけなので、割愛します。

Visual Studio Code 向け CodeQL のインストール

ここでは、VSCode に対しtえ、CodeQLプラグインのインストール方法について書かれています。

docs.github.com

インストールの流れとしては、VSCode の拡張機能のところで、CodeQL で検索すれば、GitHub が提供する「CodeQL」というのが出てくるので、それをインストールするだけです。

では、実際にやっていきます。

VSCode を起動して、下図のように、CodeQL の拡張機能をインストールします。

VSCodeにCodeQLの拡張機能をインストール
VSCodeにCodeQLの拡張機能をインストール

インストールが完了すると、下図のように、左のサイドバーに CodeQL のアイコンが追加されます。そのアイコンをクリックすると、しばらく、何やらサーチしてる感じになりますが、しばらくするとサーチも完了します。

この時、VSCode が、別途 CodeQL CLI をインストールしているようです。最新の CodeQL CLI がインストールされました。

CodeQL データベースの管理

ここでは、VSCode で使う CodeQL のデータベースの扱いについて説明されています。

CodeQL で、クエリを実行するには、通常は、データベースが必要です(データベースが無くても、クエリの文法を確認することを目的とするなど、簡単なクエリは実行できます)。

しかし、VSCode の CodeQLプラグインに、データベースを作る機能はなく、使用するデータベースを選択することになります。

下図のように、From a folder をクリックして、以前作成した、ローカルのデータベースのフォルダを指定します。

CodeQLの拡張機能を開いた
CodeQLの拡張機能を開いた

また、ここでは、使用するプログラム言語の選択についても簡単に説明されています。上の図で、LANGUAGE というところが、All langueages になってると思うので、C/C++ を選択しておきます。C/C++ をクリックすると、右に select というのが出るので、これもクリックしておきます。

CodeQL クエリの実行

ここでは、CodeQL のクエリを実行する方法について説明されています。

では、やってみます。

既存のクエリを実行したいと思います。せっかくなので、CodeQL が指摘を出すクエリの方がいいかなと思うので、以前 実行したログから、指摘を出すクエリを探して見ます。ログにクエリ名があるので、それをキーに、cpp-queries のディレクトリから検索してみます。

VeryLikelyOverrunWrite.ql というファイル名であることが分かりました。

$ grep -rI 'Likely overrunning write' codeql/qlpacks/codeql/cpp-queries/
codeql/qlpacks/codeql/cpp-queries/1.4.2/Security/CWE/CWE-120/VeryLikelyOverrunWrite.md:# Likely overrunning write
codeql/qlpacks/codeql/cpp-queries/1.4.2/Security/CWE/CWE-120/VeryLikelyOverrunWrite.ql: * @name Likely overrunning write

では、このクエリを実行してみます。

QUERIES というところで、VeryLikelyOverrunWrite.ql を選択します。すると、右に ▷ が出るので、これをクリックすることで実行できます。下図が実行が完了した画面です。マシンが非力なこともありますが、結構時間がかかりました(10分ぐらい)。

クエリを実行した画面
クエリを実行した画面

CodeQL CLI で実行したときと同じく、10件が検出されました。

注意点としては、このクエリを少し変更して、結果を反映するために、再度実行したとします。しかし、キャッシュというか、実行した結果を覚えてしまっているのか、結果が更新されません。こういうときは、上図の QUERY HISTORY で履歴を削除して(ゴミ箱アイコンをクリックする)、再度実行すると、結果が反映されます。

解説では、ディレクトリ内の全クエリを実行する方法、複数のクエリを実行する方法、クイッククエリを使って実行する方法(.qlファイルを保存しなくてもクエリを実行できる方法)が説明されています。

あと、クエリの一部だけを実行する方法についても解説されています。

VeryLikelyOverrunWrite.ql の where句の bw.getMaxDataLimited(reason) について、実行してみました。

クエリの一部を実行
クエリの一部を実行

use_after_free.c のバッファ書き込み(scanf関数)を検索すると以下です。choice は int型の変数なので対象外であり、それ以外は 255 になってるので、クエリの一部の実行は出来ていそうです。

use_after_free.cでscanf関数を検索
use_after_free.cでscanf関数を検索

正直言って、どうデバッグに活かせばいいかは分かっていませんが、こんなことが出来るんだな、という理解にしておきます。

パス クエリを使用したデータ フローの確認

ここでは、VSCode の CodeQLプラグインで、パスクエリの実行方法が書かれています。

基本的には、上の「CodeQL クエリの実行」と同じ方法です。

パスクエリでは、バリアント分析リポジトリビュー(VSCode のサイドバーの VARIANT ANALYSIS REPOSITORIES)というのが使えるようです。ただし、GitHub のリポジトリに対して実行できる、と書かれているので、現在はあまり使用しない内容だと思います。

マルチリポジトリ バリアント分析を使用した大規模な CodeQL クエリの実行

上の「パス クエリを使用したデータ フローの確認」で書かれていた内容の具体的なやり方が書かれているようです。こちらも、現在はあまり関係しない機能のようなので、割愛します。

VS Code 拡張機能の CodeQL の高度な機能の使用

9個の項目が並んでいます。順番に見ていきます。

docs.github.com

CodeQL モデル エディターの使用

ここでは、CodeQL のモデリングの方法が書かれてる?ようです。ちょっと、まだ分からないのでスキップします。

カスタム クエリの作成

ここでは、VSCode の CodeQLプラグインで、カスタムクエリを作るときに、テンプレートを作ってくれる機能の説明です。

C/C++ の場合、以下のようなテンプレートで、カスタムクエリが作成されます。

/**
 * This is an automatically generated file
 * @name Hello world
 * @kind problem
 * @problem.severity warning
 * @id cpp/example/hello-world
 */

import cpp

from File f
select f, "Hello, world!"

CodeQL クエリ パックとライブラリ パックの管理

CodeQL のクエリパックの扱いについて書かれているようです。まだ使いそうにないのでスキップします。

ソース コードの構造の探索

ここでは、VSCode の CodeQLプラグインの AST VIEWER の使い方が説明されています。

これはとても重要な機能です。

まず、VSCode の CodeQLプラグインの DATABASES で、対象のデータベースを右クリックして、下図のように、Add Database Source to Workspace をクリックします。

データベースソースをワークスペースに追加する
データベースソースをワークスペースに追加する

次に、VSCode のエクスプローラを見ると、下図のように、uaf_db source archive というのが増えています。ここで、ビューアで見たいソースファイルを選択します。

データベースソースからソースを選択する
データベースソースからソースを選択する

VSCode の CodeQLプラグインに戻り、下図のように、AST VIEWER の View AST をクリックします。

AST VIEWERのView ASTをクリックする
AST VIEWERのView ASTをクリックする

しばらくすると、下図のように、AST VIEWER に、対象のソースコードの構造が表示されます。

これは、対象のソースコードを CodeQL がどのように認識しているかを示しています。つまり、クエリがデータベースに問い合わせをしているわけですが、そのデータベースの内容を構造化して見せてくれているというわけです。

例えば、下図の場合、TopLevelFunction の main関数があり、そこにいくつかの文が並んでおり、その中の while文の中のブロックの中の if文を選択したところです。選択された文が、実際のソースコードでハイライトされるので、とても分かりやすいです。

AST VIEWER
AST VIEWER

CodeQL の理解が深まりますし、クエリのデバッグにも、とても役立ちそうです。

Visual Studio Code での CodeQL クエリのテスト

ここでは、VSCode の CodeQLプラグインを使った、クエリのテストについて解説されています。

ざっと読みましたが、テストパターンの管理が主なようです。

また、必要になったら、詳しく読みたいと思います。

設定のカスタマイズ

ここでは、VSCode の CodeQLプラグインの設定について、解説されています。

こちらも、ざっと読みましたが、すぐに役立ちそうな内容は見当たりませんでした。

また、必要になったら、詳しく読みたいと思います。

CodeQL ワークスペースのセットアップ

ここでは、VSCode の CodeQLプラグインで、アクセス権についての設定?について、解説されています。

あまり、必要そうな内容に思えなかったので、スキップします。

CodeQL CLI へのアクセスの構成

VSCode の CodeQLプラグインで、使用する CodeQL CLI についての扱いについて説明されています。

CodeQL CLI が、パスの通った場所にインストールされている場合、CodeQLプラグインは、インストールされた CodeQL CLI を使うそうです。

そうではない場合、新しいバージョンの CodeQL CLI を確認して、必要に応じて、CodeQL CLI をインストール、アップデートするようです。

Visual Studio Code 用 CodeQL のテレメトリ

VSCode の CodeQLプラグインを使用したときのデータが収集され、GitHub に送られることについて説明されています。

あまり、必要そうな内容に思えなかったので、スキップします。

VS Code 向け CodeQL のトラブルシューティング

2個の項目が並んでいます。順番に見ていきます。

docs.github.com

ログへのアクセス

VSCode の CodeQLプラグインを使用しているときの、ログについて、詳細な内容が確認できるということが説明されています。

CodeQLプラグインを開きます。そして、VSCode のメニューから、ターミナル → 新しいターミナルをクリックして、ターミナルを表示します。「出力」をクリックします。すると、ドロップダウンリストがあるので、CodeQL Extension Log を選択します。

これにより、いつも右下に出ているエラーのダイアログ?の詳細な内容が表示されます。

CodeQL Extension Log
CodeQL Extension Log

コントローラー リポジトリに関する問題

以下のような警告が出た場合の対処方法について書かれています。

Publicly visible controller repository can't be used to analyze private repositories.
NUMBER private repositories were not analyzed.

おわりに

今回は、VSCode の CodeQLプラグインの使い方を見ていきました。AST VIEWER の使い方を理解できたことが重要でした。

しばらくは、CodeQL のクエリの理解を続けることになりそうです。

最後になりましたが、エンジニアグループのランキングに参加中です。

気楽にポチッとよろしくお願いいたします🙇

今回は以上です!

最後までお読みいただき、ありがとうございました。




以上の内容はhttps://daisuke20240310.hatenablog.com/entry/codeql_vscodeより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14