
Автоматизированный конвейер анализа безопасности, который выполняет запросы CodeQL в репозиториях GitHub и использует LLM для классификации и фильтрации истинных уязвимостей от ложных срабатываний.
Подробный обзор исследования и мотивации Vulnhalla — в официальном блоге CyberArk Threat Research:
Vulnhalla: Выбирая истинные уязвимости из стога сена CodeQL
Перед началом убедитесь, что у вас есть:
Python 3.10 – 3.13 (рекомендуется Python 3.11 или 3.12)
CodeQL CLI
codeql находится в PATH, или укажите путь в .env (см. Шаг 2)(Необязательно) Токен GitHub API
Ключ API LLM
Вся конфигурация находится в одном файле: .env
git clone https://github.com/cyberark/Vulnhalla
cd Vulnhalla
.env.example в .env:cp .env.example .env # macOS / Linux
Copy-Item .env.example .env # Windows (PowerShell)
.env и заполните свои значения:Пример для OpenAI:
CODEQL_PATH=codeql
GITHUB_TOKEN=ghp_your_token_here
PROVIDER=openai
MODEL=gpt-4o
OPENAI_API_KEY=your-api-key-here
LLM_TEMPERATURE=0.2
LLM_TOP_P=0.2
# Опционально: настройки журналирования
LOG_LEVEL=INFO # DEBUG, INFO, WARNING, ERROR
LOG_FILE= # Опционально: путь к файлу журнала (например, logs/vulnhalla.log)
LOG_FORMAT=default # default или json
# LOG_VERBOSE_CONSOLE=false # Если true, WARNING/ERROR используют полный формат (timestamp - logger - level - message)
📖 Полную справочную информацию по конфигурации: см. Справочник по конфигурации ниже — все поддерживаемые провайдеры (OpenAI, Azure, Gemini, Bedrock), обязательные/опциональные переменные и подробные примеры.
Windows (PowerShell):
# Показать доступные версии Python
py -0p
# Выберите любую поддерживаемую версию: 3.10 / 3.11 / 3.12 / 3.13
py -3.12 -m pip install --user -U pipx
py -3.12 -m pipx ensurepath
# Закройте и снова откройте терминал (обязательно)
pipx install poetry
poetry --version
macOS / Linux:
# Проверьте версию Python
python3 --version
# Используйте любую поддерживаемую версию: 3.10 / 3.11 / 3.12 / 3.13
python3 -m pip install --user -U pipx
python3 -m pipx ensurepath
# Перезапустите терминал (обязательно)
pipx install poetry
poetry --version
Windows (PowerShell):
# Выберите одну поддерживаемую версию, которая у вас есть: 3.10 / 3.11 / 3.12 / 3.13
poetry env use 3.12 # Принудительно укажите Poetry поддерживаемую версию Python, если у вас установлено несколько версий
poetry install
poetry run vulnhalla-setup
macOS / Linux:
# Выберите одну поддерживаемую версию, которая у вас есть: 3.10 / 3.11 / 3.12 / 3.13
poetry env use 3.12 # Принудительно укажите Poetry поддерживаемую версию Python, если у вас установлено несколько версий
poetry install
poetry run vulnhalla-setup
# Анализ конкретного репозитория, например:
poetry run vulnhalla redis/redis
# Повторная загрузка, даже если база данных уже существует
poetry run vulnhalla redis/redis --force
# Показать справку
poetry run vulnhalla --help
Это автоматически:
output/results/Если у вас уже есть база данных CodeQL на диске (например, созданная вручную или из предыдущего запуска), вы можете пропустить этап получения с GitHub, используя флаг --local / -l:
Windows (PowerShell):
poetry run vulnhalla --local C:\path\to\my-codeql-db
macOS / Linux:
poetry run vulnhalla --local /path/to/my-codeql-db
Примечание: Флаг
--localожидает каталог базы данных CodeQL, а не папку с исходным кодом. Убедитесь, что в папке есть файлcodeql-database.yml.
# Открыть интерфейс для просмотра существующих результатов (без запуска анализа)
poetry run vulnhalla-ui
# Проверить конфигурацию: CodeQL, LLM, журналирование (без запуска анализа)
poetry run vulnhalla-validate
# Список проанализированных репозиториев и количество проблем в них
poetry run vulnhalla-list
# Запустить пример конвейера (анализирует videolan/vlc и redis/redis)
poetry run vulnhalla-example
Vulnhalla включает полнофункциональный пользовательский интерфейс для просмотра и изучения результатов анализа.
poetry run vulnhalla-ui
Интерфейс отображает две панели в верхней части и панель управления внизу:
Верхняя часть (рядом, с изменяемыми размерами):
Левая панель (Список проблем):
Правая панель (Детали):
Нижняя панель управления:
↑/↓ - Навигация по списку проблем (построчно)Tab / Shift+Tab - Переключение фокуса между панелямиEnter - Показать детали выбранной проблемы/ - Фокус на поле поиска (в левой панели)Esc - Очистить поиск и вернуть фокус на таблицу проблемr - Перезагрузить результаты с диска[ / ] - Изменить размер левой/правой панели (настройка разделителя)q - Выйти из приложения[ для перемещения разделителя влево, ] для перемещения вправоПосле запуска конвейера результаты организованы в output/results/<LANG>/<ISSUE_TYPE>/:
output/results/c/Copy_function_using_source_size/
├── 1_raw.json # Исходные данные проблемы CodeQL
├── 1_final.json # Диалог и классификация LLM
├── 2_raw.json
├── 2_final.json
└── ...
Каждый файл *_final.json содержит:
Каждый файл *_raw.json содержит:
output/databases/<LANG>/<ORG>/<REPO>)CodeQL CLI не найден:
Укажите CODEQL_PATH в файле .env полный путь к исполняемому файлу CodeQL.
В Windows: путь должен заканчиваться на .cmd (например, C:\path\to\codeql\codeql.cmd).
Лимиты запросов GitHub:
Укажите GITHUB_TOKEN в файле .env (получить токен можно на https://github.com/settings/tokens).
Проблемы с LLM:
Проверьте ключи API в файле .env — они должны соответствовать выбранному провайдеру.
Ошибки импорта в UI:
Убедитесь, что вы запускаете из корневого каталога проекта, или используйте python examples/ui_example.py, который настраивает пути.
Вся конфигурация управляется через переменные окружения в файле .env. Вот полный справочник:
OpenAI:
| Переменная | Описание |
|---|---|
OPENAI_API_KEY | Ваш ключ API OpenAI с platform.openai.com |
Azure OpenAI:
Gemini (Google):
| Переменная | Описание |
|---|---|
GOOGLE_API_KEY | Ваш ключ API Google из Google AI Studio |
AWS Bedrock:
* Аутентификация: Используйте AWS_PROFILE или AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY (+ опционально AWS_SESSION_TOKEN для STS).
Пример .env для Bedrock (SSO):
PROVIDER=bedrock
MODEL=anthropic.claude-3-5-sonnet-20241022-v2:0
AWS_REGION_NAME=us-east-1
AWS_PROFILE=your-profile
⚠️ Предварительные требования:
- Учётные данные AWS должны быть настроены (SSO, профиль IAM или ключи доступа) с разрешениями на вызов моделей Bedrock
- Для пользователей SSO: Выполните
aws sso login --profile your-profileперед использованием Vulnhalla🔧 Важно — Выбор модели: При выборе модели Bedrock убедитесь, что она поддерживает вызов инструментов/функций (не все модели Bedrock это поддерживают). Вызов инструментов — ключевая часть рабочего процесса анализа Vulnhalla, поэтому выбор совместимой модели существенно влияет на функциональность и результаты. Совместимые модели включают: Claude 3.x, Mistral, Cohere Command R.
⚠️ Важно: Не увеличивайте
LLM_TEMPERATUREилиLLM_TOP_P, если вы полностью не понимаете последствий. Меньшие значения сохраняют модель стабильной и детерминированной, что критично для анализа безопасности. Более высокие значения могут привести к непоследовательности, творческому подходу или галлюцинациям модели.
📝 Примечание: Дополнительные примеры конфигурации см. в файле
.env.exampleв корне проекта.
Vulnhalla проверяет конфигурацию при запуске. Если обязательные переменные отсутствуют или некорректны, вы увидите понятные сообщения об ошибках, указывающие, что нужно исправить.
Типичные ошибки проверки:
PROVIDER — поддерживаемые значения)CODEQL_PATH задан, но файл не существует)LLM использует следующие коды статусов:
Интерфейс сопоставляет их с:
1337 → "True Positive"1007 → "False Positive"7331 или 3713 → "Needs More Data"Проект включает базовую инфраструктуру тестирования с использованием pytest:
# Запустить все тесты
poetry run pytest
# Запустить с подробным выводом
poetry run pytest -v
Набор тестов включает дымовые тесты для проверки корректности настройки тестовой инфраструктуры.
Проект использует mypy для статической проверки типов:
poetry run mypy src
Проверка типов настраивается в pyproject.toml в разделе [tool.mypy].
Конфигурация использует консервативный базовый уровень с переопределениями для отдельных модулей, что позволяет постепенно внедрять проверку.
Управление зависимостями осуществляется через Poetry в pyproject.toml:
requests - HTTP-запросы для API GitHubpySmartDL - Умный менеджер загрузок для баз данных CodeQLlitellm - Унифицированный интерфейс LLM, поддерживающий несколько провайдеровpython-dotenv - Управление переменными окруженияPyYAML - Разбор YAML для файлов пакетов CodeQLtextual - Фреймворк для терминального UIpytest - Фреймворк для тестирования (зависимость разработки)mypy - Статический анализатор типов (зависимость разработки)Запросы CodeQL организованы в data/queries/<LANG>/:
issues/ - Запросы на обнаружение проблем безопасностиtools/ - Вспомогательные запросы (деревья функций, классы, глобальные переменные, макросы)Каждый каталог содержит файл qlpack.yml, определяющий пакет CodeQL.
Copyright (c) 2025 CyberArk Software Ltd. Все права защищены.
Этот репозиторий лицензирован под Apache License, Version 2.0 — подробности см. в LICENSE.txt.
Мы приветствуем любые формы вклада в этот репозиторий. Инструкции по началу работы и описание наших рабочих процессов разработки см. в руководстве по внесению вклада.
Просим прочитать и соблюдать наш Кодекс поведения. Мы стремимся создать гостеприимную и инклюзивную среду для всех участников.
Свяжитесь с нами через GitHub Issues, если у вас есть предложения по функциям или вопросы по проекту.
| Переменная | Требуется для | Описание |
|---|
CODEQL_PATH | Все | Путь к исполняемому файлу CodeQL. По умолчанию codeql, если CodeQL находится в PATH. Укажите полный путь, если не в PATH (например, C:\path\to\codeql\codeql.cmd в Windows) |
PROVIDER | Все | Провайдер LLM: openai, azure, gemini, bedrock, anthropic, mistral, groq, openrouter, ollama и т.д. |
MODEL | Все | Имя модели (например, gpt-4o, gpt-4-turbo, gemini-2.5-flash) |
| Переменная | Описание |
|---|
AZURE_OPENAI_API_KEY или AZURE_API_KEY | Ваш ключ API Azure OpenAI |
AZURE_OPENAI_ENDPOINT или AZURE_API_BASE | URL конечной точки Azure OpenAI (например, https://your-resource.openai.azure.com) |
AZURE_OPENAI_API_VERSION или AZURE_API_VERSION | Версия API (по умолчанию: 2024-08-01-preview) |
| Переменная | Обязательна | Описание |
|---|
AWS_REGION_NAME | Да | Регион AWS (например, us-east-1, us-west-2) |
AWS_PROFILE | Нет* | Имя профиля AWS для аутентификации SSO/файла учётных данных |
AWS_ACCESS_KEY_ID | Нет* | Ключ доступа AWS (если не используется профиль) |
AWS_SECRET_ACCESS_KEY | Нет* | Секретный ключ AWS (если не используется профиль) |
AWS_SESSION_TOKEN | Нет | Токен сессии для временных учётных данных STS |
| Переменная | По умолчанию | Описание |
|---|
GITHUB_TOKEN | - | Токен GitHub API для повышения лимитов запросов. Получить: GitHub Settings > Tokens |
GITHUB_API_URL | https://api.github.com | URL API GitHub. Для GitHub Enterprise укажите URL API вашего сервера (например, https://github.your-company.com/api/v3) |
GITHUB_SSL_VERIFY | true | Проверка SSL-сертификата. Установите false для GitHub Enterprise с самоподписанными или внутренними сертификатами ЦС |
LLM_TEMPERATURE | 0.2 | Температура LLM (0.0-2.0). Ниже = более детерминировано. Рекомендуется: оставить 0.2 |
LLM_TOP_P | 0.2 | Top-p выборка LLM (0.0-1.0). Ниже = более сфокусировано. Рекомендуется: оставить 0.2 |
LOG_LEVEL | INFO | Уровень журналирования: DEBUG, INFO, WARNING, ERROR. Влияет на подробность вывода в консоль |
LOG_FILE | - | Опциональный путь к файлу журнала (например, logs/vulnhalla.log). Если задан, журналы пишутся и в консоль, и в файл. Файловое журналирование использует уровень DEBUG для детального вывода |
LOG_FORMAT | default | Стиль форматирования журнала: default (читаемый человеком) или json (структурированный JSON) |
LOG_VERBOSE_CONSOLE | false | Если true, WARNING/ERROR/CRITICAL используют полный формат (timestamp - logger - level - message). По умолчанию: WARNING/ERROR используют простой формат (LEVEL - message), INFO всегда минимален (только message) |
THIRD_PARTY_LOG_LEVEL | ERROR | Уровень журналирования для сторонних библиотек (LiteLLM, urllib3, requests). Варианты: DEBUG, INFO, WARNING, ERROR. По умолчанию подавляет большую часть стороннего шума |