有关 Vulnhalla 研究与动机的详细概述,请参阅官方 CyberArk 威胁研究博客文章:
Vulnhalla: 从 CodeQL 浩如烟海的告警中提取真正的漏洞
开始之前,请确保已安装:
Python 3.10 – 3.13(推荐使用 Python 3.11 或 3.12)
CodeQL CLI
codeql 已加入 PATH,或者在 .env 中设置路径(见第 2 步)(可选)GitHub API 令牌
LLM API 密钥
所有配置都集中在单个文件 .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
# 选择任意支持的 Python: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
# 使用任意支持的 Python: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 # 若安装有多个 Python 版本,强制 Poetry 使用支持版本
poetry install
poetry run vulnhalla-setup
macOS / Linux:
# 选择一个您已安装的支持版本:3.10 / 3.11 / 3.12 / 3.13
poetry env use 3.12 # 若安装有多个 Python 版本,强制 Poetry 使用支持版本
poetry install
poetry run vulnhalla-setup
# 分析特定仓库,例如:
poetry run vulnhalla redis/redis
# 即使数据库已存在也重新下载
poetry run vulnhalla redis/redis --force
# 显示帮助
poetry run vulnhalla --help
这将自动:
output/results/如果您已有磁盘上的 CodeQL 数据库(例如手动创建或从之前的运行遗留),可以使用 --local / -l 标志跳过 GitHub 获取步骤:
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文件来验证。
# 打开 UI 查看现有结果(不运行分析)
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
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 未找到:
在 .env 文件中将 CODEQL_PATH 设置为 CodeQL 可执行文件的完整路径。
Windows 上:路径必须以 .cmd 结尾(例如 C:\path\to\codeql\codeql.cmd)。
GitHub 速率限制:
在 .env 文件中设置 GITHUB_TOKEN(从 https://github.com/settings/tokens 获取令牌)。
LLM 问题:
检查 .env 中的 API 密钥是否与所选提供商匹配。
UI 中的导入错误:
确保从项目根目录运行,或使用 python examples/ui_example.py(它会处理路径设置)。
所有配置通过 .env 文件中的环境变量进行管理。以下是完整参考:
| 变量 | 必需于 | 描述 |
|---|---|---|
CODEQL_PATH | 所有环境 | CodeQL 可执行文件路径。如果 CodeQL 已在 PATH 中,则默认值为 codeql。如果不在 PATH 中,请使用完整路径(例如 Windows 上为 C:\path\to\codeql\codeql.cmd) |
PROVIDER | 所有环境 | LLM 提供商:openai、azure、gemini、bedrock、anthropic、mistral、groq、openrouter、ollama 等 |
MODEL | 所有环境 | 模型名称(例如 gpt-4o、gpt-4-turbo、gemini-2.5-flash) |
OpenAI:
| 变量 | 描述 |
|---|---|
OPENAI_API_KEY | 您的 OpenAI API 密钥,来自 platform.openai.com |
Azure OpenAI:
| 变量 | 描述 |
|---|---|
AZURE_OPENAI_API_KEY 或 AZURE_API_KEY | 您的 Azure OpenAI API 密钥 |
AZURE_OPENAI_ENDPOINT 或 AZURE_API_BASE | 您的 Azure OpenAI 端点 URL(例如 https://your-resource.openai.azure.com) |
AZURE_OPENAI_API_VERSION 或 AZURE_API_VERSION | API 版本(默认:2024-08-01-preview) |
Gemini (Google):
| 变量 | 描述 |
|---|---|
GOOGLE_API_KEY | 您的 Google API 密钥,来自 Google AI Studio |
AWS Bedrock:
| 变量 | 必需 | 描述 |
|---|---|---|
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 凭证的会话令牌 |
* 认证:使用 AWS_PROFILE 或 AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY(+ 可选的 AWS_SESSION_TOKEN 用于 STS)。
Bedrock .env 示例(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 用户: 使用 Vulnhalla 前,请运行
aws sso login --profile your-profile🔧 重要 - 模型选择: 选择 Bedrock 模型时,请确保它支持工具调用/函数调用(并非所有 Bedrock 模型都支持)。工具调用是 Vulnhalla 分析流程的关键部分,因此选择兼容的模型对功能和结果有重大影响。兼容的模型包括:Claude 3.x、Mistral 或 Cohere Command R。