En bref

  • Un bug du firmware a fait que les portefeuilles Coldcard ont généré des graines à partir d'un générateur pseudo-aléatoire logiciel au lieu de la puce matérielle conçue pour cela.
  • Le bug a effectivement réduit l'espace de recherche de 128 bits à environ 40 sur les modèles plus anciens.
  • Voici ce que cela signifie, et comment cela a conduit au vol de plus de 130 millions de dollars en Bitcoin.

Quelqu'un a vidé des portefeuilles Bitcoin qui n'étaient jamais censés être accessibles.

Les pièces se trouvaient sur des appareils Coldcard—des portefeuilles matériels du fabricant canadien Coinkite, le genre qui ne touche jamais à Internet. Pas de lien de phishing. Pas de logiciel malveillant. Pas d'ordinateur portable volé. Les attaquants ont simplement deviné quelles étaient les clés privées.

Galaxy Research a maintenant suivi plus de 1 596 BTC volés en trois vagues confirmées, avec une quatrième vague suspectée qui porterait le total à environ 2 055 BTC—soit environ 130 millions de dollars aux prix actuels. Un balayage a déplacé 70 millions de dollars en 41 minutes. Coinkite affirme qu'au moins 15 attaquants distincts se sont précipités.

L'entreprise a publié un document technique de fond le 1er août expliquant ce qui n'allait pas. C'est un document inhabituellement franc, et la version courte est que le portefeuille a lancé des dés pipés pendant huit ans sans que personne ne le remarque.

Zéro est toujours quelque chose

En 2021, Coinkite a déplacé la cryptographie de Coldcard vers libsecp256k1, la même bibliothèque que Bitcoin Core utilise. Décision judicieuse. C'est l'intégration qui a échoué.

La migration a silencieusement redirigé la génération de graines du générateur de nombres aléatoires matériel de Coldcard vers le repli logiciel de MicroPython—un petit algorithme appelé Yasmarang qui existe pour les appareils sans puce de hasard du tout.

Coldcard a une puce de hasard. Elle a simplement cessé d'être sollicitée.

La raison est presque trop petite pour être crue. Un garde de construction a utilisé #ifndef, qui vérifie si un paramètre existe plutôt que s'il est activé. Coinkite avait défini ce paramètre à zéro, ce qui signifie "désactivé". Parce que zéro compte toujours comme défini, le contrôle de sécurité a réussi et la construction a été complétée. Les deux versions de la fonction avaient des signatures identiques, donc rien ne semblait anormal.

"La majeure partie du caractère aléatoire sur le COLDCARD provenait d'un PRNG dont je ne savais pas qu'il était réellement dans la base de code source", a écrit Coinkite, en référence à un générateur de nombres pseudo-aléatoires—un logiciel qui produit des nombres qui semblent aléatoires mais suivent une recette fixe à partir d'une valeur de départ.

Donnez à la recette la même valeur de départ et vous obtenez la même sortie. À chaque fois.

Sur les appareils Mk2 et Mk3 exécutant le firmware 4.0.1 à 4.1.9, cette valeur de départ provenait du numéro de série de la puce et de son horloge. Coinkite estime que l'espace de recherche résultant est d'environ 40 bits. Les modèles plus récents ont ajouté un peu d'entropie d'élément sécurisé, les portant à environ 72 bits.

Ni l'un ni l'autre n'atteint 128, l'objectif.

L'écart compte plus qu'il n'y paraît. Les bits sont des exposants. Un espace de recherche de 128 bits contient plus de combinaisons qu'il n'y a d'atomes dans l'univers observable, et personne ne le recherche. Quarante bits, c'est environ un billion—un nombre qu'un ordinateur portable décent peut parcourir. Chaque bit perdu réduit le travail de moitié.

L'équipe d'ingénierie de Block, qui a publié sa propre analyse, a estimé l'espace de recherche effectif de l'élément sécurisé des appareils plus récents à 2^32 candidats, avec une moyenne d'environ 2^31 essais. Leur évaluation pour les anciennes cartes est plus directe : pour un identifiant d'appareil connu, un état de minuterie et un historique d'appels, la génération de portefeuille est déterministe.

Et déterministe est le contraire de aléatoire, ce qui est essentiel à la cryptographie.

Pas "faible". Prévisible.

Coinkite soupçonne que cela a été trouvé par machine. "Nous devons supposer que quelqu'un a utilisé l'IA pour examiner les versions précédentes de notre firmware et est tombé sur ce problème", a écrit l'entreprise, ajoutant qu'elle avait récemment exécuté l'un des meilleurs modèles d'IA disponibles sur le même code et n'avait rien trouvé. "Les attaquants et les défenseurs ont les mêmes outils d'IA, mais aujourd'hui cela ne nous a pas aidés, et n'a aidé que les méchants."

Un firmware corrigé est disponible pour chaque modèle affecté. Il ne répare pas les graines existantes ; ces portefeuilles doivent être régénérés et les fonds déplacés. Decrypt a couvert comment le stockage air-gapped change après une exploitation comme celle-ci et a suivi les pertes dépassant 114 millions de dollars.

Ce qu'est réellement l'entropie

L'entropie est la mesure de ce qu'un attaquant ne sait pas.

En d'autres termes, c'est essentiellement de l'incertitude, comptée en bits. Un bit équivaut à un lancer de pièce : deux résultats possibles, et un devineur a raison la moitié du temps. Dix bits correspondent à 1 024 résultats. Chaque bit double la charge de travail du devineur.

Un portefeuille Bitcoin est un très grand nombre gardé secret. L'adresse à laquelle les gens envoient des pièces en est dérivée mathématiquement, et la dérivation ne fonctionne que dans un sens : on peut passer de la clé à l'adresse, mais jamais l'inverse.

Ainsi, la sécurité de chaque portefeuille repose sur une question : combien de nombres un attaquant devrait-il essayer ?

Si le nombre a été choisi avec 128 bits d'entropie, la réponse est « plus que ce que la physique permet ». S'il a été choisi avec 40, la réponse est « donnez-moi un peu de temps ».

C'est la même propriété qui rend la menace de l'informatique quantique digne d'être débattue : une machine quantique attaquerait les mathématiques qui relient la clé à l'adresse. Le bug de Coldcard n'en a jamais eu besoin. Il a rendu les clés devinables avant que ces mathématiques n'interviennent.

C'est là que le vocabulaire devient glissant. Un générateur pseudo-aléatoire produit une sortie qui réussit les tests statistiques de hasard, donc pratiquement rien qu'un tableur ne signalerait. Cette sortie est néanmoins entièrement déterminée par sa valeur de départ. Elle semble aléatoire mais ne l'est pas.

Le hasard statistique et l'imprévisibilité cryptographique sont des propriétés différentes, et la sortie de Coldcard aurait réussi le premier test tout en échouant complètement au second.

Le vrai hasard doit provenir du bruit physique : gigue électrique dans un circuit, fluctuation thermique, désintégration radioactive. C'est à cela que servait la puce matérielle sur la Coldcard. C'est la puce que le drapeau de construction a déconnectée.

Puis Luke Dashjr a évoqué les dés

Alors que les utilisateurs se précipitaient pour régénérer leurs graines, beaucoup se sont tournés vers la solution low-tech évidente. Les Coldcards vous permettent de lancer des dés physiques et d'introduire les résultats comme entropie. Les propres conseils de Coinkite considèrent que les graines créées avec au moins 50 lancers de dés indépendants et privés ne sont pas à risque à cause du bug.

Cela peut sembler stupide, mais l'entreprise vend en fait un sac avec « 100 petits dés mignons et minuscules » pour vous faciliter tout le processus.

Le 31 juillet, le développeur de Bitcoin Core, Luke Dashjr, a publié un avertissement : « Pas mal de gens suggèrent/utilisent des dés pour atténuer la vulnérabilité de Coldcard. Notez que les dés courants ne sont pas conçus pour être cryptographiquement sûrs. Si vous comptez faire cela, vous devriez probablement acheter des dés de casino de précision. Et même dans ce cas, ayez une autre source d'entropie. »

Bitcoin Twitter ne l'a pas pris calmement.

« lol maintenant tu ne peux même plus lancer de dés », a écrit un utilisateur. « L'auto-conservation est finie… » Un autre a demandé s'il devait engager quelqu'un atteint de la maladie de Parkinson pour les lancer. (Pas sympa.)

La réponse probablement la plus utile est venue avec de l'arithmétique. Le développeur Justin Sharp a calculé exactement combien un mauvais dé vous coûte :

« Exagéré. Un d6 parfait donne 2,585 bits par lancer. Un dé visiblement biaisé, par exemple avec une face qui tombe 20 % du temps au lieu de 16,7 %, donne encore environ 2,55 bits. Sur 99 lancers, cela fait la différence entre ~256 bits et ~252 bits d'entropie. »

Quatre bits sur 256. C'est toute la pénalité pour un dé visiblement injuste.

Dashjr n'a pas tort de dire que les dés bon marché ont un biais mesurable—les points moulés par injection retirent des quantités de plastique légèrement différentes de chaque face, ce qui explique précisément pourquoi les casinos utilisent des dés de précision à points remplis. Il a raison sur la physique et tort sur les enjeux. Perdre quatre bits sur 256 vous laisse à 252. Le bug de Coldcard a laissé les utilisateurs à 40.

Il y a cependant un argument plus incisif caché dans son conseil, et il ne concerne pas la tolérance de fabrication. Il s'agit de ne pas faire confiance à une seule source. La défaillance de Coldcard n'était pas que son entropie était légèrement biaisée—c'était qu'un composant a silencieusement cessé de contribuer et que rien ne l'a détecté.

Que faire à ce sujet

Si vous avez généré une graine sur un Coldcard affecté sans lancers de dés (vraiment) ou sans phrase de passe BIP-39 forte, cette graine est compromise.

Mettez à jour le firmware, générez une nouvelle graine, vérifiez l'empreinte, envoyez une transaction de test, puis transférez tout. L'avis de Coinkite explique cela modèle par modèle. Les graines exportées portent le défaut avec elles—déplacer une mauvaise graine dans une autre application de portefeuille ne résout rien.

Pour tous les autres, la leçon n'est pas que les portefeuilles matériels sont cassés ou que les dés sont un piège.

C'est que « aléatoire » est une affirmation, et les affirmations doivent être vérifiées. Le code source de Coldcard était public tout le temps. Le RNG matériel prévu était juste là dans le binaire. Les réviseurs ont confirmé qu'il existait et n'ont jamais confirmé que le générateur de graines l'appelait réellement.

Huit ans d'audits ont examiné le bon code. Personne n'a vérifié s'il s'exécutait.