一个用于评估LLM智能体在修复真实世界安全漏洞方面表现的基准测试。智能体在沙盒化的Docker容器中运行,并根据维护者的安全测试套件进行评分。
.env文件中)设置OPENAI_API_KEY、ANTHROPIC_API_KEY和/或POOLSIDE_API_KEY安装依赖项:
pip install poetry
poetry install
每个任务位于tasks/{CVE-ID}/目录下,包含以下内容:
tasks/CVE-2026-33175/
├── meta.json # GHSA ID, CWE, CVSS, 仓库URL, 漏洞版本和修复版本的SHA
├── setup.sh # 克隆仓库,检出漏洞版本SHA,安装依赖
├── run_tests.sh # 将test_security.py注入仓库并运行pytest
├── test_security.py # 安全测试(对漏洞代码预期失败,对修复版本通过)
├── advisory.md # 完整GHSA安全公告(最丰富的提示)
├── diagnose.md # 仅行为描述——不包含文件名或函数名
├── locate.md # 仅文件和函数——不包含漏洞描述
└── Dockerfile # 可选;仅在任务需要额外系统依赖时存在
meta.json示例:
{
"ghsa_id": "GHSA-xxxx-xxxx-xxxx",
"cwe": ["CWE-287"],
"cvss": 9.1,
"repo": {
"url": "https://github.com/org/project",
"vulnerable_sha": "abc123^",
"fixed_sha": "abc123"
}
}
setup.sh是幂等的,可以安全地重新运行。test_security.py在运行期间对智能体保持隐藏,仅在智能体完成工作后注入。
python build.py
这将构建:
cve-bench/base)——包含Python 3.12、git、poetry和测试框架。cve-bench/{task-id})——基于基础镜像,复制任务目录并运行setup.sh。选项:
# 仅构建特定任务
python build.py --task CVE-2026-33175 CVE-2026-42561
# 跳过重新构建基础镜像
python build.py --skip-base
任务镜像并行构建(最多5个工作进程)。如果任务目录包含Dockerfile,则使用该文件代替通用的docker/task.Dockerfile。
在运行基准测试之前,请验证每个任务的安全测试能否正确区分漏洞代码和修复后的代码:
python validate.py
对于每个任务,此命令在任务容器内执行三个阶段:
| 阶段 | 检查内容 |
|---|---|
| vulnerable(漏洞版本) | 安全测试必须在漏洞SHA上失败(或预期失败) |
| fixed(修复版本) | 安全测试必须在修复SHA上通过 |
| regression(回归测试) | 非安全测试必须在修复SHA上通过 |
结果以实时表格形式显示。如果任何任务的任何阶段失败,退出码为1。
# 仅验证特定任务
python validate.py --task CVE-2026-33175 GHSA-r758-8hxw-4845
# 跳过验证前重新构建镜像
python validate.py --skip-build
python benchmark.py --model openai:gpt-5.5 poolside:laguna-m.1 --prompt-type advisory
选项:
支持的提供商:
每次运行都会在results/目录下生成一个JSON结果文件:
results/{task-id}__{provider}:{model}__{prompt-type}.json
现有结果文件会自动跳过。运行并发执行(最多20个工作进程),每个提供商有速率限制(每个提供商一次仅一个活跃请求),以避免429错误。
每个结果文件是一个具有以下结构的JSON对象:
{
"cve_id": "CVE-2026-33175",
"model_id": "openai:gpt-5.5",
"prompt_type": "advisory",
"timestamp": "2026-05-01T12:00:00",
"model_duration_s": 142.3,
"test_duration_s": 8.1,
"turns": [
{
"tool_calls_and_results": [...],
"input_tokens": 12400,
"output_tokens": 310
}
],
"tests": [
{
"kind": "security",
"name": "test_email_verified",
"outcome": "passed"
}
]
}
tests[].kind要么是"security"(来自test_security.py),要么是"regression"(来自项目自身的测试套件)。仅当所有安全测试都通过且没有回归测试失败时,才认为该次运行成功解决。
python generate_charts.py
读取results/目录下的所有结果文件,并将SVG图表写入docs/images/charts/。需要Chrome/Chromium以支持Bokeh的无头导出(通过chromedriver-binary)。
测试框架在每个Docker容器内以python -m harness.run的形式运行。它负责加载提示、运行智能体循环并写入结果文件。
src/harness/
├── run.py # 入口点;解析参数,连接组件,调用BenchmarkRunner
├── client/
│ ├── factory.py # 解析provider:model-id,返回对应的LLMClient
│ ├── _client.py # 抽象LLMClient,ToolCall和LLMTurn数据类
│ ├── anthropic.py # Anthropic SDK集成
│ └── oai.py # OpenAI SDK集成(也用于Poolside)
├── agent/
│ ├── core.py # 智能体循环:调用客户端,分发工具调用,线程消息
│ └── runner.py # 包装Agent,跟踪时间和轮次列表
├── bench/
│ ├── runner.py # 协调设置→智能体→安全测试→回归测试
│ ├── result.py # BenchmarkResult和TestResult数据类,JSON序列化
│ └── repository.py # 将结果文件写入磁盘
└── task/
├── tools.py # 工具实现:ListFiles, ReadFile, SearchInFiles,
│ # EditFile, CreateFile, DeleteFile, RunPytest
└── prompt_loader.py # 读取advisory.md / diagnose.md / locate.md
可供智能体使用的工具:
所有工具都会根据仓库根目录验证路径,以防止目录遍历。智能体无法访问test_security.py或git历史。
智能体循环最多运行20轮。如果达到轮次上限,则按原样记录运行,并仍然针对智能体离开仓库时的状态执行安全测试。
tasks/{CVE-ID}/并添加meta.json、setup.sh、run_tests.sh、test_security.py、advisory.md、diagnose.md、locate.md。setup.sh和run_tests.sh可执行(chmod +x)。python validate.py --task {CVE-ID}。python build.py --task {CVE-ID}。这项工作作为独立研究进行。在进行研究和准备本仓库时,我没有机构隶属关系。
@misc{gattipinheiro2026cvebench,
author = {Gatti Pinheiro, Giovanni},
title = {{CVE-Bench}: Benchmarking {LLM} Agents on Real-World Security Vulnerability Fixes},
year = {2026},
howpublished = {\url{https://giovannigatti.github.io/cve-bench}},
note = {Code available at \url{https://github.com/GiovanniGatti/cve-bench}}
}
MIT — 参见 LICENSE。
| 标志 | 描述 | 默认值 |
|---|
--model | 一个或多个provider:model-id字符串 | 所有已配置的模型 |
--prompt-type | advisory、diagnose、locate或任意组合 | 全部三种 |
--task | 一个或多个任务ID | 所有任务 |
--clean | 在启动前删除所选范围内的现有结果 | 关闭 |
| 提供商 | 格式 | API密钥环境变量 |
|---|
| OpenAI | openai:gpt-5.5 | OPENAI_API_KEY |
| Anthropic | anthropic:claude-haiku-4-5-20251001 | ANTHROPIC_API_KEY |
| Poolside | poolside:laguna-m.1 | POOLSIDE_API_KEY |
| 工具 | 描述 |
|---|
list_files | 列出仓库中的文件和目录 |
read_file | 读取文件内容,可选择行范围 |
search_in_files | 跨代码库进行正则搜索,可选文件通配符 |
edit_file | 替换现有文件中的行范围 |
create_file | 创建新文件 |
delete_file | 删除文件 |
run_pytest | 运行项目的测试套件;返回JSON报告 |