分析报告 · 2026 年 10 月 25 日

Epic Cash:
100 轮不足以保证 wallet.seed 安全。

Epic Cash 使用 ChaCha20-Poly1305 加密 wallet.seed,加密本身没有明显问题;但口令密钥派生只有 PBKDF2-HMAC-SHA512 100 轮。拿到该文件后,可以以较低成本离线尝试口令。种子生成随机源不在本次问题范围内。评级为中等:攻击需要先拿到本地文件;如果文件外泄,风险会升为严重。

严重程度:中等 · 需本地文件KDF本地钱包Epic Pay

S-8 · EPIC-KDF-2026-01 · v1.0 · 审计日期 2026 年 10 月 25 日 · 阅读约 5 分钟

摘要

报告检查了 Epic Cash 官方钱包(cypherstack/epic-wallet)及其在 Epic Pay 中的使用。wallet.seed 保存加密后的种子;ChaCha20-Poly1305 加密本身是正确的,但口令密钥派生仅使用 PBKDF2-HMAC-SHA512 100 轮,盐为 8 字节。

风险是本地性的:必须先拿到 wallet.seed。文件到手后,可以离线、低成本地尝试口令。

文件里有什么

wallet.seed 是一个 JSON 文件,包含 encrypted_seed、salt 和 nonce。种子为 16 或 32 字节,可重建 BIP39 助记词及所有账户私钥。

AEAD 会直接给出“口令是否正确”的判断:tag 校验通过即命中。整个过程不需要远程服务。

已检查版本

检查了 EpicCash/epic-wallet 的 13 个 tag,以及 cypherstack/epic-wallet 的 master 分支。全部使用 100 轮、8 字节盐和 ChaCha20-Poly1305。

tag / 分支KDF 写法轮数盐AEAD
v3.0.0 · v3.3.2pbkdf2::derive(&digest::SHA512, 100, …)1008 BChaCha20-Poly1305
v3.4.0 · v3.5.0 · v3.5.1 · v3.6.0ring::pbkdf2::PBKDF2_HMAC_SHA5121008 BChaCha20-Poly1305
v4.0.0(-beta) · v4.0.1 · v4.0.2 · v4.1.0同一套 API,参数相同1008 BChaCha20-Poly1305
cypherstack v3.0.0 · v3.3.2 · master新旧两套 API,参数相同1008 BChaCha20-Poly1305

结论:13/13 个 tag + master 参数一致;未发现已修复版本。

问题所在

PBKDF2-HMAC-SHA512 只跑 100 轮,远低于当前建议的 600,000 轮或 Argon2id。8 字节盐可以接受,但短于建议的 16 字节。

种子生成随机源不是问题:报告指出的是文件保护太弱,而不是种子熵不足。

该文件经常被复制到硬盘或网盘作为备份,这扩大了泄露面。

影响

如果 wallet.seed 被获取,攻击者可以还原口令、种子、BIP39 助记词和私钥,并转走全部 Epic 资产及由同一助记词派生的资产。

没有速率限制、没有锁定,也不需要网络参与。

范围与局限

  • PoC 按同一 Rust 逻辑重建;未测试真实用户钱包样本。
  • 实际风险取决于口令强度。
  • 已检查 13 个 tag + master;未覆盖 floonet 测试网。
  • 审计范围内未发现已修复版本。
  • 不公布受害者数据、助记词或私钥。

建议

  • 改用至少 600,000 轮的 PBKDF2-HMAC-SHA512,或 Argon2id。
  • 把盐增加到 16 字节,并为文件格式加版本号。
  • 迁移旧文件:未重写的旧文件仍然可被攻击。
  • 修正解密时使用的 tag 长度常量。
  • 把 wallet.seed 当作私钥备份;避免放在同步目录。
  • 如果文件可能已经泄露,创建新种子并转移资产。

披露

完整报告和证据仍然受限。报告案例:security@frblockchain.icu。请勿发送助记词、私钥或钱包文件。

一个需要检查的 Epic 钱包,或一个可疑文件?