Un attaquant a vidé 1 196 adresses Bitcoin en 41 minutes le 30 juillet, soit 1 082 bitcoins et près de 70 millions de dollars. Les victimes n'ont rien fait de travers. Le firmware des Coldcard rendait leurs clés calculables depuis mars 2021, et personne ne s'en était aperçu.
Un paramètre à zéro que le code ne lisait pas
Un portefeuille matériel fabrique une seed, la suite de mots dont dérivent toutes vos clés. Sa sécurité tient entièrement à l'imprévisibilité de ce tirage.
Coinkite voulait écarter le générateur d'aléatoire de MicroPython au profit du sien. Le firmware 4.0.0 a donc mis le paramètre MICROPY_HW_ENABLE_RNG à zéro, en mars 2021. Sauf que la bibliothèque libngu regardait seulement si ce paramètre existait, jamais la valeur qu'il portait. Il existait.
Pendant cinq ans, les tirages sont passés par Yasmarang, un générateur pseudo-aléatoire non cryptographique dont l'état initial se limitait à l'identifiant 32 bits de la puce, un registre de minuterie et l'horloge interne. Les Mk3 sont tombés à une quarantaine de bits d'imprévisibilité au lieu des 128 annoncés, les Mk4, Mk5 et Q à 72.
Aucun appareil n'a été touché
C'est là que l'affaire sort de l'ordinaire. Il n'y a eu ni intrusion, ni logiciel malveillant, ni accès physique aux boîtiers.
L'attaquant a produit les seeds possibles sur sa propre machine, calculé les adresses que chacune donnerait, et comparé le tout à la blockchain, publique par nature. Pour les Mk4, Mk5 et Q, les clés que l'appareil pouvait sortir se comptaient en milliards, pas en milliards de milliards.
Tout s'est joué entre 1h31 et 1h56 UTC, le temps de faire passer 1 324 transactions dans trois blocs, et 562 des bitcoins raflés dorment depuis dans une adresse unique que personne n'a touchée. On doit l'analyse technique aux équipes sécurité de Block et le suivi des fonds à Galaxy Research. L'attaquant, lui, court toujours.
Ce qu'il faut faire si vous en possédez un
Coinkite a sorti un firmware d'urgence dès le lendemain, pour toutes les branches : 4.2.0 sur Mk3, 5.6.0 sur Mk4 et Mk5, 1.5.0Q sur les Q.
Attention au contresens, il coûte cher : installer la mise à jour ne répare en rien une seed déjà générée, il faut en créer une nouvelle une fois le firmware corrigé en place, puis y transférer les fonds. Ce qui détermine votre exposition, c'est la date à laquelle vous avez généré cette seed, pas celle de l'achat du boîtier.
S'en sortent ceux qui avaient monté du multisignature, où le Coldcard ne pèse qu'une clé parmi plusieurs, et ceux qui avaient ajouté une passphrase BIP-39 par-dessus leur seed.
On en dit quoi ?
Coinkite ne s'est pas défaussée : son patron Rodolfo Novak s'est dit désolé et dévasté, le correctif est arrivé en vingt-quatre heures sur toutes les branches, l'analyse technique complète est annoncée, et sur ce plan il n'y a pas grand-chose à reprocher à la maison.
Il n'empêche qu'une ligne de configuration aura tenu cinq ans dans le boîtier que tout le monde citait en exemple. Novak suggère que l'attaquant a peut-être trouvé le défaut avec une IA, sans le prouver, et en admettant que sa propre relecture assistée par IA n'avait rien vu. La leçon est ailleurs : un appareil coupé d'Internet ne vous protège de rien si son aléatoire est prévisible.