🎬 DEBUNK COLDCARD

➡️ Juillet 2020
- Foundation Devices sort Passport en copiant le firmware Coldcard (alors en licence libre GPL)
- NVK regrette publiquement d’avoir choisi la GPL : "maintenant on a un clone"
➡️ Fin 2020 début 2021
- Coinkite change de licence
- Passage en MIT + Commons Clause : on peut lire le code, mais on n’a plus le droit de s’en servir pour faire un produit concurrent
- Objectif : tuer les copies commerciales
➡️ 1er mars 2021
- Commit massif de 120 fichiers "First pass w/ libNgU"
- On retire les dernières parties de code sous GPL
- C’est exactement dans ce commit que le bug est introduit
- Le générateur de hasard matériel (TRNG) est contourné
- Le firmware bascule en silence sur un générateur logiciel prévisible (Yasmarang)
- Résultat : au lieu de 128 bits d’entropie, on tombe à environ 40 bits sur les Coldcard Mk3... C’est faible. Très faible
➡️ 2021 à 2026
- Le bug reste "invisible" pendant 5 ans
- La nouvelle licence restrictive a fortement réduit le nombre de personnes motivées à auditer le code en profondeur
- Moins d’yeux = le bug survit !
➡️ L’arrivée de l’IA change la donne
- Coinkite elle-même passe son firmware dans "un des meilleurs modèles d’IA" quelques semaines avant l’attaque et le modèle ne trouve rien !
- L’attaquant a certainement utilisé un LLM (ou plusieurs) pour scanner les anciennes versions du code open-source et a repéré le bug subtil que même l’IA de Coinkite avaient raté 🤔
➡️ Avril-mai 2026
- Les plus grosses adresses qui seront vidées en juillet reçoivent de toutes petites quantités de bitcoin (dust)
- Ce n’est pas du hasard. C’est un marquage de cibles
- L’attaquant avait déjà la liste des seeds vulnérables au moins trois mois avant
➡️ 30 juillet 2026
- Entre 01h10 et 01h51 UTC, plus de 1080 BTC sortent de 1 196 adresses
- Trois jours plus tard, le total dépasse 1367 BTC sur 4 585 adresses
- Les fonds sont regroupés sur quelques adresses... et presque rien ne bouge ensuite
- Signature des transactions reconnaissable : frais fixes à 30 sat/vB, aucun rendu de monnaie, envois groupés
➡️ La seule vraie erreur de l’attaquant
- Pendant l’opération, il a utilisé un compte payant chez un grand fournisseur de données blockchain
- Les logs correspondent à la seconde près
- Le fournisseur n’était pas complice, mais il a des logs et probablement du KYC... C’est la meilleure piste pour les autorités
➡️ Pourquoi le 30 juillet ?
- Le stock de seeds vulnérables avec des fonds dormants était au maximum
- On était à quelques jours du début de la fenêtre critique de BIP-110 (le soft fork anti-Ordinals)
- Toute l’attention de la communauté hardcore (exactement le public Coldcard) était déjà saturée !
👤 Qui est responsable de quoi ?
- Coinkite : a changé de licence pour se protéger commercialement, et a introduit le bug dans le même mouvement
- L’attaquant : a eu une patience rare, a préparé son coup pendant des mois (voire des années), et a presque parfaitement exécuté
- La communauté : a fait confiance à "open-source" et à un hardware wallet sans jamais vraiment vérifier comment le hasard était généré
👉 La leçon :
- Dice rolls + passphrase ne sont pas optionnels
- "Open-source" ne veut pas dire "audité"
- Une licence trop restrictive peut tuer les audits
- L’IA change radicalement le rapport de force : un bug subtil peut rester caché 5 ans... jusqu’à ce qu’un modèle le trouve en une nuit
- Un attaquant qui a du temps bat presque toujours une communauté qui a trop confiance !
#COLDCARD 🪦

➡️ Juillet 2020
- Foundation Devices sort Passport en copiant le firmware Coldcard (alors en licence libre GPL)
- NVK regrette publiquement d’avoir choisi la GPL : "maintenant on a un clone"
➡️ Fin 2020 début 2021
- Coinkite change de licence
- Passage en MIT + Commons Clause : on peut lire le code, mais on n’a plus le droit de s’en servir pour faire un produit concurrent
- Objectif : tuer les copies commerciales
➡️ 1er mars 2021
- Commit massif de 120 fichiers "First pass w/ libNgU"
- On retire les dernières parties de code sous GPL
- C’est exactement dans ce commit que le bug est introduit
- Le générateur de hasard matériel (TRNG) est contourné
- Le firmware bascule en silence sur un générateur logiciel prévisible (Yasmarang)
- Résultat : au lieu de 128 bits d’entropie, on tombe à environ 40 bits sur les Coldcard Mk3... C’est faible. Très faible
➡️ 2021 à 2026
- Le bug reste "invisible" pendant 5 ans
- La nouvelle licence restrictive a fortement réduit le nombre de personnes motivées à auditer le code en profondeur
- Moins d’yeux = le bug survit !
➡️ L’arrivée de l’IA change la donne
- Coinkite elle-même passe son firmware dans "un des meilleurs modèles d’IA" quelques semaines avant l’attaque et le modèle ne trouve rien !
- L’attaquant a certainement utilisé un LLM (ou plusieurs) pour scanner les anciennes versions du code open-source et a repéré le bug subtil que même l’IA de Coinkite avaient raté 🤔
➡️ Avril-mai 2026
- Les plus grosses adresses qui seront vidées en juillet reçoivent de toutes petites quantités de bitcoin (dust)
- Ce n’est pas du hasard. C’est un marquage de cibles
- L’attaquant avait déjà la liste des seeds vulnérables au moins trois mois avant
➡️ 30 juillet 2026
- Entre 01h10 et 01h51 UTC, plus de 1080 BTC sortent de 1 196 adresses
- Trois jours plus tard, le total dépasse 1367 BTC sur 4 585 adresses
- Les fonds sont regroupés sur quelques adresses... et presque rien ne bouge ensuite
- Signature des transactions reconnaissable : frais fixes à 30 sat/vB, aucun rendu de monnaie, envois groupés
➡️ La seule vraie erreur de l’attaquant
- Pendant l’opération, il a utilisé un compte payant chez un grand fournisseur de données blockchain
- Les logs correspondent à la seconde près
- Le fournisseur n’était pas complice, mais il a des logs et probablement du KYC... C’est la meilleure piste pour les autorités
➡️ Pourquoi le 30 juillet ?
- Le stock de seeds vulnérables avec des fonds dormants était au maximum
- On était à quelques jours du début de la fenêtre critique de BIP-110 (le soft fork anti-Ordinals)
- Toute l’attention de la communauté hardcore (exactement le public Coldcard) était déjà saturée !
👤 Qui est responsable de quoi ?
- Coinkite : a changé de licence pour se protéger commercialement, et a introduit le bug dans le même mouvement
- L’attaquant : a eu une patience rare, a préparé son coup pendant des mois (voire des années), et a presque parfaitement exécuté
- La communauté : a fait confiance à "open-source" et à un hardware wallet sans jamais vraiment vérifier comment le hasard était généré
👉 La leçon :
- Dice rolls + passphrase ne sont pas optionnels
- "Open-source" ne veut pas dire "audité"
- Une licence trop restrictive peut tuer les audits
- L’IA change radicalement le rapport de force : un bug subtil peut rester caché 5 ans... jusqu’à ce qu’un modèle le trouve en une nuit
- Un attaquant qui a du temps bat presque toujours une communauté qui a trop confiance !
#COLDCARD 🪦
1