Vulnérabilité liée au nombre pseudo-aléatoire de Bitcoin

Les clés Bitcoin privées sont une valeur entière de 1 à 115792089237316195423570985008687907852837564279074904382605163141518161494337 ou en HEX 1 à 0xfffffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd64. Dans le réseau Bitcoin principal, il existe des adresses commençant par 1: compressé, non compressé; 3 adresses: SigScript et rétrocompatible avec SegWit, ainsi que les adresses natives SegWit commençant par bc1. En outre, il existe déjà environ soixante-dix fourchettes avec des préfixes différents, mais les mêmes racines que le Bitcoin principal.

Les adresses Bitcoin sont calculées par la fonction de signature cryptographique ECDSA () sur la base d'une courbe elliptique.

Considérez donc la génération d'une adresse Bitcoin à partir d'une clé privée.

Clé privée d - numéro
La clé publique Q est le point de la courbe elliptique égal à dG,
où G est le point de base de la courbe.

  • Pour la signature, un nombre aléatoire k est sélectionné dans la plage [1, n-1].
  • Le point de la courbe est calculé (x1, y1) = k * G
  • Il calcule r = x1 mod N, où N est l'ordre de la courbe.
  • Il calcule s = k-1 (H (m) + rd) mod N, où k-1 est le nombre inverse de N à k modulo N.
  • H (m) est le hachage du message en cours de signature.

image

La signature est une paire (r, s).

La variable "k" est aléatoire et est obtenue dans l'algorithme ECDSA à partir des bibliothèques standard du système d'exploitation.

Ainsi, dans toute la fonction, vous ne pouvez affecter que cette variable. Ce qui donne deux vecteurs d'attaque:

  1. vulnérabilité de nombre pseudo aléatoire
  2. et la chance universelle dans laquelle un nombre aléatoire tombe deux fois


Attaque par générateur de nombres pseudo-aléatoires


Nils Schneider a été le premier à enquêter et à publier ce problème le 28 janvier 2013 sur sa page personnelle. Mais le problème a persisté et a d'ailleurs acquis une nouvelle ampleur.

Une attaque logicielle sur le PRNG est divisée en trois types:
Attaque cryptographique directe basée sur l'analyse de la sortie de l'algorithme.

Les attaques basées sur les données d'entrée peuvent être divisées en attaques avec des données d'entrée connues, attaques avec des données d'entrée reproductibles et attaques contre des données d'entrée sélectionnées.

Attaques basées sur la révélation de l'état interne dans lequel l'attaquant connaît l'état initial ou initial du générateur.

Sont également inclus ici des signets dans le logiciel, dans lesquels le créateur de l'algorithme connaît l'un des nombres pseudo-aléatoires hachés et les suivants dans la chaîne. Un tel algorithme est difficile à déterminer de l'extérieur, car les chiffres semblent uniformément répartis sur toute la plage.

Les vulnérabilités logicielles comprennent également la faible génération de nombres pseudo-aléatoires dans les bibliothèques individuelles. Tels que SSL, OpenSSL, certaines bibliothèques Java, JavaScript, etc. Des documents détaillés ont été décrits à plusieurs reprises dans des périodiques de piratage et, avec le temps, sont devenus des exemples dans les manuels de cryptographie.

Quelle est l'ampleur de la menace pour Bitcoin?


Ayant un nœud Bitcoin complet, vous pouvez comparer et regrouper toutes les transactions réseau. Il suffit de comparer la variable «k» dans toutes les transactions à chaque adresse et de trouver des doublons.

La première fois que nous avons effectué le rapprochement fin 2016, la base de données s'élevait à plus de 210 millions d'adresses, les transactions avec un total de plus de 170 millions d'adresses et les signatures 447 millions. Il a fallu une semaine pour analyser les adresses vulnérables en dix threads.

En conséquence, 1327 adresses vulnérables avec les mêmes signatures ont été trouvées! Une liste d'adresses se trouve à la fin de l'article.

Cela signifie que vous pouvez calculer la clé privée de ces adresses, ce qui signifie prendre le contrôle de l'argent.

La fuite la plus importante s'est produite à l'été 2015. Le portefeuille JavaScript Blockchain.info a produit pendant plusieurs heures la même valeur que la variable "k". Ce qui a conduit au vol d'environ 200 Bitcoins!

Si l'on supprime le facteur humain des vulnérabilités logicielles, la probabilité de coïncidence est d'environ 0,000296868%. Pas du tout beaucoup, mais je ne voudrais vraiment pas devenir si «chanceux» et perdre mon argent.

Comment y faire face?


Comme nous l'avons décrit ci-dessus, cette vulnérabilité ne fonctionne que lors de l'envoi de paiements et de la génération de la même variable «K» sur au moins deux transactions. Par conséquent, si vous ne créez pas de transactions sortantes ou ne réduisez pas leur nombre, il n'y a aucune menace. Une telle idée a longtemps été mise en œuvre dans le protocole Bitcoin BIP 32 (Hierarchical Deterministic Wallets, HD wallet) Hierarchical Deterministic Wallet.

Son idée est d'utiliser une clé privée à partir de laquelle vous pouvez obtenir une chaîne infinie d'adresses Bitcoin. Vous pouvez utiliser une adresse unique pour recevoir chaque transaction individuelle. Dans le même temps, le montant du solde du portefeuille HD est la somme de tous les soldes de la chaîne d'adresses. Et avec une transaction sortante, des pièces sont collectées à partir de ces adresses, constituant une transaction sortante pour chaque adresse Bitcoin. La modification sera dirigée vers la nouvelle adresse Bitcoin de la chaîne d'adresses.

Ce schéma de travail augmente considérablement la sécurité et l'anonymat du portefeuille.

Références:

[1] ECDSA - Application and Implementation Failures, Markus Schmid, UC SANTA BARBARA, CS 290G, FALL 2015.

[2] Nils Schneider: Récupération de clés privées Bitcoin à l'aide de signatures faibles de la blockchain, entrée de blog, 28 janvier 2013.

[3] Attaques combinées de récupération de clé privée

[4] Liste des adresses vulnérables et bilan global

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


All Articles