Der BitBox02-Schutz gegen den “Nonce Covert Channel”-Angriff wurde mit dem BitBox-Update 01.2021 Monte Rosa veröffentlicht.
Worum geht es?
Hardware-Wallets wie die BitBox02 erstellen digitale Signaturen, um deine Transaktionen zu autorisieren. Dafür verwenden sie private Schlüssel. Ohne den richtigen privaten Schlüssel zu kennen, ist es praktisch unmöglich, eine Signatur zu fälschen. Eine Signatur wird mathematisch mit Hilfe einer Nonce (“number only used once”) konstruiert, einer geheimen Zahl, die von deiner Hardware-Wallet frei gewählt werden kann.
Eine böswillige Hardware-Wallet kann über die von ihr erstellten Signaturen private Schlüssel aus dem Gerät herausschmuggeln, indem sie diese Nonces manipuliert. Da die Signaturen Teil der in der öffentlichen Blockchain gespeicherten Transaktionen sind, kann ein Angreifer diese von der Blockchain lesen, deine privaten Schlüssel rekonstruieren und so die Kontrolle über all deine Coins erlangen.
Wir können diesen Angriff verhindern, indem wir in die Signatur nachweislich einen Nonce-Beitrag der Host-Software (z.B. der BitBoxApp) mit einbeziehen, der eine solche Manipulation verhindert.
Dieser Angriff ist in zweierlei Hinsicht besonders interessant:
- Selbst wenn du jedes Detail der Transaktion in einer absolut sicheren Umgebung verifizierst und ein vollkommen isoliertes Airgap-System zum Signieren der Transaktion verwendest, bist du ohne Nutzung des Anti-Klepto-Protokolls immer noch ungeschützt.
- Dieser Angriff benötigt keinerlei Beteiligung von Computer und Handys. Der Angriff ist selbst dann möglich, wenn dein Computer oder deine mobile Wallet, die du zur Interaktion mit deiner Hardware-Wallet verwendest, nicht kompromittiert ist.
Das Anti-Klepto-Protokoll kann solche Angriffe verhindern, indem es deinen Computer oder deine mobile Wallet in die Lage versetzt, zu überprüfen, dass keine böswillige Manipulation der Signaturen stattgefunden hat.
Warum ist das hilfreich?
Wir sind von der Wirksamkeit von Defense in Depth überzeugt und stehen für das Motto "Don't trust, verify!" ein.
Wir entwickeln stetig neue Funktionen zur Minimierung des nötigen Vertrauens durch Transparenz. Folgende Features helfen dir, die Integrität und Sicherheit deiner BitBox02 und deines Seeds unabhängig zu überprüfen:
- Nur offiziell vom BitBox-Team signierte Firmware kann auf der BitBox02 ausgeführt werden.
- Jeder Computer und jede mobile Wallet führt automatisch eine Echtheitsprüfung durch, um sicherzustellen, dass die BitBox02 ab Werk vom BitBox-Team programmiert wurde, bevor das Gerät freigeschaltet wird.
- Unser gesamter Code ist quelloffen und umfasst die BitBox02-Firmware, die BitBoxApp und alle Bibliotheken, die für die Integration der Wallet von Drittanbietern verwendet werden.
- Du kannst überprüfen, ob die Firmware-Binärdateien, die wir veröffentlichen, tatsächlich aus dem veröffentlichten Quellcode erstellt wurden. Eine Anleitung dazu findest du in unserem Leitfaden "Reproduzierbare Builds".
- Du kannst die BitBox02 so konfigurieren, dass sie eine Prüfsumme der Firmware auf dem Bildschirm anzeigt, bevor sie die Firmware ausführt, und unabhängig überprüfen, ob sie der offiziellen Version entspricht.
- Seit der Version 01.2021 Monte Rosa kannst du deinen eigenen Seed erzeugen, ohne dich auf die Zufallszahlengenerierung der BitBox02 zu verlassen, zum Beispiel durch Würfeln. Folge unserem Leitfaden "Würfle deine eigene Bitcoin-Wallet".
Das Anti-Klepto-Protokoll ist unsere neueste Ergänzung zu dieser Liste. Genau wie die anderen Funktionen erhöht es die Kosten und den Aufwand, die für einen erfolgreichen Angriff auf die Lieferkette nötig sind.
Die Manipulation der Seed-Generierung und die Weitergabe des Seeds über einen verdeckten Nonce-Kanal sind wahrscheinlich die effektivsten Methoden, um einen groß angelegten Angriff durchzuführen. Beide Probleme werden in unserer neuen Version 01.2021 Monte Rosa behandelt.
Kleine Einführung: private und öffentliche Schlüssel
Ein privater Schlüssel ist einfach eine große Zahl, die zu groß ist, um sie zu erraten. Zum Beispiel:
92193805913277071008055984303319191614197341949664602874511898854633635443214
Zu jedem privaten Schlüssel gibt es einen öffentlichen Schlüssel, der in deine Bitcoin-Adresse übersetzt wird. Coins, die an eine Adresse geschickt werden, können nur wieder transferiert werden, wenn du den entsprechenden privaten Schlüssel kennst. Die Kenntnis eines öffentlichen Schlüssels allein gibt keine Auskunft über den privaten Schlüssel.
Heutzutage verwaltet eine Wallet nicht mehr viele private Schlüssel, sondern nur noch einen Seed, von dem sie bei Bedarf Unterschlüssel ableitet. Der Seed ist das, was du bei der Initialisierung deiner BitBox02 auf deiner microSD-Karte sicherst oder was du mit 24 Wiederherstellungswörtern auf Papier schreibst.
Die Formel zur Ableitung eines öffentlichen Schlüssels aus einem privaten Schlüssel lautet publicKey = privateKey×G
, wobei G
ein vordefinierter Wert ist.
Die Werte sind technisch gesehen Teil einer mathematischen Gruppe, in der die Addition eine besondere Bedeutung hat. Wenn du mehr darüber erfahren möchtest, findest du eine hervorragende Einführung in dieses Thema in der Blogserie "Elliptic Curve Cryptography: a gentle introduction".
Abgesehen davon, dass eine Division hier nicht möglich ist (sonst könnte man den privaten Schlüssel aus dem öffentlichen Schlüssel berechnen!), funktioniert der Großteil der üblichen Mathematik genau gleich. Bekannte Gesetze wie das Distributivgesetz gelten: (a + b)×G = a×G + b×G. Dieses Gesetz ermöglicht es der Computer-Wallet, den verdeckten Nonce-Kanal-Angriff zu verhindern, wie wir später sehen werden.
Die ”Covert nonce channel”-Attacke
Teil einer digitalen Signatur ist die Nonce. Die Nonce ist wie ein privater Schlüssel, aber sie wird bei jeder Unterschrift nach dem Zufallsprinzip erstellt. Wie bei jedem privaten Schlüssel gibt es einen zugehörigen öffentlichen Schlüssel Nonce×G. Dieser ist Teil der Signatur, welche schließlich zusammen mit der Transaktion in der Blockchain aufgezeichnet wird.
Aufgrund der vielen Fallstricke bei der Verwendung von zufälligen Nonces sind die meisten Wallets dazu übergegangen, deterministische Nonces zu verwenden. Sie basieren nicht auf Zufallszahlengeneratoren, sondern werden durch Hashing des privaten Schlüssels, der zu signierenden Nachricht und optionaler Zusatzdaten ermittelt. Leider lässt sich anhand einer solchen Nonce nicht feststellen, ob sie zufällig, deterministisch oder - wie im Falle des Angriffs auf den verdeckten Kanal - böswillig erzeugt wurde.
Damit eine böswillige Hardware-Wallet den Wallet-Seed (von dem alle anderen privaten Schlüssel abgeleitet werden) extrahieren kann, muss sie einfach Teile davon im öffentlichen Nonce-Schlüssel verstecken, der dann in der öffentlichen Blockchain als Teil einer Transaktionssignatur verewigt wird. Nachdem eine bestimmte Anzahl dieser bösartigen Signaturen in die Blockchain gelangt ist, kann der Angreifer nach diesen suchen und deinen Seed unbemerkt rekonstruieren.
Für die bösartige Hardware-Wallet gibt es ein paar Hindernisse:
- Sie muss nach dem Zufallsprinzip viele verschiedene Nonces ausprobieren, bis der öffentliche Schlüssel der Nonce das gewünschte Muster aufweist. Da dies ein langsamer Prozess ist, kann die böswillige Hardware-Wallet jeweils nur wenige Bytes der gesamten Signatur beeinflussen.
- Die Signatur muss außerdem eine Art versteckte Markierung enthalten, damit der Angreifer (und nur der Angreifer) sie beim Scannen der Blockchain erkennen kann.
Folglich kann der Seed nicht mit einer einzelnen Signatur extrahiert werden, sondern es sind mehrere Durchläufe nötig. Je nach Methode und Umgebung können aber ein paar Dutzend Signaturen ausreichen, um den vollständigen Seed zu extrahieren.
Abhilfe: das Anti-Klepto-Protokoll
Der Angriff wird vereitelt, indem die Möglichkeit der Hardware-Wallet eingeschränkt wird, die Nonce frei zu wählen. Dazu verlangt die BitBoxApp (oder jede andere Software, die mit der BitBox02 interagiert), dass die Hardware-Wallet wie bisher eine eigene Nonce wählt, zwingt sie aber auch dazu, eine von der BitBoxApp selbst gewählte Nonce hinzuzufügen.
Das Protokoll läuft wie folgt ab und wird für jede Signatur ausgeführt. Wir beschreiben hier ein vereinfachtes Protokoll, um das grundsätzliche Konzept zu erklären. Das vollständige Protokoll mit allen Details ist im Implementierungs-Code dokumentiert.
Lass uns eintauchen:
Die Hardware-Wallet muss sich zunächst auf die Nonce festlegen, die sie verwenden will, indem sie den öffentlichen Schlüssel der Geräte-Nonce an die Host-Wallet sendet:
deviceNoncePublicKey = deviceNonce × G
Die Hardware-Wallet gibt diesen Schlüssel der Host-Wallet preis und kann ihn später nicht mehr ändern.
Die Host-Wallet wählt die zufällige Nonce hostNonce
aus, und sendet sie an die Hardware-Wallet.
Die Hardware-Wallet verwendet dann eine kombinierte Nonce nonce = deviceNonce + hostNonce
für die endgültige Signatur. Die Nonce in der Signatur lautet dann wie folgt:
nonce×G = (deviceNonce + hostNonce) × G
Die Host Wallet kann überprüfen, dass ihr Nonce-Beitrag tatsächlich verwendet wurde und im endgültigen öffentlichen Nonce-Schlüssel enthalten ist:
nonce×G = deviceNonce × G + hostNonce × G (Distributionsgesetz)
= deviceNoncePublickey + hostNonce × G
Der Host kann dies tun, indem er den zuvor erhaltenen deviceNoncePublicKey
verwendet. Wenn diese Überprüfung fehlschlägt, bricht die Wallet des Hosts den Vorgang ab und überträgt die Transaktion nicht, so dass das Gerät nicht heimlich Geheimnisse herausschmuggen kann.
Ein paar Details müssen bei der Implementierung unbedingt beachtet werden:
- Die Hardware-Wallet darf nichts über die Nonce des Hosts erfahren, bevor sie ihre ursprüngliche Nonce preisgibt, sonst hat sie wieder volle Freiheit bei der Wahl der endgültigen Nonce. Die Host-Wallet muss dies sicherstellen.
- Die Hardware-Wallet darf nicht dieselbe Nonce für zwei verschiedene Host-Nonces verwenden, sonst kann kann die Host-Wallet den privaten Schlüssel errechnen. Dies wird erreicht, indem im Voraus der Hash des Host-Nonce an das Gerät gesendet wird. Die Hardware-Wallet kann damit je nach Host Nonce unterschiedliche Nonces erstellen.
Rollout
Jonas Nick hat als Erster das Anti-Klepto-Protokoll für die Verwendung mit Schnorr-Signaturen implementiert. Darauf aufbauend habe ich dasselbe für ECDSA-Signaturen implementiert und einen Pull-Request zum Review in der secp256k1-Bibliothek eröffnet. ECDSA ist das Signaturverfahren, das derzeit in Bitcoin und vielen anderen Altcoins verwendet wird, daher ist die Unterstützung dafür erforderlich, um das Anti-Klepto-Protokoll bereits heute nutzen zu können.
Wir haben die Unterstützung für das Protokoll-Update in der BitBox02-Firmware Version 9.4.0 mit dem BitBox-Update 01.2021 Monte Rosa veröffentlicht. Die BitBoxApp steuert ab Version 4.25 Nonces bei und verifiziert, dass die BitBox02 diese beim Signieren einer Bitcoin- oder Litecoin-Transaktion verwendet. Seither haben wir das Anti-Klepto-Protokoll auch beim Signieren von Ethereum-Transaktionen sowie beim Signieren von Bitcoin- und Ethereum-Nachrichten aktiviert. Irgendwann möchten wir die Nutzung dieses Protokolls verpflichtend machen, was jedoch ein Firmware-Upgrade erfordert.
Alle unsere quelloffenen BitBox02-Softwarebibliotheken wurden ebenfalls aktualisiert, um Anti-Klepto zu unterstützen. Das bedeutet, dass die Integration der BitBox02 in Wallets von Drittanbietern wie HWI, Electrum, MyEtherWallet usw. im Laufe der Zeit automatisch unterstützt wird.
Shoutout und Kommentar zur Open-Source-Zusammenarbeit
Vielen Dank an Stepan Snigirev, der mit seinem Blogbeitrag auf dieses Thema aufmerksam gemacht und es ausführlich erklärt hat. Er hat mich maßgeblich dazu motiviert, an einer produktionsreifen Implementierung dieses Protokolls für die BitBox02 und andere Hardware-Wallets zu arbeiten.
Die BitBox02 basiert auf der quelloffenen Kryptografie-Bibliothek secp256k1, die auch von Bitcoin Core verwendet wird.
Vielen Dank an Jonas Nick, der meinen Beitrag großzügig in vielen Iterationen geprüft hat. Der Prozess wurde für eine Weile unterbrochen, da Jonas mit BIP-Schnorr, MuSig2 und anderen interessanten Projekten beschäftigt war. Vielen Dank an Andrew Poelstra, der meine Arbeit aufgriff und sie bis zum endgültigen Merge in secp256k1-zkp begleitete. Danke auch an Tim Ruffing für die zusätzliche Überprüfung.
Ein großer Vorteil ist, dass die Arbeit quelloffen und Teil einer gut geprüften Bibliothek ist, sodass sie von jedem genutzt werden kann. Wir gehen davon aus, dass viele andere Hardware-Wallets und Offline-Signierer dieses Protokoll übernehmen werden und freuen uns darauf. Blockstream hat bereits angekündigt, dass sie ihre kürzlich eingeführte Hardware-Wallet Jade ebenfalls unterstützen werden.
Nützliche Ressourcen
- bitcointalk.org/index.php?topic=893898.msg9841502#msg9841502
- lists.linuxfoundation.org/pipermail/bitcoin-dev/2020-March/017667.html
- medium.com/cryptoadvance/hardware-wallets-can-be-hacked-but-this-is-fine-a6156bbd199
- andrea.corbellini.name/2015/05/17/elliptic-curve-cryptography-a-gentle-introduction/
Du hast noch keine BitBox?
Deine Kryptowährungen sicher zu halten muss nicht schwer sein. Die BitBox02 Hardware Wallet speichert die privaten Schlüssel deiner Kryptowährungen offline. So kannst du deine Coins sicher verwalten.
Die BitBox02 gibt es auch als Bitcoin-only-Version mit einer radikal fokussierten Firmware: weniger Code bedeutet weniger Angriffsfläche, was deine Sicherheit weiter verbessert, wenn du nur Bitcoin speicherst.
Hol dir eine in unserem Shop!
Frequently Asked Questions (FAQ)
Was ist das Anti-Klepto-Protokoll?
Das Anti-Klepto-Protokoll verhindert, dass eine böswillige Hardware-Wallet private Schlüssel durch manipulierte Nonces herausschmuggelt.
Warum wurde das Anti-Klepto-Protokoll eingeführt?
Es schützt Bitcoin und andere Kryptowährungen vor dem "Nonce Covert Channel"-Angriff, bei dem private Schlüssel durch manipulierte Nonces extrahiert werden können.
Wie funktioniert das Anti-Klepto-Protokoll?
Die BitBoxApp verlangt, dass die Hardware-Wallet eine eigene Nonce wählt und eine von der BitBoxApp gewählte Nonce hinzufügt, um böswillige Manipulationen zu verhindern.
Was ist eine Nonce?
Eine Nonce ist eine geheime Zahl, die von der Hardware-Wallet für digitale Signaturen frei gewählt werden kann und nur einmal verwendet wird.
Was ist der Vorteil von Open-Source-Zusammenarbeit in der BitBox02?
Die Arbeit ist quelloffen und Teil einer gut geprüften Bibliothek, sodass sie von jedem genutzt werden kann, was die Sicherheit und Transparenz erhöht.
BitBox Hardware-Wallets werden von der Shift Crypto AG, einem privaten Unternehmen mit Sitz in Zürich, in der Schweiz entwickelt und produziert. Unser Team aus Bitcoin-Entwicklern, Krypto-Experten und Sicherheitsingenieuren entwickelt Produkte, die unseren Kunden eine stressfreie Reise vom Anfänger zum Meister der Kryptowährung ermöglichen. Die BitBox02, unsere Hardware-Wallet der zweiten Generation, ermöglicht es den Nutzern, Bitcoin und andere Kryptowährungen zu speichern, zu schützen und mit Leichtigkeit zu handeln - zusammen mit der dazugehörigen Software, der BitBoxApp.