Een eerdere, aparte golf van dezelfde aanval schraapte 594 BTC (~$38 miljoen) weg uit ongeveer 500 wallets met één handtekening in een 25 minuten durende uitbarsting rond 01:31 UTC . Galaxy Research, Chainalysis en het technische team van Block koppelden de diefstallen onafhankelijk van elkaar aan dezelfde Coldcard-kwetsbaarheid .
Het Bitcoin Engineering and Security-team van Block, onder leiding van ingenieur Clay Garrett, ontdekte dat de aanvaller een betaald account bij een bekende aanbieder van blockchain-diensten had gebruikt om kwetsbare adressen efficiënt te identificeren en te bevragen . Het on-chain patroon van de aanvaller – ongewoon snelle, opeenvolgende overboekingen van adressen met dezelfde zwakte – viel op bij onderzoekers. Block bevestigde sporenelementen die de activiteit van de operator rechtstreeks koppelden aan de infrastructuur van die aanbieder .
Block vond volgens Garrett bewijs met 'buitengewone specificiteit, tot op accountniveau' . De analysedienst fungeerde als een verkenningsinstrument, waarmee de aanvaller snel in kaart kon brengen welke adressen op kwetsbare firmware waren gegenereerd en de rijkste doelen kon prioriteren .
De bug werd geïntroduceerd in een firmware-update van maart 2021 (vanaf Mk3-firmwareversie 4.0.1) tijdens een migratie naar de libsecp256k1-bibliotheek van Bitcoin Core . Een macro-fout in de buildconfiguratie zorgde ervoor dat de firmware de speciale STM32-hardware-matige randomgenerator (TRNG) omzeilde en in plaats daarvan terugviel op MicroPython's deterministische Yasmarang-software-RNG .
De productieboardconfiguratie stelde MICROPY_HW_ENABLE_RNG in op nul, omdat Coldcard een aparte hardware-RNG-wrapper had. Maar de libngu-bibliotheek riep die wrapper niet correct aan: de guard-voorwaarde (#ifndef MICROPY_HW_ENABLE_RNG) controleerde alleen of de macro bestond, niet of de waarde niet nul was . Omdat de macro was gedefinieerd (op nul), concludeerde libngu ten onrechte dat het hardwarepad beschikbaar was en koppelde het aan MicroPython's software-gebaseerde rng_get()-functie .
Dit reduceerde de effectieve entropie tot ruwweg 32–40 bits (in plaats van de beoogde 128+ bits), wat neerkomt op slechts zo'n 4 miljard mogelijke seed-waarden – triviaal te brute-forcen met moderne hardware . Seeds die waren gegenereerd zonder door de gebruiker toegevoegde dobbelsteenworpen of een BIP 39-wachtwoordzin waren volledig blootgesteld .
Coinkite-CEO Rodolfo Novak (NVK) gaf later de fout toe: 'Ik heb MICROPY_HW_ENABLE_RNG expliciet op nul gezet, in de veronderstelling dat we geen van beide versies nodig hadden, maar dat is niet wat het doet' .
| Getroffen | Niet getroffen |
|---|---|
| Coldcard Mk3, firmware 4.0.1 t/m 5.0.3 | Mk4, Q, Mk5 (volgens eerste analyse Coinkite) |
| Seeds gegenereerd zonder dobbelsteenworpen of BIP 39-wachtwoordzin | Seeds gegenereerd met dobbelsteenworpen of wachtwoordzin |
Coinkite breidde het advies later uit naar bepaalde Mk4-, Mk5- en Q-firmwareversies na verder onderzoek en bracht nood-firmware-updates uit voor alle getroffen modellen .
Deze exploit heeft een van de kernbeloften van zelfbewaring ondermijnd – namelijk dat de beveiligde chip van een hardware wallet cryptografische veiligheid garandeert, ongeacht softwarefouten .
Voor een gedetailleerde technische uitleg, zie het engineeringrapport van Block en de technische achtergrond van Coinkite .