Útočník postupoval pragmaticky: nejprve se zaměřil na největší zůstatky. Podle Chainalysis zmizelo během prvních deseti minut přibližně 30 milionů dolarů, včetně peněženky s bitcoinem v hodnotě 1,8 milionu dolarů . Nemusel přitom sáhnout na jediné zařízení. Zranitelnost mu umožnila vzdáleně znovu vytvořit seed fráze, a tím odvodit soukromé klíče .
Samostatně popsaná vlna odčerpala přibližně 594 BTC, tedy asi 38 milionů dolarů, zhruba z 500 jednopodpisových peněženek během 25 minut kolem 01:31 UTC . Analýzy Galaxy Research, Chainalysis a bezpečnostního týmu společnosti Block spojily tyto krádeže se stejnou zranitelností Coldcard .
Tým Block pro bitcoinové inženýrství a bezpečnost, který vedl inženýr Clay Garrett, zjistil, že útočník využíval placený účet u známého poskytovatele blockchainových služeb. Přes něj mohl efektivně vyhledávat a dotazovat zranitelné adresy .
Podezření vyvolal neobvyklý vzorec pohybu na blockchainu: mimořádně rychlé a po sobě jdoucí převody z adres, které sdílely stejnou slabinu. Block následně potvrdil stopy přímo propojující aktivitu operátora s infrastrukturou tohoto poskytovatele .
Služba tak podle vyšetřování fungovala jako průzkumný nástroj. Útočníkovi pomohla rychle zmapovat adresy vytvořené na zranitelném firmwaru a seřadit si je podle výše zůstatku . Garrett popsal zjištění jako „mimořádně přesná, až na úroveň konkrétního účtu“ .
Chyba se do firmwaru dostala při změně z března 2021, která souvisela s migrací na knihovnu libsecp256k1 z Bitcoin Core. U zařízení Coldcard Mk3 se problém objevil od firmwaru verze 4.0.1 .
Hardwarová peněženka měla při vytváření seedu využívat dedikovaný hardwarový generátor skutečně náhodných čísel (TRNG) v čipu STM32. Kvůli chybě v konfigurační makroinstrukci však firmware tuto cestu obešel a použil deterministický softwarový generátor Yasmarang z prostředí MicroPython .
Konfigurace produkční desky nastavila MICROPY_HW_ENABLE_RNG na nulu, protože Coldcard používal vlastní obslužnou vrstvu hardwarového generátoru. Knihovna libngu ale nekontrolovala, zda je makro skutečně zapnuté. Ověřovala pouze, zda je definované. Protože definované bylo — byť s hodnotou nula — knihovna předpokládala, že hardwarová cesta funguje, a napojila se na softwarovou funkci rng_get() .
Výsledkem bylo snížení efektivní entropie z plánovaných více než 128 bitů na přibližně 32 až 40 bitů. Místo astronomického množství možných seedů tak vznikly zhruba 4 miliardy kombinací, které lze s moderním hardwarem systematicky prohledávat . Plně ohroženy byly především seedy vytvořené bez vlastních hodů kostkou a bez dodatečného hesla BIP39 .
Chybu později uznal také generální ředitel Coinkite Rodolfo Novak, známý jako NVK: „Výslovně jsem nastavil MICROPY_HW_ENABLE_RNG na nulu v domnění, že žádnou z těchto verzí nepotřebujeme, ale takto to nefunguje“ .
| Zasažené | Nezasažené podle prvotní analýzy |
|---|---|
| Coldcard Mk3 s firmwarem 4.0.1 až 5.0.3 | Mk4, Q a Mk5 |
| Seedy vytvořené bez uživatelských hodů kostkou nebo hesla BIP39 | Seedy vytvořené s vlastními hody kostkou nebo heslem |
Po další analýze Coinkite rozšířil bezpečnostní upozornění také na některé verze firmwaru pro Mk4, Mk5 a Q a vydal nouzové aktualizace pro všechny dotčené modely .
Incident zasáhl do jednoho ze základních příslibů self-custody, tedy samostatné správy kryptoměn: že hardwarová peněženka ochrání klíče i před chybami v okolním softwaru . V tomto případě ale problém nevznikl v kryptografii bitcoinu ani v samotném blockchainu. Selhalo generování náhodnosti při vytváření klíčů.
Podrobný technický rozbor zveřejnil tým Block ve své inženýrské zprávě . Technické pozadí chyby popisuje také Coinkite .