ethereum-vuln-dataset
收藏资源简介:
一个精选的语料库,包含来自11个生产Ethereum客户端(五个执行层,六个共识层)的历史安全修复。每一行代表一个历史漏洞修复——一个合并的PR、提交、公告或CVE——归一化为单一模式,按安全相关性评分,并根据证据强度分级。该数据集用于训练和评估规范合规性/审计工具。
A curated corpus of historical security fixes sourced from 11 production-grade Ethereum clients, including five execution layer clients and six consensus layer clients. Each entry represents a historical vulnerability fix—either a merged pull request (PR), commit, security advisory, or CVE—normalized into a unified schema, scored for security relevance, and graded based on evidence strength. This dataset is intended for training and evaluating specification compliance and audit tools.
数据集概述:Ethereum Vulnerability Dataset
该数据集是一个精心整理的以太坊客户端历史安全修复语料库,覆盖了11个生产环境客户端(5个执行层,6个共识层)。每一行数据代表一个历史漏洞修复事件。
核心目的
用于训练和评估规范合规性与审计工具。核心问题是:给定修复前的代码状态,工具是否能发现漏洞?
数据规模
| 类别 | 行数 |
|---|---|
| 原始快照(所有客户端) | 18,475 |
| 精选后(仅安全相关) | 2,225 |
| 核心子集(A级 + B级) | 1,808 |
| 按证据等级划分 | A_authoritative: 235 · B_corroborated: 1,573 · C_candidate: 417 |
| 按置信度划分 | 高: 337 · 中: 1,542 · 低: 454 |
| 按严重性划分 | 严重: 3 · 高: 63 · 中: 60 · 低: 21 · 信息: 853 · 未分级: 1,333 |
数据集构建流程
- 原始快照:从11个客户端仓库及规范仓库中抓取公告、隐蔽PR、提交、发布、CVE/OSV/RustSec等,共18,475行。
- 去噪:通过确定性规则过滤:
- T1: 移除发布说明/紧急模板(11行)。
- T2: 移除CI/文档/依赖升级等元工作(1,417行)。
- T2b: 移除NVD子串匹配误报(49行),剩余16,998行。
- 安全信号门控:保留至少触发一个独立安全信号的行,否则丢弃(丢弃14,665行低信号数据)。
- 精选结果:最终得2,225行已精选数据,并划分证据等级。
安全信号门控机制
保留一行记录的条件是任意一个以下独立安全信号被触发。保留后,根据证据强度划分等级:
| 等级 | 含义 | 使用场景 |
|---|---|---|
| A_authoritative | 具有公告ID或公告级别严重性,是已确认的漏洞。 | 需要真实准确的数据。 |
| B_corroborated | 无公告ID,但≥2个独立信号一致。 | 默认的高精度子集。 |
| C_candidate | 仅单一信号触发。 | 需要最大覆盖范围。 |
核心子集 = A ∪ B。
隐蔽修复检测
以太坊客户端约98-100%的漏洞是隐蔽修复的。数据集使用两种方法恢复:
- 补丁反向链接:从已确认的公告开始,提取精确的修复提交。
- 免训练LLM分类器:对代码差异、开发工件和受影响子系统进行思维链分析。在
gemma4:31b模型上F1值为0.872,精确度为0.895。此步骤额外发现了453个隐蔽修复。
严重性分级与范围
严重性遵循以太坊基金会漏洞赏金标准,而非CVSS。严重性反映单个网络数据包或链上交易可达到的网络级影响:
| 等级 | 定义 |
|---|---|
| 严重 | 创建/归集无限ETH · 从所有外部账户窃取/销毁ETH · 通过一个交易击垮整个网络 · 罚没超过50%的验证者 |
| 高 | 影响超过33%的链分裂或宕机 · 罚没超过33% |
| 中 | 超过5%的链分裂或宕机 · 罚没超过1% |
| 低 | 通过单个数据包/交易造成超过0.01%的链分裂或宕机 |
注意:
- 约94%的行是“未分级”。大多数修复没有CVE或公告,因此未分级≠低影响。
- 存在两种严重性模型并存:少数行遵循EF漏洞赏金,部分上游依赖CVE携带CVSS分级,两者在
severity_source列中区分。 severity_estimated列是可选LLM通过的估计值,不会覆盖已分级的severity。
数据来源客户端
| 客户端 | 层次 | 语言 | 仓库 |
|---|---|---|---|
| Geth | 执行层 | Go | ethereum/go-ethereum |
| Nethermind | 执行层 | C# | NethermindEth/nethermind |
| Besu | 执行层 | Java | hyperledger/besu |
| Erigon | 执行层 | Go | erigontech/erigon |
| Reth | 执行层 | Rust | paradigmxyz/reth |
| Lighthouse | 共识层 | Rust | sigp/lighthouse |
| Lodestar | 共识层 | TypeScript | ChainSafe/lodestar |
| Nimbus | 共识层 | Nim | status-im/nimbus-eth2 |
| Prysm | 共识层 | Go | prysmaticlabs/prysm |
| Teku | 共识层 | Java | Consensys/teku |
| Grandine | 共识层 | Rust | grandinetech/grandine |
此外,还包括ethereum/consensus-specs和ethereum/execution-specs的规范差异修复。
数据模式关键字段
| 字段 | 描述 |
|---|---|
id |
稳定行ID |
source_platform |
客户端标识 |
severity |
漏洞赏金等级 |
title, description |
修复文本 |
source_url |
上游修复链接 |
label |
漏洞的协议领域(如fork-choice) |
root_cause |
根本原因(如missing_bounds_check) |
attack_path |
触发方式(如malicious_block) |
pre_fix_code / post_fix_code |
内联的修复前/后代码 |
authority_tier |
证据等级 |
confidence |
置信度 |
数据访问与使用
python import pandas as pd df = pd.read_parquet("data/ethereum_vulns.parquet")
获取核心子集(1,808行)
df[df.authority_tier != "C_candidate"]
获取高置信度数据
df[df.confidence == "high"]
数据集提供CSV和Parquet格式。原始快照和处理流程完全可复现。



