A meno di 24 ore dal furto dei 594 BTC, Coinkite pubblica un security advisory e una revisione tecnica: la generazione dei seed sui Coldcard Mk3 è compromessa dal firmware 4.0.1 (marzo 2021), con uno spazio di ricerca effettivo stimato in circa 40 bit. Anche Mk4, Mk5 e Q producevano seed con circa 72 bit di entropia invece di 128.
L’ipotesi dell’entropia debole, la più solida tra quelle circolate nelle ore successive al furto dei 594 BTC di cui abbiamo ricostruito la dinamica ieri, ha trovato conferma nel posto più significativo possibile: il blog di Coinkite. Il 30 luglio l’azienda ha pubblicato un security advisory che avverte “per eccesso di cautela” tutti gli utenti che hanno generato un seed su un Coldcard Mk3 con firmware 4.0.1 (marzo 2021) o qualsiasi versione successiva: “I fondi potrebbero essere a rischio“.
Il problema non si ferma al Mk3. Anche i seed generati su Mk4, Mk5 e Q prima dei firmware correttivi – la versione 5.6.0 per Mk4 e Mk5, la 1.5.0Q per Q – sono affetti, con circa 72 bit di entropia invece dei 128 attesi. Coinkite definisce l’impatto su questi modelli “meno severo ma comunque serio“. Tapsigner, Opendime e Satscard non sono coinvolti: si tratta di codebase differenti.
Il collegamento con il furto del 30 luglio
L’advisory non menziona esplicitamente il furto della notte precedente, ma la sequenza temporale parla da sola. Alle 18:10 UTC del 30 luglio NVK, CEO di Coinkite, rispondeva pubblicamente all’allarme sostenendo che non ci fosse “alcuna evidenza di un difetto nel generatore di numeri casuali di Coldcard“. Poche ore dopo, l’azienda pubblicava un advisory che descrive esattamente quello: un difetto nella generazione dell’entropia sul dispositivo.
I dati on-chain raccolti da Atlas21 sono coerenti con il quadro che emerge dall’advisory. Il firmware incriminato risale a marzo 2021; gli UTXO svuotati il 30 luglio datano dal 2021 al 2026. La vittima che ha dato il primo allarme su Reddit aveva acquistato un Coldcard nel 2021 e generato il seed di 24 parole direttamente sul dispositivo, senza che questo toccasse mai un computer.
Un seed con 72 bit di entropia non è attaccabile da un aggressore qualunque: è uno spazio di ricerca enorme per un individuo, ma non fuori portata per chi dispone di LLM sufficientemente potenti e risorse computazionali adeguate. Ma per il Mk3 la situazione è molto peggiore: la revisione tecnica stima uno spazio di ricerca effettivo di circa 40 bit – stima preliminare, avverte l’azienda – un livello che rende il ricalcolo delle chiavi un’operazione industrializzabile. E la struttura del furto di ieri, una transazione per indirizzo, è coerente proprio con chiavi ricalcolate una a una.
La revisione tecnica: il generatore hardware tagliato fuori dal 2021
La revisione tecnica promessa nell’advisory è arrivata a stretto giro: un deep dive che ricostruisce l’origine del bug. Nel 2021 Coinkite migrò le operazioni a curva ellittica del Coldcard su libsecp256k1, la stessa implementazione di Bitcoin Core, introducendo la libreria embedded libNgU. “La scelta crittografica era solida. L’integrazione no“: durante quella migrazione la generazione dei seed passò dalla funzione che interrogava il TRNG hardware del dispositivo a un percorso che risolveva la chiamata sul PRNG software di fallback di MicroPython, un generatore pseudocasuale presente nel codice a monte dal maggio 2018.
Il dettaglio più amaro è la causa di compilazione: una guardia #ifndef che verificava se la macro MICROPY_HW_ENABLE_RNG fosse definita, non se valesse zero. Coinkite l’aveva definita a zero, convinta di escludere quel codice; il controllo di errore non scattò mai e, poiché le due implementazioni avevano la stessa firma, la build si completava senza segnalare nulla. Il codice TRNG scritto per il Coldcard era presente nel firmware e le revisioni lo verificavano, ma nessuna verifica seguiva la catena di risoluzione dei simboli fino alla generazione dei seed: il generatore hardware veniva usato “per puro caso e solo per cose meno importanti“, ammette l’azienda. Sul Mk3 il PRNG attivo era inizializzato principalmente da stato del dispositivo e temporizzazioni: da qui i circa 40 bit. Durante lo sviluppo del Mk4 vennero mescolati nel PRNG anche valori dai TRNG dei due secure element, “un backup del backup” che spiega i circa 72 bit di Mk4, Mk5 e Q.
Sul come il bug sia stato scoperto, Coinkite – che dichiara di averlo appreso “solo oggi” – avanza un’ipotesi: il codice del Coldcard è sempre stato open source, “dobbiamo presumere che qualcuno abbia usato l’AI per analizzare le versioni precedenti del nostro firmware e sia inciampato in questo problema“. Con una nota amara: poche settimane fa l’azienda aveva sottoposto il proprio codice a una revisione di sicurezza con uno dei migliori modelli AI disponibili, che non aveva trovato nulla. Il bug è ora oggetto di analisi indipendenti, tra cui un report tecnico di Block e un modello dei costi di attacco per le diverse generazioni di Coldcard.
L’hotfix di emergenza è già disponibile: versione 5.6.0 per Mk4 e Mk5, 1.5.0Q per Q. Nessuna nuova funzione, solo la generazione corretta dell’entropia, con un controllo aggiunto in fase di build che fa fallire la compilazione se il percorso non arriva al TRNG hardware. Resta il punto fermo dell’advisory: aggiornare il firmware non ripara un seed già generato. Serve un nuovo seed e la migrazione dei fondi.
Chi è al riparo: dadi e passphrase
L’advisory distingue con precisione i casi. Il bug riguarda l’entropia generata dal dispositivo, non quella aggiunta dall’utente.
Chi ha usato la funzione Add Dice Rolls durante la creazione del seed è al riparo, a condizione di aver inserito abbastanza lanci: da 50 a 98 lanci indipendenti e privati contribuiscono almeno 128 bit di entropia propria, da 99 in su circa 256 bit. Sotto i 50 lanci – o se non si ricorda quanti fossero – Coinkite raccomanda di seguire la procedura di migrazione come tutti gli altri.
La passphrase BIP-39 (da non confondere con il PIN del dispositivo) costituisce una barriera indipendente, ma solo se robusta: una passphrase corta, comune, riutilizzata o tratta da una citazione non va considerata una protezione sufficiente. Anche con una passphrase forte, l’indicazione è migrare comunque a un nuovo seed appena possibile.





