有关 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 文件中的环境变量进行管理。以下是完整参考:
OpenAI:
| 变量 | 描述 |
|---|---|
OPENAI_API_KEY | 您的 OpenAI API 密钥,来自 platform.openai.com |
Azure OpenAI:
Gemini (Google):
| 变量 | 描述 |
|---|---|
GOOGLE_API_KEY | 您的 Google API 密钥,来自 Google AI Studio |
AWS Bedrock:
* 认证:使用 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。
⚠️ 重要提示: 除非您完全理解其影响,否则不要提高
LLM_TEMPERATURE或LLM_TOP_P。较低的值可使模型保持稳定和确定,这对于安全分析至关重要。较高的值可能导致模型变得不稳定、富有创造性或产生幻觉结果。
📝 注意: 更多配置示例,请参阅项目根目录中的
.env.example文件。
Vulnhalla 在启动时会验证您的配置。如果缺少必需变量或无效,您将看到清晰的错误消息,指出需要修复的内容。
常见验证错误:
PROVIDER 了解支持的值)CODEQL_PATH 但文件不存在)LLM 使用以下状态码:
UI 将这些映射为:
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 - GitHub API 的 HTTP 请求pySmartDL - CodeQL 数据库的智能下载管理器litellm - 统一 LLM 接口,支持多个提供商python-dotenv - 环境变量管理PyYAML - CodeQL 包文件的 YAML 解析textual - 终端 UI 框架pytest - 测试框架(开发依赖)mypy - 静态类型检查器(开发依赖)CodeQL 查询组织在 data/queries/<LANG>/ 目录下:
issues/ - 安全问题检测查询tools/ - 辅助查询(函数树、类、全局变量、宏)每个目录包含一个 qlpack.yml 文件,用于定义 CodeQL 包。
版权所有 (c) 2025 CyberArk Software Ltd. 保留所有权利。
本仓库根据 Apache 许可证 2.0 版许可 - 有关详细信息,请参阅 LICENSE.txt。
我们欢迎各种形式的贡献。有关如何开始的说明以及开发工作流的描述,请参阅我们的 贡献指南。
请阅读并遵守我们的 行为准则。我们致力于为所有贡献者提供一个友好和包容的环境。
如果您有任何功能请求或项目问题,请随时通过 GitHub Issues 联系我们。
| 变量 | 必需于 | 描述 |
|---|
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) |
| 变量 | 描述 |
|---|
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) |
| 变量 | 必需 | 描述 |
|---|
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 设置 > 令牌 获取 |
GITHUB_API_URL | https://api.github.com | GitHub API URL。对于 GitHub 企业版,请设置为您的服务器 API URL(例如 https://github.your-company.com/api/v3) |
GITHUB_SSL_VERIFY | true | SSL 证书验证。对于使用自签名或内部 CA 证书的 GitHub 企业版,请设置为 false |
LLM_TEMPERATURE | 0.2 | LLM 温度(0.0-2.0)。越低越确定。建议保持为 0.2 |
LLM_TOP_P | 0.2 | LLM top-p 采样(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。默认值会抑制大多数第三方噪音 |