Comment voler du Bitcoin

Dernière modification le 8 mars 2014.

Note

Cet article est aussi disponible en anglais ici.

Chaque adresse Bitcoin se base sur une clé secrète, de laquelle on dérive la clé publique qui est l’adresse Bitcoin, et qui sert à signer les transactions.

Cette clé secrète est un entier non-signé codé sur 32 octets. En générant énormément de clés secrètes, on peut en dériver la clé publique et voir si l’adresse correspondant contient de l’argent. Si c’est le cas, on a donc un contrôle total sur l’adresse, puisqu’on possède la clé secrète associée.

Une telle attaque est totalement infaisable, puisque l’espace des clés secrète est tout à fait énorme. En effet, il y a 115792089237316195423570985008687907853269984665640564039457584007913129639936 clés secrètes possibles (1077).

D’ailleurs, tout cet espace est listé sur directory.io ! Bien sûr, ce site est plutôt une blague, puisque tout est évidemment calculé a la volée quand vous demandez une page. Il montre aussi le danger que vous avez a entrer votre clé secrète sur un site inconnu, par exemple pour voir si elle aurait été compromise…

Toutefois, il est possible de concentrer notre bruteforce sur des clés secrètes tout à fait particulières, et c’est ce sur quoi je vais me concentrer dans cet article.

Les clés privées sont des nombres...

Alors pourquoi pas essayer des nombres tout petits ?

J’ai concu un script qui essaie des clé privées à partir de 1, et je l’ai laissé tourner un peu. Il s’avère qu’il y a plus d’une dizaine d’adresse qui ont déjà servies, et qui ont des clés privées toutes petites (inférieures à 100 000).

En particulier, l’adresse 1EHNa6Q4Jz2uvNExL497mE43ikXhwF6kZm, qui correspond a la première clé privée (le nombre un !) a déjà été beaucoup utilisée puisque plus de 4 bitcoins y sont déjà passés.

Brainwallet

Brainwallet est un service permettant de créer des clés privées à partir d’une phrase de passe. Il crée la clé privée en calculant le sha256 du texte entré.

En sortant son gros dictionnaire, on peut donc concevoir une recherche de clés privées déjà utilisées, crées avec ce principe. Une recherche m’a permis de trouver quasiment 10 000 adresses par lesquelles de l’argent avait transité. Je n’ai jamais réussi a trouver d’adresse contenant encore de l’argent, et les sommes ayant transités par ces adresses étaient souvent complètement ridicules, mais voiçi un échantillon d’adresses intéressantes :

asd - 1G4Mt5JLtrdj4hM6MkyaQpHmZzVoojLFX3
cat - 162TRPRZvdgLVNksMoMyGJsYBfYtB4Q8tM
hello - 1HoSFymoqteYrmmr7s3jDDqmggoxacbk37
password - 16ga2uqnF1NqpAuQeeg7sTCAdtDUwDyJav
test - 1HKqKTMpBTZZ8H5zcqYEWYBaaWELrDEXeE
fuckyou - 1LdgTMX2MEqdfT3VcDpX4GyD1mqCP8LkYe
1 - 12AKRNHpFhDSBDD9rSn74VAzZSL3774PxQ
icecream - 1CwjHYsPUc4Du8dx7AkdBJj4ebWC8bxkF3
alfanumerico - 19JsLFDRxuTsAjapE79FgoVNdNdB2hNU5M
[empty string] - 1HZwkjkeaoZfTSaJxDw6aKkxp45agDiEzN
correct horse battery staple - 1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T

Si on regarde un peu l’historique des transaction sur ces adresses, on voit que dans pas mal de cas, quelques secondes après qu’un dépôt ait été effectué, l’argent est directement transféré vers un autre compte.

En particulier, j’ai pu constater que l’argent était souvent transféré vers une de ces adresses :

On remarque que la première adresse a volée 0.36 bitcoins, 2 secondes après qu’ils aient étés transférés sur l’adresse qui correspond a « alfanumerico » ! Au total, cette adresse semble contenir un peu plus de 1 bitcoins, volés automatiquement par un script... Le début de l’adresse « brain » est aussi plutôt explicite, au niveau de Brainwallet...

Autre fait intéressant, la seconde adresse vole des montants tout petits depuis des adresses classiques (« correct horse battery staple »...), et on remarque qu’un commentaire a été laissé sur une transaction :

Stop taking this dust! You must wait until there is more sent to complex ones! Set the trap...

Un voleur de bitcoins qui laisse un commentaire à destination d’un autre voleur lui disant d’arrêter de voler des montants ridicules et donc de risquer de se faire repérer, et plutôt d’attendre que des montants plus gros soient envoyés a des adresses plus difficiles à trouver...

Considérations techniques

Pour Bruteforcer des adresses comme cela, il est nécessaire d’être capable de trouver l’adresse associée a une clé privée, le plus rapidement possible. Mais, il faut aussi être capable de savoir si chaque adresse a déjà été utilisée dans une transaction !

Pour cela, il est nécessaire de parcourir toute la blockchain tout en remplissant un filtre de Bloom, avec chaque adresse vue dans la blochain. Une fois qu’il est construit, on peut donc savoir si une adresse a déja été utilisée dans une transaction en un temps extrêmement réduit.

Comme on l’a vu, il semble aussi que des gens ont construit de gigantesques bases de données, faisant la correspondance entre des adresses et leur clé privée associée. Ils semblent capables de voler l’argent déposé dessus seulement quelques secondes après qu’il y ait été déposé...

Conclusion

Une chose est sûre : il y a donc de l’argent a faire là-dessus, et on a la preuve que plusieurs personnes exploitent ce filon...

Cela démontre aussi que vous pouvez utiliser un service comme Brainwallet, mais à condition de choisir une phrase de passe extrêmement solide, qui résistera au bruteforce. Si un seul ordinateur ou humain peut y penser, il peut tout voler.

Au lieu d’attaquer toutes les adresses potentielles qui utilisent une clé privée faible, c’est aussi possible de se concentrer sur des problèmes sur les générateurs de nombres aléatoires, ou des problèmes d’implémentation de ECDSA. Ce type d’attaque est aussi une réalité, et vous pouvez aller voir cet article pour plus d’informations.