Atak nie wymagał fizycznego dostępu do urządzeń. Wystarczyło zdalne odtworzenie ziarna (seed) portfela . Wcześniejsza fala tego samego exploitu w ciągu 25 minut opróżniła około 500 portfeli z 594 BTC (~38 mln dolarów) . Galaxy Research, Chainalysis i zespół inżynierów Blocka niezależnie potwierdzili, że wszystkie kradzieże łączy ta sama luka w oprogramowaniu Coldcard .
Inżynier Blocka Clay Garrett odkrył, że atakujący korzystał z płatnego konta u znanego dostawcy usług analizy blockchain, aby skutecznie identyfikować i przeszukiwać podatne adresy . Wzorzec transakcji na łańcuchu – niezwykle szybkie, sekwencyjne opróżnianie adresów o tej samej słabości – naprowadził śledczych na trop. Block potwierdził, że aktywność operatora była bezpośrednio powiązana z infrastrukturą tego dostawcy . Dostawca usług analitycznych służył jako narzędzie rozpoznania, pozwalając hakerowi szybko zmapować, które adresy pochodzą z podatnego oprogramowania i wybrać najbogatsze cele .
Luka została wprowadzona w marcu 2021 roku w oprogramowaniu sprzętowym (firmware) w wersji 4.0.1 dla modelu Mk3, podczas migracji do biblioteki libsecp256k1 Bitcoin Core . Błąd w makrze konfiguracyjnym spowodował, że oprogramowanie pominęło dedykowany sprzętowy generator liczb losowych (TRNG) STM32 i zamiast tego użyło deterministycznego programowego generatora Yasmarang z MicroPythona .
Konfiguracja płyty produkcyjnej ustawiła MICROPY_HW_ENABLE_RNG na zero, ponieważ Coldcard miał własny, oddzielny sprzętowy RNG. Jednak biblioteka libngu nie wywołała tego własnego RNG poprawnie: jej warunek zabezpieczający (#ifndef MICROPY_HW_ENABLE_RNG) sprawdzał tylko, czy makro jest zdefiniowane, a nie czy jego wartość jest różna od zera . Ponieważ makro było zdefiniowane (jako zero), libngu milcząco uznało, że ścieżka sprzętowa jest dostępna i podpięło programową funkcję rng_get() .
W efekcie efektywna entropia spadła do około 32–40 bitów (zamiast zamierzonych 128+ bitów), co oznaczało tylko około 4 miliardów możliwych wartości seeda – co jest trywialne do złamania przy użyciu nowoczesnego sprzętu . Seedy wygenerowane bez dodatkowych rzutów kostką użytkownika lub frazy BIP 39 były całkowicie odsłonięte .
Dyrektor generalny Coinkite, Rodolfo Novak (NVK), przyznał później: „Wyraźnie ustawiłem MICROPY_HW_ENABLE_RNG na zero, myśląc, że nie potrzebujemy żadnej wersji, ale to nie jest to, co to robi” .
| Dotknięte | Niedotknięte (wstępna analiza) |
|---|---|
| Coldcard Mk3, firmware 4.0.1 do 5.0.3 | Mk4, Q, Mk5 |
| Seedy wygenerowane bez rzutów kostką lub frazy BIP 39 | Seedy z rzutami kostką lub frazą |
Coinkite później rozszerzyło ostrzeżenie na niektóre wersje firmware Mk4, Mk5 i Q i wydało awaryjne aktualizacje dla wszystkich dotkniętych modeli .
Ten exploit poważnie nadszarpnął jedno z podstawowych założeń self-custody – że bezpieczny element portfela sprzętowego gwarantuje bezpieczeństwo kryptograficzne niezależnie od błędów w oprogramowaniu .