Eine separate, frühere Welle desselben Exploits erfasste 594 BTC (~38 Millionen $) von etwa 500 Single-Signature-Wallets in einem 25-minütigen Ausbruch um 01:31 UTC . Galaxy Research, Chainalysis und das Engineering-Team von Block verknüpften die Diebstähle unabhängig voneinander mit derselben Coldcard-Sicherheitslücke .
Das Bitcoin Engineering- und Sicherheitsteam von Block unter der Leitung von Clay Garrett identifizierte, dass der Angreifer einen kostenpflichtigen Account bei einem bekannten Blockchain-Diensteanbieter nutzte, um verwundbare Adressen effizient zu identifizieren und abzufragen . Das On-Chain-Muster des Angreifers – ungewöhnlich schnelle, sequenzielle Durchläufe von Adressen mit derselben Schwachstelle – brachte die Ermittler auf die Spur. Block bestätigte Spuren, die die Aktivität des Betreibers direkt mit der Infrastruktur dieses Anbieters verbanden .
Blocks Untersuchung fand laut Garrett eine „außergewöhnliche Spezifität bis auf die Kontenebene“ . Der Analysedienst fungierte effektiv als Aufklärungsinstrument, das es dem Angreifer ermöglichte, schnell zu kartieren, welche Adressen auf verwundbarer Firmware generiert worden waren, und die reichsten Ziele zu priorisieren .
Der Bug wurde in einem Commit vom März 2021 (beginnend mit Mk3-Firmware-Version 4.0.1) während einer Migration zu Bitcoin Cores libsecp256k1-Bibliothek eingeführt . Ein Build-Konfigurationsmakro-Fehler führte dazu, dass die Firmware den dedizierten STM32-Hardware-Zufallszahlengenerator (TRNG) des Geräts umging und stattdessen auf MicroPythons deterministischen Yasmarang-Software-RNG zurückfiel .
Die Produktionsplatinenkonfiguration setzte MICROPY_HW_ENABLE_RNG auf null, weil Coldcard einen separaten Hardware-RNG-Wrapper hatte. Aber die libngu-Bibliothek rief diesen Wrapper nicht korrekt auf: Ihre Schutzbedingung (#ifndef MICROPY_HW_ENABLE_RNG) testete nur, ob das Makro definiert war, nicht ob sein Wert ungleich null war . Da das Makro definiert war (auf null gesetzt), folgerte libngu stillschweigend, dass der Hardware-Pfad verfügbar sei, und band an MicroPythons softwarebasierte rng_get()-Funktion .
Dies reduzierte die effektive Entropie auf etwa 32–40 Bits (statt der beabsichtigten 128+ Bits), was bedeutet, dass es nur etwa 4 Milliarden mögliche Seed-Werte gab – mit moderner Hardware trivial durch Brute-Force zu ermitteln . Seeds, die ohne zusätzliche Benutzer-Würfelwürfe oder eine BIP-39-Passphrase generiert wurden, waren vollständig exponiert .
Coinkite-CEO Rodolfo Novak (NVK) räumte den Fehler später ein: „Ich habe MICROPY_HW_ENABLE_RNG explizit auf null gesetzt, in dem Glauben, wir bräuchten keine der beiden Versionen, aber das macht es nicht“ .
| Betroffen | Nicht betroffen |
|---|---|
| Coldcard Mk3, Firmware 4.0.1 bis 5.0.3 | Mk4, Q, Mk5 (laut erster Coinkite-Analyse) |
| Seeds generiert ohne Benutzer-Würfelwürfe oder BIP-39-Passphrase | Seeds generiert mit benutzereigenen Würfelwürfen oder Passphrase |
Coinkite weitete seine Sicherheitswarnung später nach weiteren Analysen auf bestimmte Mk4-, Mk5- und Q-Firmware-Versionen aus und veröffentlichte Notfall-Firmware-Updates für alle betroffenen Modelle .
Dieser Exploit hat eines der Kernversprechen von Self-Custody erschüttert – nämlich dass das Secure Element eines Hardware-Wallets kryptografische Sicherheit unabhängig von Softwarefehlern garantiert .
Eine detaillierte technische Aufschlüsselung findet sich in Blocks Engineering-Report und Coinkites Technical Backgrounder .