
Framework agente per la sintesi di query CodeQL
Framework agentico per la sintesi di query CodeQL

QLCoder è un framework per l'utilizzo di LLM nella sintesi di query CodeQL end-to-end per il rilevamento di vulnerabilità. Data la metadati di una CVE esistente, un LLM e un agente di codifica, QLCoder sintetizza iterativamente una query CodeQL per rilevare la CVE esistente. La query iniziale è un template di query di percorso CodeQL popolato da un AST estratto dal diff. Durante la sintesi della query, l'agente di codifica ha accesso a strumenti per interfacciarsi con un database RAG e con il language server CodeQL. Successivamente, la query può essere utilizzata per analisi multivariante, test di regressione o come guida per la scrittura di query CodeQL.
Nota - Nell'articolo è stata utilizzata la versione 2.22.2 di CodeQL. Tuttavia, è possibile utilizzare qualsiasi versione (e linguaggio). QLCoder memorizza i QL pack della versione locale di CodeQL nel database vettoriale. I percorsi sono configurati in .env.
Scarica una versione appropriata del bundle CodeQL Action dalla pagina delle release di CodeQL Action.
Per la versione più recente: Visita la release più recente e scarica il bundle appropriato per il tuo sistema operativo:
codeql-bundle-osx64.tar.gz per macOScodeql-bundle-linux64.tar.gz per LinuxPer una versione specifica (es. 2.22.2):
Vai alla pagina delle release di CodeQL Action, trova la release taggata codeql-bundle-v2.22.2 e scarica il bundle appropriato per la tua piattaforma.
Estrai in ~/codeql (o in un altro percorso — aggiorna CODEQL_HOME in .env di conseguenza):
tar -xzf codeql-bundle-<platform>.tar.gz -C ~/
Clona il server MCP CodeQL LSP e compilalo.
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
Inserisci la tua chiave API e i percorsi CodeQL in .env:
ANTHROPIC_API_KEY=...
# I percorsi dei QL pack dipendono dalla versione di CodeQL.
# Trova i numeri di versione con:
# ls ~/codeql/qlpacks/codeql/java-queries/ → usa per SECURITY_QLPACK_PATH
# ls ~/codeql/qlpacks/codeql/java-all/ → usa per 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
Quindi avvia l'app QLCoder e ChromaDB:
docker compose up -d
La CVE deve essere elencata in data/project_info.csv. Questo clona il repository al commit difettoso e genera il diff della correzione.
docker compose run --rm app python3 scripts/get_cve_repos.py --cve CVE-2025-27818
# oppure più di una alla volta:
docker compose run --rm app python3 scripts/get_cve_repos.py --cves CVE-2025-27818,CVE-2025-0851
# elabora le CVE da un file (un ID CVE per riga)
docker compose run --rm app python3 scripts/get_cve_repos.py --cve-file cves.txt
# elabora tutte le CVE
docker compose run --rm app python3 scripts/get_cve_repos.py --all
# forza la rigenerazione dei diff esistenti
docker compose run --rm app python3 scripts/get_cve_repos.py --cve CVE-2018-9159 --force
I database vengono creati con --build-mode=none — nessuna toolchain di compilazione richiesta.
# per creare i database CodeQL di una CVE specifica
docker compose run --rm app python3 scripts/build_codeql_dbs.py --cve-id CVE-2025-27818
Questo crea cves/CVE-2025-27818/CVE-2025-27818-vul e cves/CVE-2025-27818/CVE-2025-27818-fix.
# per creare i database CodeQL di tutti i repository CVE recuperati
docker compose run --rm app python3 scripts/build_codeql_dbs.py
Esegui questi script per popolare il database vettoriale. codeql_docs_fetcher.py e cwe_fetcher.py sono configurazioni una tantum; cves_fetcher.py deve essere rieseguito dopo l'aggiunta di nuove 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
Nota - Nell'articolo è stata utilizzata la versione 2.22.2 di CodeQL. Tuttavia, è possibile utilizzare qualsiasi versione (e linguaggio). QLCoder memorizza i QL pack della versione locale di CodeQL nel database vettoriale. I percorsi sono configurati in .env.
Scarica una versione appropriata del bundle CodeQL Action dalla pagina delle release di CodeQL Action.
Per la versione più recente: Visita la release più recente e scarica il bundle appropriato per il tuo sistema operativo:
codeql-bundle-linux64.tar.gz per LinuxPer una versione specifica (es. 2.22.2):
Vai alla pagina delle release di CodeQL Action, trova la release taggata codeql-bundle-v2.22.2 e scarica il bundle appropriato per la tua piattaforma.
Dopo il download, estrai l'archivio nella directory principale del progetto:
tar -xzf codeql-bundle-<platform>.tar.gz
Questo dovrebbe creare una sottodirectory codeql/ con l'eseguibile codeql al suo interno.
Aggiungi il percorso di questo eseguibile alla tua variabile d'ambiente PATH:
export PATH="$PWD/codeql:$PATH"
Clona il server MCP CodeQL LSP e compilalo.
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
.envcp .env.example .env
Inserisci la tua chiave API e i percorsi CodeQL in .env:
ANTHROPIC_API_KEY=...
CODEQL_HOME=~/codeql
CODEQL_LSP_MCP_HOME=~/codeql-lsp-mcp
# I percorsi dei QL pack dipendono dalla versione di CodeQL.
# Trova i numeri di versione con:
# ls ~/codeql/qlpacks/codeql/java-queries/ → usa per SECURITY_QLPACK_PATH
# ls ~/codeql/qlpacks/codeql/java-all/ → usa per 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
La CVE deve essere elencata in data/project_info.csv. Questo clona il repository al commit difettoso e genera il diff della correzione.