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.2 | pbkdf2::derive(&digest::SHA512, 100, …) | 100 | 8 B | ChaCha20-Poly1305 |
| v3.4.0 · v3.5.0 · v3.5.1 · v3.6.0 | ring::pbkdf2::PBKDF2_HMAC_SHA512 | 100 | 8 B | ChaCha20-Poly1305 |
| v4.0.0(-beta) · v4.0.1 · v4.0.2 · v4.1.0 | 同一套 API,参数相同 | 100 | 8 B | ChaCha20-Poly1305 |
| cypherstack v3.0.0 · v3.3.2 · master | 新旧两套 API,参数相同 | 100 | 8 B | ChaCha20-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。请勿发送助记词、私钥或钱包文件。