cisco-foundation-ai/vulnerability-localization-benchmark
GitHub: cisco-foundation-ai/vulnerability-localization-benchmark
一个由 Cisco 推出的智能体基准测试,通过 500 个真实漏洞评估 AI 模型在代码库中定位安全漏洞的能力。
Stars: 2 | Forks: 0
# 漏洞定位基准测试
[](CODE_OF_CONDUCT.md)
[](https://opensource.cisco.com)
## 关于本项目
漏洞定位基准测试(Vulnerability Localization Benchmark)是一个智能体基准测试,用于评估 AI 模型在代码库级别的漏洞定位能力。给定一个漏洞描述和对代码库的只读终端访问权限,模型必须探索代码库并识别出包含安全漏洞的文件。
**核心特性:**
- 来自公开 GitHub 安全公告的 500 个真实漏洞
- 两阶段评估:阶段 A(查找漏洞)和阶段 B(确认修复)
- 多生态系统覆盖:npm、pip、maven、go、rust、composer
- Docker 沙箱化评估环境
- 通过 MD5 校验数据集确保可复现性
与静态代码理解基准测试不同,漏洞定位基准测试通过基于终端的交互,在真实的代码库探索环境中衡量端到端的定位性能。
📄 **技术报告**(即将发布) | arXiv(即将发布)
## 快速开始
### 前置条件
- Python 3.11 或更高版本
- Docker(用于沙箱化评估)
- 支持 OpenAI 兼容 API 的模型服务器(例如 vLLM)
```
# 验证 Python 版本
python3 --version
# 验证 Docker 安装
docker --version
```
### 安装
1. 克隆代码库
git clone https://github.com/cisco-foundation-ai/vulnerability-localization-benchmark.git
cd vulnerability-localization-benchmark
2. 安装包
pip install -e .
3. 构建沙箱 Docker 镜像
docker build -t vulnerability-localization-benchmark-sandbox .
4. 下载并验证数据集
python data/downloader_and_verifier.py --source-dir /path/to/dataset/
这会将所有 500 个代码库对下载到 `data/ghsa-vulns/{alpha_id}/` 中,并验证 MD5 校验和。
## 用法
### 运行评估
1. 启动您的模型服务器(以 vLLM 为例):
CUDA_VISIBLE_DEVICES=0 python -m vllm.entrypoints.openai.api_server \
--model /path/to/model \
--served-model-name your-model \
--host 0.0.0.0 --port 8200 \
--dtype bfloat16 --gpu-memory-utilization 0.9 \
--max-model-len 32768 --tensor-parallel-size 1 \
--trust-remote-code
2. 运行阶段 A 评估(包含漏洞的代码库):
PYTHONPATH=src python3 -m vulnerability_localization_benchmark.cli \
--config configs/default.yaml \
--api-base http://localhost:8200/v1 \
--model-name your-model \
--runner vllm \
--output-dir results/my-run \
--phases a \
--workers 16
3. 运行阶段 B 评估(已修复的代码库):
PYTHONPATH=src python3 -m vulnerability_localization_benchmark.cli \
--config configs/default.yaml \
--api-base http://localhost:8200/v1 \
--model-name your-model \
--runner vllm \
--output-dir results/my-run \
--phases b \
--workers 16
### 评估协议
**阶段 A (pre_push):** 模型在拥有终端访问权限(15 次工具调用预算)的情况下探索包含漏洞的代码库,然后提交其认为包含漏洞的文件。基于 File F1 与真实标签进行评分。
**阶段 B (post_push):** 模型在相同协议下探索已修复的代码库。应声明“未发现漏洞”。基于真阴性率进行评分。
### 数据集
跨越 6 个生态系统的 500 个真实漏洞。其中 78% 已分配 CVE。
| 严重性 | 数量 | CWE 类型 | 生态系统 |
|----------|-------|-----------|------------|
| High | 219 | 147 个唯一 | npm, pip, maven, go, rust, composer |
| Medium | 194 |
| Critical | 57 |
| Low | 30 |
📄 有关详细的数据集文档,包括数据字段、偏差、统计信息和许可,请参阅 [DATASET_CARD.md](DATASET_CARD.md)。
#### 漏洞示例
**Critical:签名绕过 ([CVE-2024-32962](https://nvd.nist.gov/vuln/detail/CVE-2024-32962))**
- **代码库**: node-saml/xml-crypto (npm/JavaScript)
- **CWE-347**: 加密签名的不当验证
- **真实标签 (Ground Truth)**: `src/signed-xml.ts`(单个文件)
- **挑战**: 默认配置不检查签名者授权,仅检查签名有效性
**Medium:互斥锁不健全**
- **代码库**: Amanieu/parking_lot (rust)
- **CWE-362**: 使用共享资源进行并发执行且同步不当
- **真实标签 (Ground Truth)**: `lock_api/src/lib.rs`, `lock_api/src/mutex.rs`, `lock_api/src/rwlock.rs`(3 个文件)
- **挑战**: 锁实现中的数据竞争影响多个同步原语
#### 数据集统计
**严重性分布:**
| 严重性 | 数量 |
|----------|-------|
| High | 219 |
| Medium | 194 |
| Critical | 57 |
| Low | 30 |
**Top CWEs (147 个唯一):**
| CWE | 数量 |
|-----|-------|
| CWE-400 (Resource Exhaustion) | 53 |
| CWE-20 (Improper Input Validation) | 45 |
| CWE-200 (Information Exposure) | 27 |
| CWE-22 (Path Traversal) | 27 |
| CWE-770 (Allocation without Limits) | 23 |
**Top 代码库:**
| 代码库 | 数量 |
|-----------|-------|
| mmaitre314/picklescan | 21 |
| undertow-io/undertow | 14 |
| kubernetes/kubernetes | 11 |
| vyperlang/vyper | 10 |
| keycloak/keycloak | 10 |
**许可证分布:**
| 许可证 | 数量 | 百分比 |
|---------|-------|------------|
| Apache-2.0 | 241 | 48.2% |
| MIT | 161 | 32.2% |
| Other | 46 | 9.2% |
| GPL-3.0 | 15 | 3.0% |
| LGPL | 12 | 2.4% |
| MPL-2.0 | 12 | 2.4% |
| BSD-3-Clause | 5 | 1.0% |
| Creative Commons | 4 | 0.8% |
| ISC | 2 | 0.4% |
| GPL-2.0 | 1 | 0.2% |
| AGPL-3.0 | 1 | 0.2% |
所有代码库保留其原始开源许可证。漏洞状态和修复状态之间没有许可证变更。“Other”类别包括双重许可的 crate 和不太常见的许可证(例如 MIT OR Apache-2.0, EPL-2.0, BSD-2-Clause)。有关每个代码库的许可证信息,请参阅 `data/manifest.csv`;有关完整的归属要求,请参阅 `NOTICE` 文件。
*注意:许可证数据通过 ScanCode 和 GitHub Licensee 工具验证。某些条目具有双重许可证(例如 EPL-2.0 OR Apache-2.0),可以使用其中任意一种。*
**每个条目提供:**
- `pre_push.zip` — 处于漏洞提交节点的代码库(阶段 A 输入)
- `post_push.zip` — 合并修复后的代码库(阶段 B 输入)
- `ground_truth_files` — 安全补丁修改过的代码文件(不包括测试和非代码文件)
- `cwe_description` — 通用的 CWE 定义(用于评估提示词)
### CLI 选项
| 标志 | 描述 |
|------|-------------|
| `--config` | YAML 配置文件路径(默认:`configs/default.yaml`) |
| `--api-base` | 模型 endpoint URL |
| `--model-name` | 由 vLLM 提供的模型名称 |
| `--runner` | `vllm_antares` / `vllm` / `vllm_qwen_3_5` / `vllm_gemma_4` |
| `--output-dir` | 写入结果和追踪日志的目录 |
| `--phases` | `a`, `b`, 或 `ab` |
| `--n-limit` | 评估的最大条目数(0 = 全部) |
| `--workers` | 并行工作进程数(默认为 1) |
| `--resume` | 跳过已有结果的条目 |
| `--permissive` | 禁用命令验证(沙箱已隔离) |
### 模型运行器
| 运行器 | Endpoint | 用例 |
|--------|----------|----------|
| `vllm` | `/v1/chat/completions` | 具有原生工具调用功能的通用模型 |
| `vllm_antares` | `/v1/completions` | 带有内置推理能力的 Antares 模型 |
| `vllm_qwen_3_5` | `/v1/chat/completions` | 带有工具解析器的 Qwen 3.5 |
| `vllm_gemma_4` | `/v1/chat/completions` | 带有工具解析器的 Gemma 4 |
有关更多示例和高级用法,请参阅[完整文档](https://github.com/cisco-foundation-ai/vulnerability-localization-benchmark/wiki)。
### 输出格式
对于每个条目,会有两个文件被写入 `--output-dir`:
- `{alpha_id}_phase_{a|b}.json` — 分数、元数据、提交的文件
- `{alpha_id}_phase_{a|b}_trace.json` — 完整的对话追踪日志
最终的总分数将保存到 `aggregate.json`。
### 智能体行为
- 每个条目有 15 次终端调用预算
- 总共最多 20 轮(生成周期)
- 如果模型连续 3 轮未进行工具调用 → 强制停止
- 如果终端预算耗尽 → 提示进行提交
- frequency_penalty=0.3 防止重复循环
- `--permissive` 跳过命令验证(推荐使用 — 容器是沙箱化的)
- Docker 容器构建时间:平均 0.41 秒,中位数 0.30 秒,最大 1.0 秒
### 关键参数
来自 `configs/default.yaml`:
| 参数 | 数值 | 原因 |
|-----------|-------|-----|
| max_tokens | 16384 | 每轮生成上限 |
| max_turns | 20 | 智能体循环预算 |
| terminal_calls | 15 | 每个条目的预算 |
### Antares 特定配置
对于 `vllm_antares` 运行器:
| 参数 | 数值 | 原因 |
|-----------|-------|-----|
| Endpoint | `/v1/completions` | 原始文本,非 chat API |
| temperature | 0.3 | 低方差以进行评估 |
| frequency_penalty | 0.3 | 防止重复循环 |
| stop tokens | `<\|end_of_text\|>`, `<\|start_of_role\|>` | Antares 特殊 token |
| Generation prefix | `\n` | 触发推理模式 |
其他运行器(Qwen、Gemma)使用 `/v1/chat/completions` — vLLM 通过 `--tool-call-parser` 处理模板格式。Antares 运行器使用 `/v1/completions` 以及其自身的模板,并通过 `` 前缀实现内置推理。
### 代码库结构
```
├── pyproject.toml # pip-installable (hatchling)
├── Dockerfile # vulnerability-localization-benchmark-sandbox image (ubuntu:24.04)
├── configs/default.yaml # All tunable params
├── data/
│ ├── manifest.csv # 500 entries, 26 columns
│ ├── downloader_and_verifier.py # Downloads + MD5-verifies all zips
│ ├── deleted-repo-mirrors/ # Zips for repos no longer on GitHub
│ │ └── GHSA-4999-659w-mq36/ # pre_push.zip, post_push.zip
│ └── ghsa-vulns/ # [gitignored] downloaded zips
│ └── {alpha_id}/
│ ├── pre_push.zip # Vulnerable codebase (Phase A)
│ └── post_push.zip # Patched codebase (Phase B)
├── src/vulnerability_localization_benchmark/
│ ├── __init__.py
│ ├── cli.py # Entrypoint, orchestrate workers
│ ├── agent.py # Agent loop (runner-agnostic)
│ ├── sandbox.py # Docker container per entry
│ ├── scoring.py # File F1, TNR, aggregation
│ └── model_runners/
│ ├── base.py # Shared system prompt + tools schema
│ ├── vllm.py # Generic vLLM /v1/chat/completions
│ ├── vllm_antares.py # Antares: raw /v1/completions
│ ├── vllm_qwen_3_5.py # Qwen 3.5: tool calling
│ └── vllm_gemma_4.py # Gemma 4: tool calling
└── results/ # [gitignored] eval output
```
### 网站
从 `docs/` 提供的 GitHub Pages 排行榜:
```
docs/
├── index.html # Interactive single-page leaderboard (all CSS/JS inline)
└── model-performance.json # Eval results data
```
## 参与排行榜
我们欢迎将新的模型结果提交到[公开排行榜](https://cisco-foundation-ai.github.io/vulnerability-localization-benchmark/)。要添加您的模型:
1. 按照上述的[评估说明](#usage),在基准测试上**评估您的模型**。这将生成一个针对单个模型的结果文件。
2. **Fork** 本代码库。
3. 将您的模型条目**添加**到 `docs/model-performance.json` 中。每个条目遵循以下 schema:
{
"model": "Your-Model-Name",
"type": "frontier", // "frontier" or "open-weights"
"size": "7B", // parameter count; "—" for closed frontier models
"file_f1": 0.123, // Phase A: File F1 (0–1)
"precision": 0.234,
"recall": 0.201,
"true_negative_rate": 0.567, // Phase B (optional)
"false_positive_rate": 0.089,
"submitted_nothing_rate": 0.145
}
4. **提交一个 Pull Request**,包含您添加的目以及对您评估设置的简短描述(模型版本、测试框架、日期)。
### ✅ 结果验证
为了保持排行榜的可信度,提交的内容应包含足够的细节以便复现该运行:
- 确切的模型标识符/版本和推理设置(temperature、reasoning effort 等)。
- 使用的测试框架(本代码库的 CLI,或有相关文档说明的同等工具)。
- 原始评估输出(附加到 PR 中或提供链接),以便维护者抽查报告的指标。
维护者可能会在合并前要求提供原始的预测日志。一旦验证通过,您的模型将出现在在线排行榜上。
## 路线图
请参阅[未解决的问题](https://github.com/cisco-foundation-ai/vulnerability-localization-benchmark/issues)了解提议的功能和已知问题。
## 许可证
基于 Apache License 2.0 分发。有关更多信息,请参阅 [LICENSE](LICENSE)。
**数据集许可:** 本基准测试数据集使用了公开的漏洞数据和保留其原始许可证的开源代码库。有关归属和许可证合规性要求,请参阅 [NOTICE](NOTICE)。
## 联系方式
Cisco Foundation AI - [GitHub](https://github.com/cisco-foundation-ai)
项目链接:[https://github.com/cisco-foundation-ai/vulnerability-localization-benchmark](https://github.com/cisco-foundation-ai/vulnerability-localization-benchmark)
如有关于数据源、归属或授权的问题,请提交一个 [issue](https://github.com/cisco-foundation-ai/vulnerability-localization-benchmark/issues)。
## 致谢
- 发现并负责任地披露这些漏洞的安全研究人员
- 维护安全公告数据库的 GitHub 团队
- 所有代码库包含在本基准测试中的开源维护者
标签:Petitpotam, 请求拦截, 逆向工具