Vulnerabilità dei wallet hardware Coldcard: rubati Bitcoin per oltre 88 milioni di dollari

Riepilogo di mercato AI
Una vulnerabilità divulgata nella generazione delle chiavi del wallet hardware Coldcard avrebbe consentito agli attaccanti di rubare oltre 88 milioni di dollari in BTC, con lo sfruttamento descritto come ancora in corso e i fondi che si aggregano on-chain. Pur non trattandosi di un problema di Bitcoin a livello di protocollo, l'incidente può mettere sotto pressione il sentiment nel breve termine aumentando il rischio di custodia e operativo, potenzialmente inducendo migrazioni accelerate verso l'autocustodia, un controllo più rigoroso delle catene di fornitura dei wallet hardware e un monitoraggio maggiore degli indirizzi correlati da parte degli exchange e dei team di compliance.
Livello dell'impatto
● Elevato
Asset interessati
BTC/USDT+0.86%
Approfondimenti AI · BTC/USDTApprofondimenti AI
▼ Ribassista
Fai subito trading
⚠️ Le analisi generate dall'AI si basano sui contenuti delle notizie e sono forniti esclusivamente a scopo informativo. Non costituiscono consulenza in materia di investimenti né rappresentano le opinioni di BingX. Investire comporta rischi. Fai trading in modo responsabile.
Le perdite legate allo sfruttamento di una vulnerabilità nei wallet hardware Coldcard hanno superato gli 88 milioni di dollari e l'attacco risulta ancora in corso. Il 31 luglio circa 500 dispositivi Coldcard sarebbero stati compromessi, con il furto di 594 BTC per un controvalore di circa 38 milioni di dollari. Coinkite, produttore dei wallet Coldcard, ha confermato un problema di sicurezza nel processo di generazione delle chiavi che interessa più generazioni del prodotto, inclusi Coldcard Mk2, Mk3, Mk4, Q e Mk5. Agli utenti viene raccomandato di trasferire quanto prima i fondi su un altro indirizzo. Di seguito l'analisi di Beosin sulla vulnerabilità e il tracciamento dei fondi sottratti. I. Analisi della vulnerabilità Dall'analisi della cronologia dei commit del firmware Coldcard emerge che, nel commit precedente 37e4af5451c260c1e7d429fe8972c4cb5e68ee59, il team ha modificato diverse sezioni di codice legate alla configurazione MK4, tra cui in mpconfigboard.h: // We have our own version of this code. #define MICROPY_HW_ENABLE_RNG (0) Nel ramo MicroPython STM32, questa macro determina il percorso di compilazione per il binding predefinito dell'hardware random number generator (RNG) e l'implementazione generica del random. Impostandola a 0 si impedisce che il percorso predefinito dell'RNG hardware venga usato come backend per la rng_get() generica. I commenti indicano l'intenzione di implementare un RNG personalizzato; nel file rng.h personalizzato risultano dichiarati soltanto due oggetti MicroPython: MP_DECLARE_CONST_FUN_OBJ_0(pyb_rng_get_obj); MP_DECLARE_CONST_FUN_OBJ_1(pyb_rng_get_bytes_obj); L'implementazione corrispondente è: /// \function pyb_rng_get() ///// Returns a 30bit hardwaregenerated random number, or fails! //STATIC mp_obj_t pyb_rng_get(void){ // Retrieve and return the new random number return mp_obj_new_int(rng_get_or_fault() >> 2); } /// \function rng_get_bytes() /// Fills a buffer with random bits; the caller must provide a buffer of appropriate size. STATIC mp_obj_t pyb_rng_get_bytes(mp_obj_t buffer_io) { mp_buffer_info_t bufinfo; mp_get_buffer_raise(buffer_io, &bufinfo, MP_BUFFER_WRITE); mp_uint_t count = bufinfo.len; if(count SR & RNG_SR_DRDY)) { if (HAL_GetTick() start >= RNG_TIMEOUT_MS) { // Hardware failure... do not return anything! mp_raise_OSError(MP_EFAULT); } } // Retrieve and return the new random number last_value = RNG>DR; return last_value; } Questo indica che il codice personalizzato Coldcard mira effettivamente a usare l'RNG hardware, ma ne garantisce l'uso solo quando vengono chiamati pyb_rng_get* o random_buffer() interno. Durante la creazione del wallet viene invocato il seguente flusso, dove la funzione di creazione in shared/seed.py è: async def make_new_wallet(nwords): # Select a new random seed. await ux_dramatic_pause('Generating...', 3) seed = generate_seed() words = await approve_word_list(seed, nwords) if words: await commit_new_words(words) La chiamata entra prima nel modulo shared/random.py di Coldcard. Nelle versioni precedenti, random.py dipendeva esplicitamente da ngu.random e manteneva: # random.py subset of the random module, with no compatibility, using cryptographically secure RNG # for bytes, use ngu.random.bytes(len) # bytes = ngu.random.bytes L'inizializzazione del wallet utilizza random.bytes e non pyb.rng(); di conseguenza, l'oggetto pyb_rng_get_obj personalizzato non sovrascrive automaticamente random.bytes. Poiché MICROPY_HW_ENABLE_RNG è impostato a 0, la generazione del wallet non ha usato l'RNG hardware, ma ha invece richiamato pyb_rng_yasmarang da micropython/ports/stm32/rng.c: #if MICROPY_HW_ENABLE_RNG uint32_t rng_get(void) { // Use STM32 hardware RNG ... } #else // For MCUs without an RNG, we still need to provide an rng_get() function. // A pseudoRNG is not ideal, but we use it for now. // Yasmarang random number generator static uint32_t pyb_rng_yasmarang(void) { static bool seeded = false; static uint32_t pad = 0, n = 0; ... } uint32_t rng_get(void) { return pyb_rng_yasmarang(); } #endif pyb_rng_yasmarang è un generatore pseudo-casuale ed è considerato altamente insicuro per generare i seed di un hardware wallet, poiché un attaccante può forzare la chiave con brute force. Coinkite ha ora escluso esplicitamente stm32/rng.c nel Makefile: Do not compile MicroPython's fallback PRNG. The board-specific rng.c provides rng_get(), and this empty object satisfies the upstream object list. $(BUILD)/rng.o: CFLAGS += Dpyb_rng_yasmarang=errordonotwantthis $(BUILD)/rng.o: $(ECHO) "SKIP stm32/rng.c" $(Q)$(CC) $(CFLAGS) x c c /dev/null o $@ II. Tracciamento dei fondi sottratti I fondi provenienti da più wallet vittima sono già stati spostati e aggregati in diversi indirizzi, senza evidenze di ulteriori attività di laundering al momento. In base a threat intelligence e analisi on-chain, Beosin Trace ha individuato i seguenti indirizzi di aggregazione: - bc1qq85v2c926eg6pgxhwp6q7lf6cnsz80qs3fcu9r (562 BTC) - bc1qx76cae2706qd5q576feh7xq8rfcsjpf2htfhe3 (398.47 BTC) Inoltre, i seguenti indirizzi mostrano un modello di flusso fondi simile e non hanno ancora registrato ulteriori trasferimenti: - bc1q8jy96fe5lf8vfugydnte3cguk92gpev7kwtp3q (89.62 BTC) - bc1q0rvn88w08j75k4h48lf9fvhan7unjp7vjf5q6m (64.9 BTC) - bc1qtfrwa4j6rmj9rsgspv6a0yjumkg39js2numu75 (45.9 BTC) - bc1qmd5m5ktv7m5ffujxv4248fxv36myvdx79n8jp6 (30.18 BTC) Gli attacchi contro i wallet Coldcard proseguono; il team Beosin dichiara di monitorare in modo continuativo eventuali nuovi indirizzi di aggregazione e di analizzare i movimenti associati. III. Conclusioni Secondo Beosin, l'incidente nasce da un errore di implementazione: durante la fase critica di generazione del seed del wallet sarebbe stato utilizzato un generatore pseudo-casuale, esponendo i seed a un rischio di brute force. Beosin raccomanda al team di sviluppo test e audit continui e approfonditi del codice. Agli utenti Coldcard viene consigliato di trasferire rapidamente gli asset e di seguire con attenzione le future comunicazioni di sicurezza di Coinkite. Beosin è una società specializzata in sicurezza blockchain e tecnologie di compliance regolamentare, con servizi che includono audit di smart contract pre-lancio, monitoraggio e blocco dei rischi in tempo reale, recupero di asset, antimoney laundering (AML) per asset virtuali e investigative tracing. L'azienda afferma di fornire prodotti e servizi "one-stop" a enti regolatori e forze dell'ordine in oltre 20 Paesi e aree, a più di 200 virtual asset service provider e a oltre 4.500 progetti Web3.