
Agentic Framework zum Synthetisieren von CodeQL-Abfragen
Agentisches Framework zur Synthese von CodeQL-Abfragen

QLCoder ist ein Framework zur Verwendung von LLMs zur Synthese von End-to-End-CodeQL-Abfragen zur Schwachstellenerkennung. Ausgehend von den Metadaten einer vorhandenen CVE, einem LLM und einem Coding-Agenten synthetisiert QLCoder iterativ eine CodeQL-Abfrage zur Erkennung der vorhandenen CVE. Die Startabfrage ist eine CodeQL-Pfadabfragevorlage, die mit einem extrahierten AST des Diffs befüllt wird. Während der Synthese der Abfrage hat der Coding-Agent Zugriff auf Werkzeuge zur Schnittstelle mit einer RAG-Datenbank und dem CodeQL-Sprachserver. Anschließend kann die Abfrage für Multivarianten-Analyse, Regressionstests oder als Leitfaden zum Schreiben von CodeQL-Abfragen verwendet werden.
Hinweis – Im Paper wurde CodeQL Version 2.22.2 verwendet. Es kann jedoch jede Version (und Sprache) verwendet werden. QLCoder speichert die QL-Pakete der lokalen CodeQL-Version in der Vektordatenbank. Pfade werden in .env konfiguriert.
Laden Sie eine geeignete Version des CodeQL Action-Bundles von der CodeQL Action-Releases-Seite herunter.
Für die neueste Version: Besuchen Sie das neueste Release und laden Sie das passende Bundle für Ihr Betriebssystem herunter:
codeql-bundle-osx64.tar.gz für macOScodeql-bundle-linux64.tar.gz für LinuxFür eine bestimmte Version (z. B. 2.22.2):
Gehen Sie zur CodeQL Action-Releases-Seite, finden Sie das Release mit dem Tag codeql-bundle-v2.22.2 und laden Sie das passende Bundle für Ihre Plattform herunter.
Entpacken Sie nach ~/codeql (oder einen anderen Pfad – aktualisieren Sie CODEQL_HOME in .env entsprechend):
tar -xzf codeql-bundle-<platform>.tar.gz -C ~/
Klonen Sie den CodeQL-LSP-MCP-Server und bauen Sie ihn.
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
Füllen Sie Ihren API-Schlüssel und die CodeQL-Pfade in .env aus:
ANTHROPIC_API_KEY=...
# QL-Paketpfade hängen von Ihrer CodeQL-Version ab.
# Finden Sie die Versionsnummern mit:
# ls ~/codeql/qlpacks/codeql/java-queries/ → für SECURITY_QLPACK_PATH verwenden
# ls ~/codeql/qlpacks/codeql/java-all/ → für LIBRARY_QLPACK_PATH verwenden
SECURITY_QLPACK_PATH=~/codeql/qlpacks/codeql/java-queries/<version>/Security/CWE
LIBRARY_QLPACK_PATH=~/codeql/qlpacks/codeql/java-all/<version>/semmle/code/java
Starten Sie dann die QLCoder-App und ChromaDB:
docker compose up -d
Die CVE muss in data/project_info.csv aufgeführt sein. Dadurch wird das Repository beim fehlerhaften Commit geklont und der Fix-Diff erzeugt.
docker compose run --rm app python3 scripts/get_cve_repos.py --cve CVE-2025-27818
# oder mehrere auf einmal:
docker compose run --rm app python3 scripts/get_cve_repos.py --cves CVE-2025-27818,CVE-2025-0851
# CVEs aus einer Datei verarbeiten (eine CVE-ID pro Zeile)
docker compose run --rm app python3 scripts/get_cve_repos.py --cve-file cves.txt
# alle CVEs verarbeiten
docker compose run --rm app python3 scripts/get_cve_repos.py --all
# vorhandene Diffs erneut erzeugen
docker compose run --rm app python3 scripts/get_cve_repos.py --cve CVE-2018-9159 --force
Datenbanken werden mit --build-mode=none erstellt – keine Build-Toolchain erforderlich.
# um die CodeQL-Datenbanken einer bestimmten CVE zu erstellen
docker compose run --rm app python3 scripts/build_codeql_dbs.py --cve-id CVE-2025-27818
Dadurch werden cves/CVE-2025-27818/CVE-2025-27818-vul und cves/CVE-2025-27818/CVE-2025-27818-fix erstellt.
# um die CodeQL-Datenbanken aller abgerufenen CVE-Repositories zu erstellen
docker compose run --rm app python3 scripts/build_codeql_dbs.py
Führen Sie diese Skripte aus, um die Vektordatenbank zu befüllen. codeql_docs_fetcher.py und cwe_fetcher.py sind einmalige Einrichtungen; cves_fetcher.py sollte nach dem Hinzufügen neuer CVEs erneut ausgeführt werden.
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
Hinweis – Im Paper wurde CodeQL Version 2.22.2 verwendet. Es kann jedoch jede Version (und Sprache) verwendet werden. QLCoder speichert die QL-Pakete der lokalen CodeQL-Version in der Vektordatenbank. Pfade werden in .env konfiguriert.
Laden Sie eine geeignete Version des CodeQL Action-Bundles von der CodeQL Action-Releases-Seite herunter.
Für die neueste Version: Besuchen Sie das neueste Release und laden Sie das passende Bundle für Ihr Betriebssystem herunter:
codeql-bundle-linux64.tar.gz für LinuxFür eine bestimmte Version (z. B. 2.22.2):
Gehen Sie zur CodeQL Action-Releases-Seite, finden Sie das Release mit dem Tag codeql-bundle-v2.22.2 und laden Sie das passende Bundle für Ihre Plattform herunter.
Nach dem Herunterladen entpacken Sie das Archiv im Projektstammverzeichnis:
tar -xzf codeql-bundle-<platform>.tar.gz
Dadurch sollte ein Unterverzeichnis codeql/ mit der ausführbaren Datei codeql darin erstellt werden.
Fügen Sie den Pfad dieser ausführbaren Datei zu Ihrer PATH-Umgebungsvariable hinzu:
export PATH="$PWD/codeql:$PATH"
Klonen Sie den CodeQL-LSP-MCP-Server und bauen Sie ihn.
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 konfigurierencp .env.example .env
Füllen Sie Ihren API-Schlüssel und die CodeQL-Pfade in .env aus:
ANTHROPIC_API_KEY=...
CODEQL_HOME=~/codeql
CODEQL_LSP_MCP_HOME=~/codeql-lsp-mcp
# QL-Paketpfade hängen von Ihrer CodeQL-Version ab.
# Finden Sie die Versionsnummern mit:
# ls ~/codeql/qlpacks/codeql/java-queries/ → für SECURITY_QLPACK_PATH verwenden
# ls ~/codeql/qlpacks/codeql/java-all/ → für LIBRARY_QLPACK_PATH verwenden
SECURITY_QLPACK_PATH=~/codeql/qlpacks/codeql/java-queries/<version>/Security/CWE
LIBRARY_QLPACK_PATH=~/codeql/qlpacks/codeql/java-all/<version>/semmle/code/java