
# Estrutura Agêntica para Sintetizar Consultas CodeQL
Framework Agêntico para Sintetizar Consultas CodeQL

QLCoder é um framework para usar LLMs na síntese de consultas CodeQL de ponta a ponta para detecção de vulnerabilidades. Dados os metadados de uma CVE existente, um LLM e um agente de codificação, o QLCoder sintetiza iterativamente uma consulta CodeQL para detectar a CVE existente. A consulta inicial é um template de consulta de caminho CodeQL preenchido por uma AST extraída do diff. Durante a síntese da consulta, o agente de codificação tem acesso a ferramentas para interagir com um banco de dados RAG e o servidor de linguagem CodeQL. Posteriormente, a consulta pode ser usada para análise multivariante, testes de regressão ou como orientação para escrever consultas CodeQL.
Nota - No artigo, foi usada a versão 2.22.2 do CodeQL. No entanto, qualquer versão (e linguagem) pode ser usada. O QLCoder armazena os pacotes QL da versão local do CodeQL no banco de dados vetorial. Os caminhos são configurados em .env.
Baixe uma versão apropriada do bundle de ações do CodeQL na página de releases do CodeQL Action.
Para a versão mais recente: Visite o último release e baixe o bundle apropriado para o seu SO:
codeql-bundle-osx64.tar.gz para macOScodeql-bundle-linux64.tar.gz para LinuxPara uma versão específica (ex.: 2.22.2):
Vá para a página de releases do CodeQL Action, encontre o release marcado como codeql-bundle-v2.22.2 e baixe o bundle apropriado para a sua plataforma.
Extraia para ~/codeql (ou outro caminho — atualize CODEQL_HOME em .env de acordo):
tar -xzf codeql-bundle-<platform>.tar.gz -C ~/
Clone o servidor MCP do CodeQL LSP e compile-o.
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
Preencha sua chave de API e os caminhos do CodeQL em .env:
ANTHROPIC_API_KEY=...
# Os caminhos dos pacotes QL dependem da sua versão do CodeQL.
# Encontre os números de versão com:
# ls ~/codeql/qlpacks/codeql/java-queries/ → use para SECURITY_QLPACK_PATH
# ls ~/codeql/qlpacks/codeql/java-all/ → use para 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
Em seguida, inicie o aplicativo QLCoder e o ChromaDB:
docker compose up -d
A CVE deve estar listada em data/project_info.csv. Isso clona o repositório no commit com bug e gera o diff da correção.
docker compose run --rm app python3 scripts/get_cve_repos.py --cve CVE-2025-27818
# ou várias de uma vez:
docker compose run --rm app python3 scripts/get_cve_repos.py --cves CVE-2025-27818,CVE-2025-0851
# processar CVEs de um arquivo (um ID de CVE por linha)
docker compose run --rm app python3 scripts/get_cve_repos.py --cve-file cves.txt
# processar todas as CVEs
docker compose run --rm app python3 scripts/get_cve_repos.py --all
# forçar a regeneração de diffs existentes
docker compose run --rm app python3 scripts/get_cve_repos.py --cve CVE-2018-9159 --force
Os bancos de dados são criados com --build-mode=none — nenhuma toolchain de build é necessária.
# para construir os bancos de dados CodeQL de uma CVE específica
docker compose run --rm app python3 scripts/build_codeql_dbs.py --cve-id CVE-2025-27818
Isso cria cves/CVE-2025-27818/CVE-2025-27818-vul e cves/CVE-2025-27818/CVE-2025-27818-fix.
# para construir os bancos de dados CodeQL de todos os repositórios de CVEs obtidos
docker compose run --rm app python3 scripts/build_codeql_dbs.py
Execute estes scripts para popular o banco de dados vetorial. codeql_docs_fetcher.py e cwe_fetcher.py são configurações únicas; cves_fetcher.py deve ser executado novamente após adicionar novas CVEs.
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 - No artigo, foi usada a versão 2.22.2 do CodeQL. No entanto, qualquer versão (e linguagem) pode ser usada. O QLCoder armazena os pacotes QL da versão local do CodeQL no banco de dados vetorial. Os caminhos são configurados em .env.
Baixe uma versão apropriada do bundle de ações do CodeQL na página de releases do CodeQL Action.
Para a versão mais recente: Visite o último release e baixe o bundle apropriado para o seu SO:
codeql-bundle-linux64.tar.gz para LinuxPara uma versão específica (ex.: 2.22.2):
Vá para a página de releases do CodeQL Action, encontre o release marcado como codeql-bundle-v2.22.2 e baixe o bundle apropriado para a sua plataforma.
Após o download, extraia o arquivo no diretório raiz do projeto:
tar -xzf codeql-bundle-<platform>.tar.gz
Isso deve criar um subdiretório codeql/ com o executável codeql dentro.
Adicione o caminho deste executável à sua variável de ambiente PATH:
export PATH="$PWD/codeql:$PATH"
Clone o servidor MCP do CodeQL LSP e compile-o.
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
Preencha sua chave de API e os caminhos do CodeQL em .env:
ANTHROPIC_API_KEY=...
CODEQL_HOME=~/codeql
CODEQL_LSP_MCP_HOME=~/codeql-lsp-mcp
# Os caminhos dos pacotes QL dependem da sua versão do CodeQL.
# Encontre os números de versão com:
# ls ~/codeql/qlpacks/codeql/java-queries/ → use para SECURITY_QLPACK_PATH
# ls ~/codeql/qlpacks/codeql/java-all/ → use para 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
A CVE deve estar listada em data/project_info.csv. Isso clona o repositório no commit com bug e gera o diff da correção.