Sicherheitsanfälligkeit in Bitcoin Pseudo Random Number

Private Bitcoin-Schlüssel haben einen ganzzahligen Wert von 1 bis 115792089237316195423570985008687907852837564279074904382605163141518161494337 oder in HEX 1 bis 0xfffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd6414b. Im Hauptnetzwerk von Bitcoin gibt es Adressen, die mit 1 beginnen: komprimiert, unkomprimiert; 3 Adressen: SigScript und abwärtskompatibel mit SegWit sowie native SegWit-Adressen ab bc1. Darüber hinaus gibt es bereits etwa siebzig Gabeln mit unterschiedlichen Präfixen, aber denselben Wurzeln wie das Haupt-Bitcoin.

Bitcoin-Adressen werden von der kryptografischen Signaturfunktion ECDSA () basierend auf einer elliptischen Kurve berechnet.

Betrachten Sie also die Generierung einer Bitcoin-Adresse aus einem privaten Schlüssel.

Private Schlüssel d - Nummer
Der öffentliche Schlüssel Q ist der Punkt der elliptischen Kurve gleich dG,
Dabei ist G der Basispunkt der Kurve.

  • Zur Signatur wird eine Zufallszahl k im Bereich [1, n-1] ausgewählt.
  • Der Punkt der Kurve wird berechnet (x1, y1) = k * G.
  • Es berechnet r = x1 mod N, wobei N die Ordnung der Kurve ist.
  • Es berechnet s = k-1 (H (m) + rd) mod N, wobei k-1 die inverse Zahl von N zu k modulo N ist.
  • H (m) ist der Hash der zu signierenden Nachricht.

Bild

Die Signatur ist ein Paar (r, s).

Die Variable "k" ist zufällig und wird im ECDSA-Algorithmus aus Standardbibliotheken des Betriebssystems erhalten.

Somit können Sie in der gesamten Funktion nur diese Variable beeinflussen. Was zwei Angriffsvektoren ergibt:

  1. Pseudo-Zufallszahlen-Sicherheitslücke
  2. und universelles Glück, bei dem eine Zufallszahl zweimal fällt


Angriff des Pseudozufallszahlengenerators


Nils Schneider war der erste, der dieses Problem am 28. Januar 2013 auf seiner persönlichen Seite untersuchte und veröffentlichte. Das Problem blieb jedoch bestehen und erhielt darüber hinaus eine neue Dimension.

Ein Software-Angriff auf das PRNG wird in drei Typen unterteilt:
Direkter kryptografischer Angriff basierend auf der Analyse der Ausgabe des Algorithmus.

Angriffe, die auf Eingabedaten basieren, können in Angriffe mit bekannten Eingabedaten, Angriffe mit reproduzierbaren Eingabedaten und Angriffe auf ausgewählte Eingabedaten unterteilt werden.

Angriffe basieren auf der Offenlegung des internen Zustands, in dem der Angreifer den Anfangs- oder Anfangszustand des Generators kennt.

Hier sind auch Lesezeichen in der Software enthalten, in denen der Ersteller des Algorithmus eine der gehashten Pseudozufallszahlen und die nachfolgenden in der Kette kennt. Ein solcher Algorithmus ist von außen schwer zu bestimmen, da die Zahlen gleichmäßig über den gesamten Bereich verteilt aussehen.

Zu den Sicherheitslücken in der Software gehört auch die schwache Erzeugung von Pseudozufallszahlen in einzelnen Bibliotheken. Wie SSL, OpenSSL, einige Java-Bibliotheken, JavaScript usw. Detaillierte Materialien wurden wiederholt in Hacking-Zeitschriften beschrieben und sind im Laufe der Zeit zu Beispielen in Kryptographie-Lehrbüchern geworden.

Wie groß ist die Bedrohung für Bitcoin?


Mit einem vollständigen Bitcoin-Knoten können Sie alle Netzwerktransaktionen vergleichen und gruppieren. Es reicht aus, die Variable "k" in allen Transaktionen an jeder Adresse zu vergleichen und Duplikate zu finden.

Das erste Mal, dass wir Ende 2016 eine Abstimmung durchgeführt haben, umfasste die Datenbank mehr als 210 Millionen Adressen, Transaktionen mit insgesamt mehr als 170 Millionen Adressen und 447 Millionen Signaturen. Es dauerte eine Woche, um die anfälligen Adressen in zehn Threads zu scannen.

Als Ergebnis wurden 1327 anfällige Adressen mit denselben Signaturen gefunden! Eine Liste der Adressen finden Sie am Ende des Artikels.

Dies bedeutet, dass Sie den privaten Schlüssel für diese Adressen berechnen können, was bedeutet, dass Sie die Kontrolle über das Geld erlangen.

Das größte Leck trat im Sommer 2015 auf. Die JavaScript-Brieftasche Blockchain.info erzeugte mehrere Stunden lang den gleichen Wert der Variablen "k". Was zum Diebstahl von etwa 200 Bitcoins führte!

Wenn wir den menschlichen Faktor von Software-Schwachstellen entfernen, beträgt die Wahrscheinlichkeit eines Zufalls ungefähr 0,000296868%. Überhaupt nicht viel, aber ich würde wirklich nicht so "glücklich" werden und mein Geld verlieren wollen.

Wie gehe ich damit um?


Wie oben beschrieben, funktioniert diese Sicherheitsanfälligkeit nur, wenn Zahlungen gesendet und dieselbe Variable "K" für mindestens zwei Transaktionen generiert werden. Wenn Sie also keine ausgehenden Transaktionen erstellen oder deren Anzahl minimieren, besteht keinerlei Bedrohung. Eine solche Idee ist seit langem im Bitcoin-Protokoll BIP 32 (Hierarchical Deterministic Wallets, HD Wallet) Hierarchical Deterministic Wallet implementiert.

Seine Idee ist es, einen privaten Schlüssel zu verwenden, über den Sie eine endlose Kette von Bitcoin-Adressen erhalten können. Sie können eine einmalige Adresse verwenden, um jede einzelne Transaktion zu erhalten. Gleichzeitig ist der Kontostand der HD-Brieftasche die Summe aller Guthaben der Adresskette. Bei einer ausgehenden Transaktion werden Münzen von diesen Adressen gesammelt, was eine ausgehende Transaktion für jede Bitcoin-Adresse ergibt. Die Änderung wird an die neue Bitcoin-Adresse aus der Adresskette weitergeleitet.

Dieses Arbeitsschema erhöht die Sicherheit und Anonymität der Brieftasche erheblich.

Referenzen:

[1] ECDSA - Anwendungs- und Implementierungsfehler, Markus Schmid, UC SANTA BARBARA, CS 290G, HERBST 2015.

[2] Nils Schneider: Wiederherstellen privater Bitcoin-Schlüssel mithilfe schwacher Signaturen aus der Blockchain, Blogeintrag, 28. Januar 2013.

[3] Kombinationsangriffe zur Wiederherstellung privater Schlüssel

[4] Liste der gefährdeten Adressen und Gesamtbilanz

Source: https://habr.com/ru/post/de430240/


All Articles