
Agentic Framework для синтеза CodeQL-запросов
Агентный фреймворк для синтеза CodeQL-запросов

QLCoder — это фреймворк для использования LLM с целью синтеза сквозных CodeQL-запросов для обнаружения уязвимостей. Имея метаданные существующей CVE, LLM и кодирующий агент, QLCoder итеративно синтезирует CodeQL-запрос для обнаружения данной CVE. Начальный запрос — это шаблон CodeQL path-запроса, заполненный извлечённым AST диффа. Во время синтеза запроса кодирующий агент имеет доступ к инструментам для взаимодействия с RAG-базой данных и языковым сервером CodeQL. Впоследствии запрос может использоваться для мультивариантного анализа, регрессионного тестирования или в качестве руководства при написании CodeQL-запросов.
Примечание — В статье использовалась версия CodeQL 2.22.2. Однако можно использовать любую версию (и язык). QLCoder хранит QL-пакеты локальной версии CodeQL в векторной базе данных. Пути настраиваются в .env.
Загрузите подходящую версию пакета CodeQL Action со страницы релизов CodeQL Action.
Для последней версии: Посетите последний релиз и загрузите подходящий пакет для вашей ОС:
codeql-bundle-osx64.tar.gz для macOScodeql-bundle-linux64.tar.gz для LinuxДля конкретной версии (например, 2.22.2):
Перейдите на страницу релизов CodeQL Action, найдите релиз с тегом codeql-bundle-v2.22.2 и загрузите подходящий пакет для вашей платформы.
Распакуйте в ~/codeql (или в другой путь — обновите CODEQL_HOME в .env соответствующим образом):
tar -xzf codeql-bundle-<platform>.tar.gz -C ~/
Клонируйте MCP-сервер CodeQL LSP и соберите его.
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
Заполните ваш API-ключ и пути CodeQL в .env:
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. Это клонирует репозиторий на коммите с ошибкой и генерирует дифф исправления.
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 из файла (по одному ID CVE в строке)
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
# принудительная регенерация существующих диффов
docker compose run --rm app python3 scripts/get_cve_repos.py --cve CVE-2018-9159 --force
Базы данных создаются с --build-mode=none — инструментарий сборки не требуется.
# для создания баз данных CodeQL для конкретной CVE
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.
# для создания баз данных CodeQL для всех полученных репозиториев CVE
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 хранит QL-пакеты локальной версии CodeQL в векторной базе данных. Пути настраиваются в .env.
Загрузите подходящую версию пакета CodeQL Action со страницы релизов CodeQL Action.
Для последней версии: Посетите последний релиз и загрузите подходящий пакет для вашей ОС:
codeql-bundle-linux64.tar.gz для LinuxДля конкретной версии (например, 2.22.2):
Перейдите на страницу релизов CodeQL Action, найдите релиз с тегом codeql-bundle-v2.22.2 и загрузите подходящий пакет для вашей платформы.
После загрузки распакуйте архив в корневом каталоге проекта:
tar -xzf codeql-bundle-<platform>.tar.gz
Это должно создать подкаталог codeql/ с исполняемым файлом codeql внутри.
Добавьте путь к этому исполняемому файлу в переменную окружения PATH:
export PATH="$PWD/codeql:$PATH"
Клонируйте MCP-сервер CodeQL LSP и соберите его.
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
Заполните ваш API-ключ и пути CodeQL в .env:
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. Это клонирует репозиторий на коммите с ошибкой и генерирует дифф исправления.
python3 scripts/get_cve_repos.py --cve CVE-2025-27818
# или несколько сразу:
python3 scripts/get_cve_repos.py --cves CVE-2025-27818,CVE-2025-0851
# обработка CVE из файла (по одному ID CVE в строке)
python3 scripts/get_cve_repos.py --cve-file cves.txt
# обработка всех CVE
python3 scripts/get_cve_repos.py --all
# принудительная регенерация существующих диффов
python3 scripts/get_cve_repos.py --cve CVE-2018-9159 --force