wallet-vuln-dataset
收藏资源简介:
一个精选的加密货币钱包软件过去安全修复的语料库——包括自托管应用、硬件钱包固件、智能合约账户、MPC/TSS密钥管理以及每个钱包所依赖的签名库。
A curated corpus of past security fixes for cryptocurrency wallet software, including self-hosted applications, hardware wallet firmware, smart contract accounts, MPC/TSS key management, and the signature libraries upon which each wallet relies.
数据集概述
wallet-vuln-dataset 是一个专注于加密货币钱包软件历史安全修复的精选语料库,涵盖自托管应用、硬件钱包固件、智能合约账户、MPC/TSS 密钥管理以及签名库等。每个条目代表一个历史漏洞修复(合并的PR、提交、公告或CVE),并统一为单一 schema,按安全相关性评分,并按证据强度分级。
核心数据规模
| 指标 | 数量 |
|---|---|
| 原始快照(所有仓库) | 90,223 行 |
| 精选(仅安全) | 27,826 行 |
| 核心切片(A_authoritative ∪ B) | 18,790 行 |
- 按层级:A_authoritative 1,424 · A_dependency 628 · B_corroborated 17,366 · C_candidate 8,408
- 按置信度:high 9,121 · medium 16,637 · low 2,068
- 按严重性:Critical 1 · High 228 · Medium 848 · Low 50 · Info 10,068 · Unrated 15,544
- 带 STRIDE 类别(非 Other):6,531 行(23%)
- 带 CWE-Top-25 ID:6,162 行(22%)
- 仅由 LLM 静默修复分类器识别:1,087 行
96% 的行是 Info 或 Unrated,因为几乎没有任何钱包修复被正式评级。Unrated 不代表低影响,而是缺少评级者。
背景动机
以太坊客户端约 98–100% 的漏洞被静默修复。钱包更严重:钱包不运行网络,而是发布应用商店更新,因此通常没有公告、CVE 或发布说明。对注册表中全部 181 个仓库的 GitHub 安全公告进行爬取,仅获得 16 条已发布公告,167 个仓库(92%)零公告,而同一批仓库中安全相关的 PR/Issue 行有 5,299 条,非公告与公告的比例为 331:1。
因此数据集使用 CVE/GHSA 仅作为校准爬取的骨架,语料本身通过提交历史恢复:关键词门控提交 grep、未标记("隐形")的触及托管敏感路径的 PR、以及基于 diff 的 LLM 静默修复分类器。
范围
当仓库中的缺陷可能导致用户损失资金、密钥材料或签名权限时,该仓库即纳入范围。共 181 个仓库:
| 按类别 | 数量 | 按托管模型 | 数量 |
|---|---|---|---|
| 钱包 SDK / 库 | 50 | 自托管 | 65 |
| 浏览器扩展 | 26 | 库(无托管) | 55 |
| 移动端 | 24 | 智能合约账户 | 27 |
| 智能合约账户 | 22 | MPC / 阈值 / 无种子 | 19 |
| MPC / TSS / 无种子 | 19 | 硬件(安全元件) | 15 |
| 桌面端 | 17 | ||
| 硬件固件 | 10 | ||
| 节点钱包 | 7 | ||
| 连接基础设施 | 6 |
闭源钱包(Phantom、Exodus、Binance Web3、OKX、Bitget、SafePal、交易所托管方)因无提交历史而被排除,并记录在 docs/limitations.md 中。
托管威胁模型
严重性依据缺陷对用户的代价,而非 CVSS:
| 分组 | 缺陷含义 |
|---|---|
key_material |
种子/密钥泄露、弱生成或残留在内存中 |
signing |
签名未经用户批准而有效 |
approval |
未触及密钥即获得花费权限 |
transport |
dapp↔钱包通道允许未授权来源进入 |
ui_deception |
UI 误导导致用户批准错误内容 |
platform |
OS/浏览器逃逸触及密钥库 |
contract |
智能账户自身的验证可被绕过 |
mpc |
阈值协议泄露份额、使 nonce 偏差或允许攻击者组法定人数 |
memory |
固件/原生核心的经典内存破坏 |
supply_chain |
依赖或更新渠道成为攻击面 |
特别覆盖两种以太坊客户端语料库没有对应的托管模型:
- 无种子/嵌入式钱包(Privy、Web3Auth、Openfort、Para、thirdweb、Magic、Turnkey、Dfns)——用户通过电子邮件或 OAuth 登录,密钥在设备、提供商和恢复因子之间拆分。
- Passkey/生物识别钱包(Coinbase Smart Wallet、webauthn-sol、p256-verifier、Clave、passkey-kit)——签名权限依赖于 Face ID / Touch ID 等平台认证器,未校验的
clientDataJSON解析或未检查的用户验证标志构成直接签名绕过。
修复主题分布
每个行携带 label,表示托管链中出问题的部分:
key:seed-mnemonic3,304key:storage2,831network-io2,328sign:encoding-malleability1,354build-ci1,154test890
91% 的行包含内联的 pre_fix_code / post_fix_code(修复前后代码片段),95% 的行包含 files_changed,fix_commit 解析率为 100%。
数据文件
| 文件 | 大小 | 说明 |
|---|---|---|
data/wallet_vulns.parquet |
79 MB | 主数据集,含全部列(含内联修复前后代码) |
data/wallet_vulns.preview.csv |
4.9 MB | 5 个关键列,可在 GitHub 上浏览 |
data/raw/train.classified.parquet |
31 MB | 门控前快照,用于复现筛选 |
data/manifest.json |
— | 各阶段丢弃计数和修订统计 |
完整 CSV 导出(255 MB)超出 GitHub 100 MB 限制,可用如下命令重新生成:
python pd.read_parquet("data/wallet_vulns.parquet").to_csv("wallet_vulns.csv", index=False)
内联代码每行上限为 8 KB 和 12 个文件。
凭据脱敏
由于语料逐字引用提交文本且内容为安全修复,包含硬编码测试种子的提交会被处理。所有发布列在写入前将机密内容掩码为 XXXXXXX(助记词、xprv/WIF/原始十六进制私钥、PEM 块、云/API 令牌),而提交 SHA、锁文件完整性哈希和公钥保留。本次构建掩码了 69 个助记词、21 个原始十六进制私钥、2 个 xprv、1 个 WIF 密钥和 12 个云令牌。
复现
精选表可从原始快照确定性生成(无需网络或 API 密钥):
bash uv run python pipeline/build_security_dataset.py --in data/raw/train.classified.parquet --out data/wallet_vulns.parquet uv run --with pytest python -m pytest tests/ -q
重新爬取原始快照受网络限制(全部 181 个仓库约需 24 小时,受 GitHub 每分钟 30 次搜索请求限制)。
仓库结构
collection/— 仓库注册表(wallets.py)、威胁词汇表、爬虫、流水线脚本pipeline/— 确定性门控与分级、标签/根因/攻击路径/修复前后代码富化scripts/— 从已有爬取重建数据集tests/— 质量门控 + 每个已发布 bug 的回归测试docs/— 方法论、局限性、各切片测量产出data/— 主数据集、原始快照、manifest
许可
数据:CC-BY-4.0(源自各钱包自己的公共仓库);collection/ 和 pipeline/ 下的代码:MIT。




