de
Zurück zur Liste

Hacker knackt Bitcoin-Adresse – und demonstriert damit, wie extrem sicher Bitcoin ist

source-logo  bitcoinblog.de 25 Juni 2020 08:40, UTC

Der Hacker und Lightning-Entwickler John Cantrell hat eine Bitcoin-Adresse geknackt, auf der ein Bitcoin lag. Befürchtungen, dass Bitcoins damit unsicher sind, sind aber unnötig. Ganz im Gegenteil. Denn Cantrell hatte einen entscheidenden Hinweis.

Es begann damit, dass John Cantrell auf einen Wettbewerb einstieg, den Alistair Milne auf Twitter gepostet hatte:

The private keys to the 1BTC wallet at: 3HX5tttedDehKWTTGpxaPAbo157fnjn89s were generated from a 12-word mnemonic seed

Over the next ~30 days I will be releasing the words (or a clue to a word) on my various social media pages

— Alistair Milne (@alistairmilne) May 28, 2020

Milne postete eine Adresse, auf der ein Bitcoin liegt. Er erklärte, diese Adresse mit einer 12-Wörter-Mnemonik generiert zu haben, und kündigte an, im Lauf der folgenden 30 Tage die Wörter zu veröffentlichen.

Cantrell ist vor allem als Lightning-Entwickler bekannt. Er hat beispielsweise Juggernaut entwickelt, ein Tool, um im Lightning-Netzwerk verschlüsselte Nachrichten zu versenden. Der Lightning-Node wird dabei zum Chat-Server. Als er von dem Wettbewerb hörte, beschloss er, den Bitcoin mitzunehmen. Also begann er zu kalkulieren.

In einem Blogpost erzählt er, wie es ihm gelang, die Adresse zu knacken.

Mathematik und Grafikkarten

Wenn die Mnemonik mit BIP39 geschaffen wurde, besteht sie aus zwölf von 2048 möglichen Wörtern. „Das bedeutet, wenn wir alle möglichen Phrasen iterieren würden, müssten wir von 0 zu  2^128−1 zählen. Jede Zahl wäre eine einzelne Mnemonik, die in eine Adresse übersetzt werden würde.“ Das „^“ steht für „hoch“. Die Zahl 2^128−1 ist verwirrend, weil ein Nicht-Mathematiker kaum erkennt, ob sie nun groß, sehr groß oder extrem groß ist.

Man könnte an die arabische Legende vom Schachbrett denken. Ein König erfüllt einem Diener einen Wunsch, und der möchte, dass sein König ein Reiskorn auf ein Feld eines Schachbretts legt, und dann die Anzahl der Körner bei jedem weiteren Feld verdoppelt. Ein Schachbrett hat 64 Felder, daher wäre die Formel für die Anzahl an Reiskörnern, die auf das letzte Feld gelangen, 2^64−1. Das sind mehr als 9 Trillionen Reiskörner. Die gesamte Menge auf dem Schachbrett wären 18 Trillionen Reiskörner, was laut Wikipedia mehr als tausend Mal so viel Reis ist, wie die gesamte Erde 2017 produziert hat.

Und diese Zahl ist nur ein Bruchteil der Anzahl an Möglichkeiten einer Seed. Mit jeder weiteren Hochzahl verdoppelt sich die Summe etwa. 2^128 wäre diese Zahl:

340.282.366.920.938.463.463.374.607.431.768.211.456

Wenn ich richtig gezählt habe, wären das 340 Quintilliarden. Ich habe keine Ahnung, ob es dafür irgendeine Entsprechung in der Wirklichkeit gibt. Für die Computer, die wir heute benutzen, ist es in jedem Fall unendlich viel zu viel.

Aber zum Glück für Cantrell hat Milne im Lauf der Zeit immer weitere Wörter der Seedphrase verlautbart. „Jedes Wort, das wir kennen, reduziert die Möglichkeiten, die wir prüfen müssen, um 2^11 oder 2048“. Die Schwelle, ab der es für Cantrell realistisch war, waren acht Wörter. „Mit acht Wörten kennen wie 8*11 oder 88 Bits der 128 Bits, die wir rausfinden wollen. Das bedeutet, es gibt ’nur‘ noch 2^(128-88) oder 2^40 mögliche Mnemoniks, die wir prüfen müssen.“ Das sind etwa 1,1 Trillionen Optionen. Wir haben also eine Zahl, die deutlich kleiner ist, als die am Ende des berühmten Schachbretts.

Also hat Cantrell es versucht. Er schrieb ein Script in Rust, um die Hashes und elliptischen Kurven, die involviert sind, zu berechnen. Aber mit der CPU seines Laptops konnte er damit nur etwa 1.250 Seeds je Sekunde berechnen, womit er 25 Jahre gebraucht hätte, um alle Kombinationen durchzugehen. Also mietete er einen CPU-Server mit 32 Kernen. Das brachte ihn auf 8.000 Seeds je Sekunde. Aber das war immer noch lange nicht genug.

Der nächste Schritt war es, von der CPU auf eine GPU umzusteigen. CPUs, die Kernrecheneinheiten aller Computer, sind nicht sehr schnell, können dafür aber alles. GPUs, wie sie in Grafikkarten verbaut sind, sind sehr viel schneller, aber nur für Aufgaben zu gebrauchen, die man gut parallelisieren kann – wie das Abarbeiten von Seeds. Cantrell lernte also, für GPUs zu programmieren. Nachdem er ein Script dafür geschrieben hatte, konnte er mit einer nVidia 2080Ti Grafikkarte 12 Milliarden Seeds am Tag ausrechnen. Das war schon mal gut, aber er würde noch immer 83 Tage brauchen. Er schrieb noch eine Bibliothek um, um einen Rechenvorgang zu beschleunigen, aber das senkte den Zeitraum nur um drei Tage. Um den Schlüssel also innerhalb von 24 Stunden zu finden, musste er mit 80 Grafikkarten arbeiten.

Diese GPU-Farm konnte er über einen digitalen Marktplatz anmieten. Er ließ sein Programm laufen und wartete gespannt darauf, ob es funktionierte und ob seine Kalkulationen korrekt gewesen waren. Und, ja, sie waren es, zumindest im Groben. Nach etwa 30 Stunden fand er den Schlüssel zu der genannten Adresse. Er überwies sich den Bitcoin und fügte eine hohe Transaktionsgebühr hinzu, um sicherzugehen, dass ihn niemand anderes überbot, der den Schlüssel vielleicht ebenfalls gefunden hatte.

Konsequenzen für die Sicherheit

Eine oberflächliche Lesart des Hacks könnte dazu verleiten, zu denken, Bitcoin wäre nicht sicher. Tatsächlich aber zeigt der Fall, dass eine Seed unglaublich sicher ist. Wenn es schon so aufwändig ist, die Seed zu vervollständigen, wenn man acht Wörter hat – dann wird es beinah unmöglich, in einem vernünftigen Zeitraum und zu vernünftigen Kosten einen Seed zu knacken, selbst wenn man 5 oder 6 Wörter hat. Für einen kompletten Seed wäre man in Zahlenbereichen, bei denen man vermutlich Sterne verglühen lassen müsste.

Vor allem hatte Cantrell einen entscheidenden Vorteil: er wusste, um welche Adresse es sich handelt. Daher konnte er sein Script danach schauen lassen, ob sich aus einem Seed diese eine Adresse ableitete. Was aber, wenn man die Adresse nicht kennt? In dem Fall muss man einen Bitcoin-Node fragen, ob auf den Adressen ein Guthaben ist, und das bei jeder der eine Trillion Adressen. Die API des Bitcoin-Nodes würde eine solche Last nicht mitmachen; eventuell könnte man die Blockchain in eine andere Datenbank überspielen und sie dann fragen. Aber auch das würde gewaltige Ressourcen erfordern, da die Datenbank auf demselben System sein müsste die GPU; selbst eine Abfrage in einem lokalen Netzwerk würde vermutlich die Performance empfindlich stören.

Für das Speichern von Bitcoins hat das nun einige interessante Konsequenzen:

1. Ist es gar nicht so blöd, beispielsweise 4 oder 5 oder vielleicht sogar 6 Wörter in der Cloud zu speichern. Solange die Adresse nicht bekannt ist, weiß ein Hacker nicht, ob es sich lohnt, 100 Grafikkarten über Tage hin laufen zu lassen. Man könnte daraus neue Sicherheitskonzepte generieren, beispielsweise dass man 6 Wörter in der Cloud dupliziert speichert, und sich den Rest ins Gedächtnis einprägt oder verschlüsselt abspeichert. Eine solche hybride Methode könnte Brainwallets wieder attraktiv machen.

2. Wenn Sie eine Seed haben, und einige Wörter nicht lesen können, aber bei mindestens acht Wörtern sicher sind: Sie können die Scripte verwenden, die Cantrell am Ende seines Posts verlinkt. Wenn Sie nicht in der Lage sind, 80 GPUs zu koordinieren oder die Scripte auf Ihrem System 80 Tage laufen zu lassen – je nach Inhalt der Wallet lohnt es sich, einen Experten zu engagieren.

bitcoinblog.de