
CodeQLクエリを合成するためのエージェント型フレームワーク

QLCoderは、LLMを使用して脆弱性検出のためのエンドツーエンドのCodeQLクエリを合成するためのフレームワークです。既存のCVEのメタデータ、LLM、およびコーディングエージェントが与えられると、QLCoderは既存のCVEを検出するためのCodeQLクエリを反復的に合成します。初期クエリは、抽出されたdiffのASTによって生成されたCodeQLパスクエリテンプレートです。クエリの合成中、コーディングエージェントはRAGデータベースおよびCodeQL言語サーバーとインターフェースするためのツールにアクセスできます。その後、クエリは多変量解析、回帰テスト、またはCodeQLクエリ作成のガイダンスに使用できます。
注 - 論文ではCodeQLバージョン2.22.2を使用しました。ただし、任意のバージョン(および言語)を使用できます。QLCoderはローカルのCodeQLバージョンのQLパックをベクターデータベースに保存します。パスは.envで設定されます。
CodeQL Action releases pageから適切なバージョンのCodeQL Actionバンドルをダウンロードしてください。
最新バージョンの場合: 最新リリースにアクセスし、お使いのOSに適したバンドルをダウンロードしてください:
codeql-bundle-osx64.tar.gzcodeql-bundle-linux64.tar.gz特定のバージョン(例: 2.22.2)の場合:
CodeQL Action releases pageにアクセスし、codeql-bundle-v2.22.2というタグが付いたリリースを見つけて、お使いのプラットフォームに適したバンドルをダウンロードしてください。
~/codeqlに展開します(または別のパス — それに応じて.envのCODEQL_HOMEを更新してください):
tar -xzf codeql-bundle-<platform>.tar.gz -C ~/
CodeQL LSP MCP serverをクローンしてビルドします。
git clone https://github.com/neuralprogram/codeql-lsp-mcp ~/codeql-lsp-mcp
cd ~/codeql-lsp-mcp
npm install
npm run build
cp .env.example .env
echo "APP_UID=$(id -u)" >> .env
echo "APP_GID=$(id -g)" >> .env
.envにAPIキーとCodeQLパスを入力してください:
ANTHROPIC_API_KEY=...
# QLパックのパスはCodeQLのバージョンによって異なります。
# バージョン番号は以下で確認できます:
# ls ~/codeql/qlpacks/codeql/java-queries/ → SECURITY_QLPACK_PATHに使用
# ls ~/codeql/qlpacks/codeql/java-all/ → LIBRARY_QLPACK_PATHに使用
SECURITY_QLPACK_PATH=~/codeql/qlpacks/codeql/java-queries/<version>/Security/CWE
LIBRARY_QLPACK_PATH=~/codeql/qlpacks/codeql/java-all/<version>/semmle/code/java
次にQLCoderアプリとChromaDBを起動します:
docker compose up -d
CVEはdata/project_info.csvにリストされている必要があります。これにより、バグのあるコミットでリポジトリがクローンされ、修正diffが生成されます。
docker compose run --rm app python3 scripts/get_cve_repos.py --cve CVE-2025-27818
# または複数を一度に:
docker compose run --rm app python3 scripts/get_cve_repos.py --cves CVE-2025-27818,CVE-2025-0851
# ファイルからCVEを処理(1行に1つのCVE ID)
docker compose run --rm app python3 scripts/get_cve_repos.py --cve-file cves.txt
# すべてのCVEを処理
docker compose run --rm app python3 scripts/get_cve_repos.py --all
# 既存のdiffを強制的に再生成
docker compose run --rm app python3 scripts/get_cve_repos.py --cve CVE-2018-9159 --force
データベースは--build-mode=noneで作成されます — ビルドツールチェーンは不要です。
# 特定のCVEのCodeQLデータベースをビルドする場合
docker compose run --rm app python3 scripts/build_codeql_dbs.py --cve-id CVE-2025-27818
これにより、cves/CVE-2025-27818/CVE-2025-27818-vulとcves/CVE-2025-27818/CVE-2025-27818-fixが作成されます。
# 取得したすべてのCVEリポジトリのCodeQLデータベースをビルドする場合
docker compose run --rm app python3 scripts/build_codeql_dbs.py
これらのスクリプトを実行してベクターデータベースを構築します。codeql_docs_fetcher.pyとcwe_fetcher.pyは一度だけのセットアップです。cves_fetcher.pyは新しいCVEを追加した後に再実行する必要があります。
docker compose run --rm app python3 scripts/codeql_docs_fetcher.py
docker compose run --rm app python3 scripts/cwe_fetcher.py
docker compose run --rm app python3 scripts/cves_fetcher.py
注 - 論文ではCodeQLバージョン2.22.2を使用しました。ただし、任意のバージョン(および言語)を使用できます。QLCoderはローカルのCodeQLバージョンのQLパックをベクターデータベースに保存します。パスは.envで設定されます。
CodeQL Action releases pageから適切なバージョンのCodeQL Actionバンドルをダウンロードしてください。
最新バージョンの場合: 最新リリースにアクセスし、お使いのOSに適したバンドルをダウンロードしてください:
codeql-bundle-linux64.tar.gz特定のバージョン(例: 2.22.2)の場合:
CodeQL Action releases pageにアクセスし、codeql-bundle-v2.22.2というタグが付いたリリースを見つけて、お使いのプラットフォームに適したバンドルをダウンロードしてください。
ダウンロード後、プロジェクトのルートディレクトリでアーカイブを展開します:
tar -xzf codeql-bundle-<platform>.tar.gz
これにより、実行可能ファイルcodeqlを含むサブディレクトリcodeql/が作成されます。
この実行可能ファイルのパスをPATH環境変数に追加します:
export PATH="$PWD/codeql:$PATH"
CodeQL LSP MCP serverをクローンしてビルドします。
git clone https://github.com/neuralprogram/codeql-lsp-mcp
cd codeql-lsp-mcp
npm install
npm run build
conda env create -f environment.yml
conda activate qlcoder
.envの設定cp .env.example .env
.envにAPIキーとCodeQLパスを入力してください:
ANTHROPIC_API_KEY=...
CODEQL_HOME=~/codeql
CODEQL_LSP_MCP_HOME=~/codeql-lsp-mcp
# QLパックのパスはCodeQLのバージョンによって異なります。
# バージョン番号は以下で確認できます:
# ls ~/codeql/qlpacks/codeql/java-queries/ → SECURITY_QLPACK_PATHに使用
# ls ~/codeql/qlpacks/codeql/java-all/ → LIBRARY_QLPACK_PATHに使用
SECURITY_QLPACK_PATH=~/codeql/qlpacks/codeql/java-queries/<version>/Security/CWE
LIBRARY_QLPACK_PATH=~/codeql/qlpacks/codeql/java-all/<version>/semmle/code/java
CVEはdata/project_info.csvにリストされている必要があります。これにより、バグのあるコミットでリポジトリがクローンされ、修正diffが生成されます。
python3 scripts/get_cve_repos.py --cve CVE-2025-27818
# または複数を一度に:
python3 scripts/get_cve_repos.py --cves CVE-2025-27818,CVE-2025-0851
# ファイルからCVEを処理(1行に1つのCVE ID)
python3 scripts/get_cve_repos.py --cve-file cves.txt
# すべてのCVEを処理
python3 scripts/get_cve_repos.py --all
# 既存のdiffを強制的に再生成
python3 scripts/get_cve_repos.py --cve CVE-2018-9159 --force
データベースは--build-mode=noneで作成されます — ビルドツールチェーンは不要です。
# 特定のCVEのCodeQLデータベースをビルドする場合
python3 scripts/build_codeql_dbs.py --cve-id CVE-2025-27818
# 取得したすべてのCVEリポジトリのCodeQLデータベースをビルドする場合
python3 scripts/build_codeql_dbs.py
これにより、cves/CVE-2025-27818/CVE-2025-27818-vulとcves/CVE-2025-27818/CVE-2025-27818-fixが作成されます。
別のターミナルでChromaDBを起動し、このステップとエージェント実行中は起動したままにしてください。
chroma run --path data/chroma_db
これらのスクリプトを実行してベクターデータベースを構築します。codeql_docs_fetcher.pyとcwe_fetcher.pyは一度だけのセットアップです。cves_fetcher.pyは新しいCVEを追加した後に再実行する必要があります。
python3 scripts/codeql_docs_fetcher.py
python3 scripts/cwe_fetcher.py
python3 scripts/cves_fetcher.py
インストール手順に従った後、クイックスタートでは特定のCVEに対するCodeQLクエリの合成例を説明します。
python3 scripts/get_cve_repos.py --cve CVE-2025-27818
python3 scripts/build_codeql_dbs.py --cve-id CVE-2025-27818
python3 scripts/cves_fetcher.py
./run_cve.sh CVE-2025-27818
CVE IDの後に追加のオプションを渡すことができます:
./run_cve.sh CVE-2025-27818 --model sonnet-4.5 --max-iteration 10
以下はQLCoderで利用可能な設定です。
タイムアウト: 各エージェントのコンテキストウィンドウにはデフォルトのシェルタイムアウト(例: 300秒)があります。「Context window failed」エラーが発生した場合は、必要に応じて関連するバックエンドの実行メソッドでタイムアウトを増やしてください。
注: エージェントのサポートは論文環境に記載されているバージョンに対してテストされています。新しいバージョンのコーディングエージェントではバックエンドの更新が必要になる場合があります。新しいバージョン、他のコーディングエージェント、およびより多くのモデルのサポートを追加するPRは歓迎します!
モデル(--model): sonnet-4(デフォルト)、sonnet-4.5(Claude); gemini-2.5-pro、gemini-2.5-flash(Gemini); gpt-5(Codex)
エージェント(--agent): claude(デフォルト)、gemini(Gemini CLI)、codex(OpenAIモデルおよびオープンソースモデル)
アブレーションモード(--ablation-mode):
| モード | 説明 | 利用可能なエージェント |
|---|---|---|
full | すべてのQLCoderツールが有効(デフォルト)かつAST抽出 | Claude Code、Codex(GPT、GPT-OSS)、Gemini |
no_tools | ツールなし、AST抽出なし | Claude Code、Codex(GPT、GPT-OSS)、Gemini |
no_lsp | CodeQL LSPツールなし | Claude Code |
no_docs | CodeQLドキュメント取得なし | Claude Code |
no_ast | diffからのAST抽出なし | Claude Code |
デフォルトでは推論努力を中程度に設定しています。codex_backend.pyでこれを上書きできます。
CVEの説明の取得にChromaを使用しない場合、事前に取得した説明がtask.cve_descriptionを介してプロンプトに直接注入されます。scripts/cves_fetcher.pyを使用して説明のローカルJSONファイルを構築します:
python scripts/cves_fetcher.py --descriptions-file data/cve_descriptions.json
このファイルはCVE IDをCVEの説明文字列にマッピングし、実行のたびに追加されます(既存のエントリはスキップされます)。--ablation-mode no_toolsまたは--ablation-mode no_docsで実行する場合、QLCoderは自動的にこのファイルをロードし、分析対象のCVEのtask.cve_descriptionを設定します。
QLCoderの使用中に推奨されるツールは以下のとおりです:
QLCoder実行からのコレクション削除 - Chromaをクリーンアップするための、QLCoderの使用によるコレクションを削除するスクリプトです。
chromadb-ops - Chromaの検査とメンテナンスのためのCLIツールです。
# chromaのクリーンアップに便利
chops db clean data/chroma_db
QLCoder使用時のMCP設定の例です。設定はエージェントのワークスペース内のこれらのファイルと同様である必要があります。
QLCoderの論文で結果を生成するために使用されたバージョンは以下のとおりです。
| ツール | バージョン |
|---|---|
| CodeQL | 2.22.2 |
| Claude Code | 1.0.120 |
| Gemini CLI | 0.6.0 |
| Codex CLI | 0.38.0 |
貢献、プルリクエスト、または問題の報告を歓迎します! 貢献したい場合は、新しいプルリクエストまたは問題を提出してください。既存の問題に取り組むことも自由です。
QLCoderは、コーネル大学、ジョンズ・ホプキンス大学、およびペンシルベニア大学の研究者による共同プロジェクトです。ご質問がある場合はお気軽にお問い合わせください。
Claire Wang - ペンシルベニア大学CS博士課程学生
Ziyang Li - ジョンズ・ホプキンス大学教授
Saikat Dutta - コーネル大学教授
Mayur Naik - ペンシルベニア大学教授
ICLR'26の論文を引用することを検討してください:
@misc{wang2025qlcoderquerysynthesizerstatic,
title={QLCoder: A Query Synthesizer For Static Analysis of Security Vulnerabilities},
author={Claire Wang and Ziyang Li and Saikat Dutta and Mayur Naik},
year={2025},
eprint={2511.08462},
archivePrefix={arXiv},
primaryClass={cs.CR},
url={https://arxiv.org/abs/2511.08462},
}
以下はQLCoderの著者に関連するプロジェクトです。ぜひチェックしてみてください。