Rapport d’analyse · 25 octobre 2026

Epic Cash :
100 itérations ne protègent pas wallet.seed.

Epic Cash chiffre wallet.seed avec ChaCha20-Poly1305, mais la clé est dérivée du mot de passe par PBKDF2-HMAC-SHA512 avec seulement 100 itérations. Si le fichier est obtenu, le mot de passe peut être testé hors ligne à faible coût. Le générateur de seed lui-même n’est pas mis en cause. Classement : moyen — l’attaque exige l’accès au fichier local ; elle devient critique si le fichier fuit.

Gravité : Moyen · accès localKDFWallet localEpic Pay

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 / brancheDérivationItérationsSelAEAD
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.0Même API, mêmes paramètres1008 BChaCha20-Poly1305
cypherstack v3.0.0 · v3.3.2 · masterAncienne/nouvelle API, mêmes paramètres1008 BChaCha20-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 floonet n’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.seed comme 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.

Un wallet Epic à vérifier, un fichier suspect ?