S-8 · EPIC-KDF-2026-01 · v1.0 · Audit du 25 octobre 2026 · Lecture ~5 min
Résumé
Le rapport examine le portefeuille officiel Epic Cash (cypherstack/epic-wallet) et son utilisation dans Epic Pay. Le fichier wallet.seed contient le seed chiffré ; le chiffrement ChaCha20-Poly1305 est correct, mais la clé est dérivée du mot de passe par PBKDF2-HMAC-SHA512 avec seulement 100 itérations et un sel de 8 octets.
Le risque est local : il faut obtenir wallet.seed. Une fois le fichier en main, le mot de passe peut être testé hors ligne à faible coût.
Ce qui est stocké
wallet.seed est un JSON avec encrypted_seed, salt et nonce. Le seed fait 16 ou 32 octets et permet de reconstruire la phrase BIP39 et les clés de tous les comptes.
Le chiffrement AEAD fournit un test direct du mot de passe : tant que le tag est valide, le candidat est correct. Aucun service distant n’est nécessaire.
Versions examinées
Les 13 tags du dépôt EpicCash/epic-wallet et la branche master de cypherstack/epic-wallet ont été examinés. Tous utilisent 100 itérations, un sel de 8 octets et ChaCha20-Poly1305.
| Tags / branche | Dérivation | Itérations | Sel | 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 | Même API, mêmes paramètres | 100 | 8 B | ChaCha20-Poly1305 |
| cypherstack v3.0.0 · v3.3.2 · master | Ancienne/nouvelle API, mêmes paramètres | 100 | 8 B | ChaCha20-Poly1305 |
Bilan : 13/13 tags + master, paramètres identiques ; aucune version corrigée identifiée.
Le problème
PBKDF2-HMAC-SHA512 à 100 itérations est très en dessous des recommandations actuelles (600 000 itérations ou Argon2id). Le sel de 8 octets est acceptable mais plus court que les 16 octets recommandés.
Le générateur de seed n’est pas en cause : le rapport ne décrit pas une faiblesse d’entropie, mais une protection trop faible du fichier.
Le même fichier est souvent copié sur un disque ou un cloud comme sauvegarde, ce qui élargit la surface.
Impact
Si wallet.seed est obtenu, l’attaquant peut retrouver le mot de passe puis le seed, la phrase BIP39 et les clés privées. Il peut transférer les actifs Epic et ceux dérivés de la même phrase.
Il n’y a ni limitation de débit, ni verrouillage, ni participation du réseau.
Périmètre et limites
- PoC basé sur la même logique Rust ; pas d’échantillon réel de wallet utilisateur.
- Le risque dépend de la force du mot de passe.
- 13 tags + master examinés ; le réseau de test
floonetn’est pas couvert. - Aucune version corrigée n’est identifiée dans le périmètre audité.
- Aucune donnée de victime, seed ou clé privée n’est publiée.
Recommandations
- Passer à PBKDF2-HMAC-SHA512 avec au moins 600 000 itérations, ou à Argon2id.
- Porter le sel à 16 octets et versionner le format du fichier.
- Migrer les anciens fichiers : un fichier existant reste attaquable tant qu’il n’est pas réécrit.
- Corriger la constante de longueur du tag utilisée dans le déchiffrement.
- Traiter
wallet.seedcomme une sauvegarde de clé privée ; éviter les répertoires synchronisés. - Si le fichier a pu fuiter, créer un nouveau seed et déplacer les actifs.
Divulgation
Le rapport complet et les preuves restent restreints. Pour signaler un cas : security@frblockchain.icu. Ne pas envoyer de seed, de clé privée ou de fichier de wallet.