Rapport d'incident complet · 16 sources · Anzen Lab

Quatre lignes de code.
Plus de 1 596 BTC évaporés.

En mars 2021, une version du micrologiciel COLDCARD a cessé de demander des nombres aléatoires à sa puce matérielle et a confié cette tâche à un logiciel ordinaire. Personne ne l'a remarqué pendant cinq ans. En juillet 2026, des attaquants ont fait le calcul et ont commencé à vider les portefeuilles.

Le coût de ce paramètre
5 ans
le défaut est resté dans du code entièrement public, inaperçu1
1 596+ BTC
confirmés comme volés sur environ 7 300 adresses, et le chiffre continue d'augmenter7
41 min
le plus gros vol individuel : 1 083 BTC, soit environ 70 millions de dollars à l'époque9
1 sur un billion
la probabilité qu'un attaquant devait surmonter sur un Mk3. La conception prévoyait une chance sur un nombre à 78 chiffres1
Ce qui a mal tourné

Un contrôle de sécurité qui était présent et n'a rien fait

01

Toute la protection repose sur un nombre que personne ne peut deviner

Un portefeuille matériel remplit plusieurs rôles. Il vous montre ce que vous signez réellement au lieu de vous demander de faire confiance à l'écran d'un ordinateur infecté, et il garde votre clé à l'intérieur d'une puce conçue pour résister aux tentatives d'ouverture. Chacune de ces défenses part du principe que le nombre à l'origine de votre clé ne pouvait pas être deviné. Si c'était possible, un attaquant n'a besoin de contourner aucune d'entre elles. Le réservoir dans lequel est tirée une phrase de 24 mots contient approximativement un nombre pour chaque millier d'atomes de l'univers observable. Un réservoir de cette taille ne peut pas être exploré par force brute. C'hui l'ensemble du modèle de sécurité.

Détails techniques

12 mots portent 128 bits d'entropie, 24 en portent 256, plus une somme de contrôle issue du SHA-256 de cette entropie. BIP-39 transforme le résultat en clé maîtresse BIP-32.

Détails techniques

12 mots portent 128 bits d'entropie, 24 en portent 256, plus une somme de contrôle issue du SHA-256 de cette entropie. BIP-39 transforme le résultat en clé maîtresse BIP-32.

02

COLDCARD a cessé de puiser dans cet ensemble

Une modification du micrologiciel en 2021 a discrètement empêché le portefeuille d'interroger sa puce d'entropie dédiée pour obtenir ce nombre, le faisant calculer à la place par un logiciel ordinaire. Voici l'incident résumé côte à côte :

Il ne s'agit pas d'une sécurité réduite de deux tiers. Chaque bit double le travail nécessaire, de sorte que 88 bits en moins réduisent la tâche d'un facteur de 2⁸⁸. Un billion est un grand nombre pour un être humain et un petit nombre pour quelqu'un qui loue des machines hautes performances pour effectuer ce travail.

Détails techniques

La génération de la graine est passée de ckcc.rng_bytes() à ngu.random.bytes(). Coinkite estime qu'il reste environ 40 bits d'espace de recherche sur Mk3 et environ 72 sur Mk4/Mk5/Q, pour un objectif de 128 bits. Une analyse indépendante menée par Block parvient au même ordre de grandeur (moins de 2⁴⁰·⁷ et moins de 2⁷³·³) et met en évidence des conditions plus strictes où l'espace restant est bien moindre.2

Détails techniques

La génération de la graine est passée de ckcc.rng_bytes() à ngu.random.bytes(). Coinkite estime qu'il reste environ 40 bits d'espace de recherche sur Mk3 et environ 72 sur Mk4/Mk5/Q, pour un objectif de 128 bits. Une analyse indépendante menée par Block parvient au même ordre de grandeur (moins de 2⁴⁰·⁷ et moins de 2⁷³·³) et met en évidence des conditions plus strictes où l'espace restant est bien moindre.2

D'où les 24 mots devraient provenir
115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,936
D'où COLDCARD tirait réellement ses mots
1,099,511,627,776
03

Parce qu'un logiciel ne peut pas être aléatoire

Pensez à ce qui rend un lancer de pièce imprévisible. La force du lancer, la gravité, un courant d'air provenant d'un climatiseur, de faibles tremors dans le sol. Des dizaines d'influences que vous pouvez nommer et des dizaines d'autres que vous ne pouvez pas. Personne ne peut calculer la trajectoire, donc personne ne peut deviner le résultat. Le logiciel fonctionne différemment. Il exécute une formule fixe sur une poignée de valeurs de départ et produit une réponse fixe. Ici, ces valeurs étaient le numéro de série de la puce et le temps écoulé depuis la mise sous tension de l'appareil. Un attaquant qui connaît la recette et les ingrédients recalcule le résultat au lieu de le deviner.

Détails techniques

Le générateur aléatoire matériel étant désactivé, rng_get() a été lié au PRNG Yasmarang de MicroPython, initialisé à partir d'un état non secret (UID, SysTick, RTC), et aucun nouvel aléa n'a été collecté par la suite, ce qui permet d'énumérer les candidats hors ligne. Coinkite ne considère pas comme exposées les graines mélangées avec 50 lancers valides et privés ou plus à cause de ce seul problème : 50 × log₂6 ≈ 129 bits.3

Détails techniques

Le générateur aléatoire matériel étant désactivé, rng_get() a été lié au PRNG Yasmarang de MicroPython, initialisé à partir d'un état non secret (UID, SysTick, RTC), et aucun nouvel aléa n'a été collecté par la suite, ce qui permet d'énumérer les candidats hors ligne. Coinkite ne considère pas comme exposées les graines mélangées avec 50 lancers valides et privés ou plus à cause de ce seul problème : 50 × log₂6 ≈ 129 bits.3

04

Et la vérification destinée à l'arrêter a posé la mauvaise question

Il y a avait une protection dans la compilation, écrite spécifiquement pour empêcher la diffusion d'un micrologiciel sans le générateur matériel. Elle vérifiait si un paramètre existait, et non s'il était activé. Le paramètre existait, et il était désactivé. La protection est restée silencieuse, la compilation n'a signalé aucune erreur et le micrologiciel a été publié.

Détails techniques

#ifndef vérifie uniquement si la définition existe. La configuration de la carte définissait MICROPY_HW_ENABLE_RNG à 0, c'est-à-dire défini et désactivé, de sorte que la directive #error ne s'est jamais déclenchée et que l'éditeur de liens a associé rng_get() à la solution de secours logicielle.3

Détails techniques

#ifndef vérifie uniquement si la définition existe. La configuration de la carte définissait MICROPY_HW_ENABLE_RNG à 0, c'est-à-dire défini et désactivé, de sorte que la directive #error ne s'est jamais déclenchée et que l'éditeur de liens a associé rng_get() à la solution de secours logicielle.3

Le défaut, cité à partir du code source.3

05

Rien ne paraissait anormal pendant cinq ans

Une phrase de récupération faible ressemble exactement à une phrase forte. Vingt-quatre mots ordinaires, la bonne somme de contrôle, un appareil qui se comporte normalement. Rien ne vous avertit à l'écran et aucune erreur n'apparaît lors de la compilation. Le code source était public tout ce temps. La lecture de celui-ci exigeait tout de même que quelqu'un ouvre ce fichier particulier.

Détails techniques

La longueur de sortie, l'absence de zéros et la non-répétition passent sans encombre sur un PRNG faible, de sorte que les tests de fumée habituels n'auraient pas pu non plus le détecter.

Détails techniques

La longueur de sortie, l'absence de zéros et la non-répétition passent sans encombre sur un PRNG faible, de sorte que les tests de fumée habituels n'auraient pas pu non plus le détecter.

06

Puis quelqu'un a fait le calcul

Ils n'ont touché aucun appareil. Ils ont généré les phrases probables sur leurs propres machines, calculé quelles adresses Bitcoin chacune produirait, et vérifié ces adresses par rapport à la blockchain publique. Chaque adresse détenant un solde a été vidée. Un portefeuille resté débranché dans un tiroir depuis 2022 était tout aussi exposé qu'un autre utilisé quotidiennement.

Détails techniques

Les candidats sont dérivés hors ligne via BIP-39/BIP-32 ; seule la consultation finale du solde touche le réseau, de sorte qu'aucun signal n'émet du côté de la victime au préalable.3

Détails techniques

Les candidats sont dérivés hors ligne via BIP-39/BIP-32 ; seule la consultation finale du solde touche le réseau, de sorte qu'aucun signal n'émet du côté de la victime au préalable.3

Cette page n'est pas un triomphe.

Coinkite a divulgué la faille, publié un rapport technique et déployé un correctif. Des chercheurs externes ont pu reconstituer ce qui s'est passé parce que COLDCARD est un logiciel libre.

Une mise en garde concernant les estimations : elles décrivent le volume de calculs auxquels un attaquant fait face selon les hypothèses actuelles, et non un chronomètre. Personne ne peut prédire le temps exact nécessaire pour pirater un portefeuille spécifique.2

Si vous possédez un COLDCARD

À lire avant toute chose

La marche à suivre dépend de l'appareil que vous utilisiez lors de la création initiale de la phrase de récupération, et non de celui que vous possédez aujourd'hui.

Partez du principe que cela continue de se produire. Les phrases ont été rendues devinables en 2021 et la méthode est désormais publique, de sorte que n'importe qui peut lancer la même recherche. Aucun correctif ne peut résoudre ce problème de l'extérieur, et il n'y a aucune raison pour qu'un attaquant s'arrête. Si vous êtes concerné, l'hypothèse la plus prudente est que le temps est la seule chose qui vous sépare d'eux.

Mk2 et Mk3 : déplacez vos fonds maintenant

La plage concernée va du micrologiciel 4.0.1 au 4.1.9. La version 4.2.0 corrige la génération des nouvelles phrases, mais aucune mise à jour ne peut ajouter rétroactivement de l'aléa à une phrase existante. Créez un nouveau portefeuille sur un appareil en qui vous avez confiance et transférez vos fonds.1

Mk4 et Mk5 : vérifiez la version du micrologiciel

Si la phrase a été créée avec un micrologiciel antérieur à la version 5.6.0 (ou 6.6.0X pour les versions Edge), mettez à jour l'appareil, créez un tout nouveau portefeuille sur ce micrologiciel mis à jour, puis déplacez vos fonds. La simple mise à jour ne répare pas l'ancienne phrase.1

Q : idem, la limite est fixée à 1.5.0Q

Mettez à jour vers la version 1.5.0Q ou ultérieure, ou 6.6.0QX pour les versions Edge, créez un nouveau portefeuille, notez et testez la sauvegarde, effectuez une petite transaction de test, puis transférez le reste.1

Une mise à jour du micrologiciel COLDCARD corrige-t-elle une phrase de récupération déjà existante ?

Comment savoir quel micrologiciel a généré ma phrase de récupération COLDCARD ?

Comment puis-je vérifier si mon adresse a été compromise ?

Est-ce que les jets de dés ou une phrase passe-phrase protègent une phrase de récupération COLDCARD ?

L'avis de Coinkite couvre-t-il tous les appareils COLDCARD affectés ?

Avis technique officiel de CoinkitePassez à un nouveau portefeuille sur un appareil auquel vous faites déjà confiance, et envoyez une petite transaction de test avant de tout migrer. Conservez les preuves publiques (identifiants de transaction, adresses, horodatages) et ne divulguez jamais de secret. Quiconque propose de récupérer vos fonds commet un second vol en cours, et un tel service n'existe pas. Le choix de votre prochain matériel peut attendre que vos fonds soient en sécurité.
Et si vous possédez un OneKey

Aucun appareil OneKey n'est affecté

Aucun modèle que nous n'avons jamais commercialisé n'est concerné. Notre micrologiciel ne contient aucune dépendance envers libngu, Coinkite, COLDCARD ou CKCC. Le chemin de code défaillant n'est donc pas présent et ne peut pas être atteint, ce qui est vérifiable par vous-même dans nos dépôts. Sur notre matériel actuel, la clé provient du véritable générateur aléatoire intégré à une élément sécurisé certifié, et jamais d'un logiciel s'exécutant sur le processeur principal. C'est précisément cette substitution qui constitue la faille.

Non concernés
OneKey Pro
OneKey Classic 1S
OneKey Classic 1S Pure
OneKey Touch
OneKey Classic
OneKey Mini

Nous n'avons pas non plus pris cela pour argent comptant. Lorsque la nouvelle est tombée, Anzen Lab a analysé notre génération aléatoire de bout en bout (son origine, les fonctions qui l'appellent et les paramètres de compilation qui déterminent quelle version parvient à votre appareil) et a publié les fichiers exacts qu'ils ont examinés.12

Lire la contre-vérification d'Anzen Lab
La question que vous vous posez réellement

Cela aurait-il pu arriver à un OneKey ?

Cette défaillance exigeait que trois conditions distinctes soient réunies simultanément. Sur un appareil OneKey, aucune d'entre elles n'est vraie, et vous pouvez vérifier ces trois points vous-même.

D'où vient la nôtre

D'où vient donc l'aléatoire de OneKey ?

Généré dans une puce certifiée EAL 6+

Vos clés sont créées et conservées dans une puce dédiée et inviolable, plutôt que dans le processeur généraliste qui exécute le reste. EAL 6+ est le niveau d'assurance utilisé pour les cartes de paiement et d'identité.

Un aléatoire qui s'autosurveille

Cette puce génère de l'aléa à partir de véritables bruits physiques et teste en permanence sa propre production. Si l'aléa commence à dysfonctionner, la puce s'en aperçoit au lieu de continuer à fonctionner en silence.

Nous avons revérifié le nôtre

Après l'annonce concernant COLDCARD, Anzen Lab a analysé notre propre génération aléatoire de bout en bout (son origine, ce qui l'appelle réellement et les paramètres de compilation qui déterminent quelle version se retrouve sur votre appareil) et a publié les fichiers exacts qu'ils ont examinés.11

OneKey Pro's EAL 6+ certified secure element
EAL 6+ Badge
Chaque transaction, sécurisée par des puces certifiées EAL 6+
Où l'aléatoire est produit
Élément sécurisé
THD89
Niveau de garantie
Certifié EAL 6+
Source d'entropie
TRNG matériel, autotesté
Sortie certifiée selon
BSI AIS 20 / 31
Ré-audité après cet incident
Anzen Lab, code source publié
La conception d'OneKey et ses audits de sécurité

Quatre contrôles indépendants pour chaque OneKey, sans aucune confiance aveugle entre eux

N'importe laquelle de ces couches peut laisser passer quelque chose. L'important est que les quatre devraient passer à côté de la même chose. COLDCARD n'avait pas une telle sécurité : un seul paramètre de compilation non vérifié a suffi.

01

De l'open source réellement vérifiable

Notre micrologiciel et nos applications sont publics sur GitHub, et nos compilations sont reproductibles, ce qui signifie que vous pouvez compiler le code vous-même et confirmer qu'il produit exactement le logiciel exécuté sur votre appareil. C'est l'étape qui permet de détecter un problème de « bon code, mauvaise version ».

OneKey sur GitHub
02
SlowMist

Des intervenants extérieurs nous contrôlent, officiellement

Le cabinet de sécurité SlowMist nous audite et publie ses rapports. Des évaluations distinctes couvrent OneKey Pro, le Classic 1S et notre SDK. Nos pratiques de sécurité sont certifiées ISO/IEC 27001, et les gammes Pro et Classic 1S sont certifiées EN 18031 par un organisme désigné par l'UE. Tout est publié, rien n'est auto-évalué.13

Lire la synthèse d'audit de SlowMist
03

Une équipe payée pour casser nos propres produits

Anzen Lab est notre équipe de sécurité interne composée d'ingénieurs spécialisés dans la sécurité du matériel, du micrologiciel et des applications, qui travaille avec un groupe tournant de chercheurs externes. Leur rôle est de mettre à l'épreuve les portefeuilles matériels, y compris les nôtres, avant toute commercialisation. Lorsque cette affaire a éclaté, ils ont réexaminé de bout en bout la génération aléatoire de OneKey et ont publié la liste exacte des fichiers qu'ils ont vérifiés.11

Lire l'analyse du Anzen Lab
04

Nous payons des inconnus pour trouver nos erreurs

Tout le monde peut nous signaler une faille en privé, via notre programme public sur BugRap ou directement à [email protected], et être rémunéré pour cela. La sévérité détermine la prime, évaluée selon le score CVSS. L'objectif est de rendre le signalement plus attractif que la revente.15

OneKey sur BugRap
entro.tools · Conçu par notre fondateur

Testez le portefeuille que vous avez en main

entro.tools est un outil gratuit et open source qui lit les véritables nombres aléatoires produits par un portefeuille matériel et exécute les tests de santé statistique standard, directement dans votre navigateur, via USB, sans rien téléverser nulle part et sans nécessiter de mise à jour du micrologiciel.

Il fonctionne sur Trezor et KeepKey ainsi que sur nos propres appareils, ce qui vous permet de les comparer côte à côte au lieu de faire confiance aux affirmations d'un seul fabricant.
Mode d'exécution
Dans votre navigateur, via WebUSB
Tests appliqués
FIPS 140-2, NIST SP 800-22 / 90B
Vos données
Ne quittent jamais la page
Mise à jour du micrologiciel
Non requise
Contrôle d'entropie

Exécute localement les tests de santé FIPS 140-2, NIST SP 800-22 et SP 800-90B via WebUSB (depuis les navigateurs de bureau Chrome ou Edge). L'appareil demande à exporter de l'entropie, c'est-à-dire un lot de nombres aléatoires qu'il vient de générer, et jamais votre phrase de récupération.16

Le test universel de Maurer exige au moins 387 840 bits ; en deçà, le rapport l'indique explicitement comme ignoré plutôt que de le passer sous silence.16

Quels portefeuilles peuvent être vérifiés

La possibilité pour un tiers de lire les nombres aléatoires bruts d'un appareil. Il s'agit d'un critère très précis. Voir la remarque ci-dessous.

OneKey
Vérifiable par vous-même
Tous les modèles, micrologiciel d'origine16
Trezor
Vérifiable par vous-même
Tous les modèles, protocole de communication partagé16
KeepKey
Vérifiable par vous-même
Famille du protocole Trezor16
Ledger
Faire confiance au vendeur
Élément sécurisé fermé ; aucune commande hôte n'expose de nombres aléatoires bruts16
BitBox02
Faire confiance au vendeur
La requête de nombres aléatoires du protocole a été supprimée par le fabricant16
Blockstream Jade
Faire confiance au vendeur
L'hôte peut seulement ajouter de l'entropie ; aucun moyen de relire la source16
COLDCARD
Faire confiance au vendeur
Possède un port USB, mais son protocole ne contient aucune commande d'entropie16
Keystone
Faire confiance au vendeur
Isolé par conception (air-gapped) ; l'USB ne transporte que les informations de l'appareil et les mises à jour du micrologiciel16
« In vérifiable » et « non sécurisé » sont deux choses différentes. Les éléments sécurisés fermés suivent leur propre parcours de certification. Un résultat positif prouve uniquement qu'aucun défaut statistique n'apparaît aujourd'hui. Il ne peut pas prouver l'imprévisibilité cryptographique et ne dit rien sur l'aléa utilisé le jour de la création de votre portefeuille.
Encore des questions

Les questions que cela soulève pour tout le monde

OneKey est-il concerné par la faille d'entropie de COLDCARD ?

Quels portefeuilles matériels la faille d'entropie COLDCARD affecte-t-elle ?

Puis-je tester l'aléa de mon propre portefeuille ?

Comment évaluer si l'on peut faire confiance à un portefeuille matériel ?

Une sécurité que vous pouvez vérifier, plutôt qu'une sécurité que l'on vous demande de croire.

Code source ouvert et reproductible, audité par des tiers, testé par notre propre laboratoire et récompensé lorsqu'une faille est découverte. Ce sont ces appareils qui font l'objet de notre démarche.

Cold Storage Weeks
Jusqu'à $50 en Bitcoin offerts avec chaque appareil, jusqu'au 17 août.

Références

Sources ci-dessous, récupérées le 6 août 2026. L'avis et le rapport technique de Coinkite viennent en premier, suivis par une analyse indépendante du code source et une comptabilité sur la chaîne. Les chiffres des pertes continuent d'être revus à la hausse : Galaxy Research a confirmé 1 596 BTC le 4 août et évalue les pertes suspectées plus près des 2 055 BTC.