RealVuln Benchmark
收藏RealVuln Benchmark 数据集概述
数据集基本信息
- 数据集名称:RealVuln Benchmark
- 主要目的:一个用于评估安全扫描器在真实代码中检测真实漏洞能力的开放基准。主要评估指标为F2分数(0-100,召回率加权)。
- 核心问题:解决现有安全扫描器基准的不足,如使用合成测试用例、样本量小、方法论由供应商控制、缺乏可重用基础设施或标签不一致等问题。
- 设计原则:开放、可扩展,使用真实世界代码,提供机器可读的基准事实(含CWE映射),包含自动化评分引擎,并支持社区贡献。
数据集内容与规模
- 目标仓库数量:27个Python代码仓库。
- 总发现数:823个。
- 漏洞数:698个。
- 误报陷阱数:125个。
- 目标类型:全部为类型1(故意编写的漏洞应用程序),且作者身份均为
human_authored。 - 语言与框架:目前仅支持Python(涵盖Flask, Django, FastAPI, aiohttp, Tornado框架)。计划未来支持JavaScript/TypeScript、Go和Java。
数据结构与组织
目录结构
├── config/ │ └── cwe-families.json # 用于按类别度量的CWE分组 ├── ground-truth/{repo}/ground-truth.json # 标记漏洞的基准事实文件 ├── scan-results/{repo}/{scanner}/results.json # 扫描器输出文件(Semgrep JSON格式) ├── parsers/ # 将扫描器输出规范化为NormalisedFinding ├── scorer/ │ ├── matcher.py # 发现匹配逻辑(文件 + CWE + 行容差) │ └── metrics.py # 包含F2、精确率、召回率等度量的ScoreCard ├── score.py # 为单个仓库评分(CLI、JSON、Markdown输出) ├── dashboard.py # 多扫描器多仓库HTML仪表板(Plotly) ├── validate_gt.py # 基准事实模式验证器 └── reports/ # 生成的输出(每个仓库的记分卡被git忽略) ├── dashboard.html # 交互式跨扫描器比较(已提交) └── dashboard.json # 机器可读的分数(已提交)
基准事实模式
每个目标仓库都有一个基准事实清单,固定指向特定的提交SHA。
- 关键字段:
schema_version: 模式版本。repo_id,repo_url: 仓库标识和URL。commit_sha: 固定的提交SHA,防止基准事实漂移。type: 目标类型(当前为1)。language,framework: 语言和框架。authorship: 作者身份(当前为human_authored)。findings: 发现列表。
- 发现条目关键设计:
is_vulnerable: 标识是否为真实漏洞(true)或误报陷阱(false)。acceptable_cwes: 可接受的CWE列表,用于处理CWE模糊性。location: 漏洞位置(起始行、结束行、函数)。severity: 严重性等级。evidence: 证据来源(CVE ID、指南URL或手动审查)。
评估方法
发现匹配
扫描器的发现与基准事实条目匹配采用固定模式:文件路径 + CWE + 行容差。
- 文件路径:规范化后的路径必须完全匹配。
- CWE:扫描器报告的CWE必须在基准事实条目的
acceptable_cwes列表中。 - 行接近度:扫描器报告的行必须在
[start_line - 10, end_line + 10]范围内。如果任一方缺少行信息,则跳过此检查。
发现分类与度量
- 分类:
- 真正例:匹配
is_vulnerable: true的基准事实条目。 - 假正例:匹配
is_vulnerable: false的基准事实条目,或标记了基准事实中不存在的内容。 - 假反例:扫描器遗漏的
is_vulnerable: true条目。 - 真反例:扫描器正确忽略的
is_vulnerable: false条目。
- 真正例:匹配
- 主要度量:F2分数(0-100标度)。F-beta(beta=2)给予召回率比精确率高4倍的权重。
- 完整度量:计算精确率、召回率、F1、F2、F2分数和假正例率。
- 细分报告:支持按CWE族和按严重性进行细分统计。
- 非确定性扫描器支持:通过
--runs参数支持多轮运行模式,报告度量的平均值和标准差。
当前状态与功能
已实现功能
- 带验证的基准事实模式(
validate_gt.py)。 - 带有F2、精确率、召回率、按CWE族和严重性细分报告的评分引擎。
- 基于文件路径、CWE和行容差的发现匹配。
- 用于测量假正例率的误报陷阱(
is_vulnerable: false条目)。 - Semgrep格式解析器,对未知扫描器标识符自动回退。
- 带有Plotly热图的交互式HTML仪表板(
dashboard.py)。 - 每个仓库的JSON和Markdown记分卡(
score.py)。 - 用于非确定性扫描器平均值±标准差评分的多轮运行模式(
--runs)。 - 每个基准事实文件中的固定提交SHA。
暂未实现的功能
- 真实的扫描器结果(目前只有
sample-scanner占位数据)。 - 结果文件中的扫描器版本字符串或元数据清单。
- CI/CD流水线(无GitHub Actions,无pre-commit钩子)。
- CLI打包(
pip install realvuln)。 - 多语言支持(目前仅Python)。
- 类型1之外的目标类型(无基于CVE的、库或基准汇总目标)。
路线图(计划中)
新增目标类型
目标将按两个独立的轴进行分类。
- 轴1:代码真实性(类型):计划新增类型2(先前易受攻击的平台)、类型3(先前易受攻击的库)、类型4(基准汇总)和类型5(学术重现)。
- 轴2:代码作者身份:计划新增
llm_assisted(LLM辅助编写)、llm_generated(主要或完全由LLM生成)和unknown(未知)等类别。
可重现性
计划为每次运行添加元数据:扫描器版本字符串、使用的确切命令、时间戳、目标仓库提交SHA和配置哈希。对于非确定性扫描器(如AI代理),计划通过多次运行来度量和报告稳定性。
研究问题:扫描器性能与代码作者身份
假设:基于LLM的扫描器在LLM生成的代码上可能比在人类编写的代码上表现得出奇地好。
方法:让每个扫描器在匹配的代码对上运行——相同的漏洞类别、相同的类型,但分别是human_authored与llm_generated。比较不同扫描器的性能差异。
其他计划工作
- 多语言支持(JavaScript/TypeScript, Go, Java)。
- CI/CD流水线(用于验证、测试、代码检查的GitHub Actions)。
- CLI打包(
pip install realvuln)。 - 真实的扫描器集成(Semgrep, Bandit, SonarQube, AI-native扫描器等)。




