La monnaie décentralisée Bitcoin et sa sécurité
Date : 07 Janvier 2014
Introduction
La cryptomonnaie Bitcoin, rendue publique en 2009 par une personne utilisant le pseudonyme de « Satoshi Nakamoto », est devenue populaire à la fin de l’année 2012. A l’heure actuelle, il n’a pas pu être établi de lien entre ce pseudonyme et l’identité de personnes réelles. Nakamoto a annoncé avoir travaillé sur le projet Bitcoin pendant 2 ans avant sa publication sur une liste de diffusion, sous la forme d’un papier décrivant la monnaie électronique.
Dès lors, de plus en plus d’acteurs de l’Internet se sont mis à accepter cette nouvelle monnaie, sans qu’un consensus mondial des états soit établi sur la légalité de cette monnaie décentralisée : certains pays ont ainsi complètement banni la monnaie (par exemple la Chine) tandis que d’autres sont encore dans le processus de réflexion sur son utilisation (comme les Etats-Unis).
L’actualité de l’année 2013 retracée dans la veille média menée quotidiennement par le Cert-IST a été marquée par :
- la découverte de failles et d’attaques sur plusieurs plates-formes d’échange de la monnaie électronique Bitcoin (déni de service sur le site Mt. Gox en mars et faille sur Bitcoin Central en avril, failles découvertes en août concernant le générateur de nombres pseudo-aléatoires de l’implémentation Android de Bitcoin),
- l’apparition de malwares (comme le botnet Skynet, ou la campagne malware récemment découverte par LogRythm) capables de dérober les portefeuilles électroniques ou de participer au « mining Bitcoin », constituant de facto une nouvelle façon de s’enrichir sur le marché de la cybercriminalité.
Cet article va survoler les principes techniques de fonctionnement de cette crypto-monnaie et tenter de déterminer si les récents évènements du monde de la sécurité relatifs à Bitcoin sont des conséquences d’un manque de sécurité de la technologie ou d’autres facteurs externes.
Technique et fonctionnement d’une transaction Bitcoin
Bitcoin a été initialement introduit par son auteur sous la forme du code source d’un programme client (Bitcoin-Qt) et d’un protocole réseau associé. La monnaie fonctionne sur un mode pair-à-pair qui ne nécessite pas de serveur central. Au contraire du système bancaire classique où les personnes accordent leur confiance dans les banques pour sécuriser les transactions, le rôle du tiers de confiance dans Bitcoin est joué par le réseau lui-même et l’ensemble de ses utilisateurs.
Pour vendre et acheter en bitcoins, un utilisateur du réseau doit générer un couple de clés publique/privée. La clef (ou adresse) publique, constituée d’une série de chiffres et de lettres, permet de recevoir de l’argent de la part d’un autre utilisateur. L’autre partie, privée, est conservée précieusement et constitue le portefeuille Bitcoin, c’est à dire le moyen d’envoyer de l’argent via des transactions numériquement signées.
Chaque membre du réseau trace l’intégralité de toutes les transactions en bitcoins de tous les utilisateurs au moyen d’un registre (nommé « chaîne de blocs ») qui est créé sur le client lors de sa première connexion au réseau. Ce registre stocké chez chaque participant est donc d’un volume conséquent. Le solde d’une adresse donnée est déterminé en parcourant ce registre et en additionnant les différents versements. Aucune autorité centrale ne stocke le solde d’un compte. La monnaie Bitcoin offre donc un anonymat limité, puisqu’il est possible de connaître pour une adresse donnée l’historique (et donc le montant) de toutes les transactions effectuées par celle-ci.
Lorsqu’une transaction en bitcoins est créée, elle est signée par la clef privée de son émetteur et émise sur le réseau, qui va la propager de proche en proche. La transaction est alors considérée comme non vérifiée pour le moment, jusqu’à ce que d’autres utilisateurs du réseau la vérifient au moyen de la clef publique de l’émetteur.
Les ordinateurs qui participent à la vérification des transactions en bitcoins sont appelés mineurs. Pour vérifier une transaction, la première étape est d’en valider l’authenticité avec la clef publique. La deuxième étape est de vérifier que cette transaction est possible (c’est-à-dire que l’émetteur possède suffisamment de bitcoins pour cette transaction). Cette phase est effectuée en référençant d’anciennes transactions qui seront autant de preuves que l’argent est effectivement disponible.
Une fois vérifiées, les mineurs sont chargés de regrouper les opérations en blocs, formant un à un, une unique chaîne d’opérations validées par le réseau (chaque bloc faisant référence au précédent, à la manière d’une liste chaînée).
L’ajout d’un bloc à la chaîne est cependant non trivial : les mineurs doivent calculer un hash cryptographique SHA-256 issu d’un ensemble de nouvelles transactions et d’un nombre aléatoire de manière à ce que le résultat débute par un certain nombre de zéros. Ce résultat étant statistiquement difficile à obtenir, les mineurs sont obligés d’essayer successivement plusieurs nombres jusqu’à ce que l’un d’entre eux parvienne à résoudre ce challenge mathématique et ajoute ainsi un nouveau bloc de transactions à la chaîne. C’est grâce à la rareté de cet évènement qu’un consensus est établi sur le réseau concernant la validité des transactions. Le protocole Bitcoin est prévu pour adapter la difficulté de ce challenge pour qu’en moyenne, un unique client du réseau y parvienne toutes les 10 minutes. Ainsi, puisqu’il n’y a qu’un seul nouveau bloc valide propagé suite à cet évènement, la chaîne de blocs est unique à l’ensemble du réseau et le consensus est établi.
Le nouveau bloc ajouté à la chaîne contient enfin une transaction ex-nihilo pour récompenser le mineur gagnant qui est parvenu à trouver le bon hash. C’est par ce processus que de nouveaux bitcoins sont introduits dans le réseau.
Qualités de sécurité
De par la nature complètement distribuée du réseau, et le très grand nombre de participants, il est extrêmement difficile de mener une attaque par déni de service distribué (DDoS) contre Bitcoin. Les implémentations de Bitcoin contiennent en outre une série de vérifications réalisées systématiquement à chaque réception d’un message, qui permettent d’éviter de relayer inutilement de faux messages (et donc de constituer une attaque DDoS par diffusion).
Un autre avantage important est celui de ne pas avoir à divulguer d’information sensible pour faire un achat, au contraire d’un classique paiement par Carte Bleue sur Internet. Lors d’une transaction en bitcoins, la clef privée nécessaire à l’opération n’est jamais envoyée sur le réseau. Seul l’enregistrement de la transaction signé par son émetteur l’est et l’authentification est effectuée par les mineurs. Il est cependant toujours nécessaire lors d’un achat de s’assurer de l’authenticité de l’adresse Bitcoin sur laquelle envoyer des fonds (pour éviter par exemple le cas où sur un site marchand compromis, un pirate a modifié l’adresse associé au compte Bitcoin par la sienne).
L’algorithme et les choix cryptographiques faits par son concepteur assurent également qu’il est impossible de tromper le système des transactions. Le système des blocs de transactions statistiquement difficile à résoudre assure un ordre dans les transactions, et empêche un éventuel attaquant de jouer sur les temps de propagation des opérations en envoyant deux transactions : une légitime vers le vendeur pour lui prouver que l’argent est versé, et une seconde adressée par l’attaquant à lui-même, en espérant que celle-ci soit validée avant la transaction légitime (cette attaque est connue sous le nom de « Double-Spending »). La chaîne empêche en effet d’utiliser plus d’une fois le résultat d’une précédente transaction pour valider un envoi de bitcoins.
La robustesse de Bitcoin est prouvée jusque dans les cas limites et improbables. Il existe ainsi une probabilité non-nulle que deux mineurs parviennent à résoudre le challenge du bloc au même moment. Dans un pareil cas, deux chaînes de blocs différentes coexisteraient donc dans le réseau. Cet état incohérent va persister jusqu’à ce que l’une des deux chaînes soit agrandie par un autre mineur. Lorsque cet évènement se produit, la chaîne la plus courte est supprimée.
Le point précédent amène la notion de statut de la transaction. Une fois une transaction effectuée, les clients l’affichent comme « 0/unconfirmed », signifiant que cette transaction n’a pas encore été vérifiée et intégrée dans un nouveau bloc ajouté à la chaîne. Le client va ensuite tracer le nombre de blocs présents dans la chaîne et la position de la transaction. Plus cette position est profondément ancrée dans la chaîne, moins le scénario d’une duplication de cette chaîne est probable. Il est ainsi recommandé d’attendre l’apparition d’un nouveau bloc de transaction pour des petites sommes, et plusieurs pour des sommes importantes.
Risques
Le système de validation des transactions étant basé sur un problème mathématiquement difficile et improbable à résoudre, il est très difficile pour un attaquant de s’introduire dans le réseau et de faire valider des transactions illégitimes. Il faudrait ainsi parvenir à intégrer une fausse transaction dans un nouveau bloc et parvenir à résoudre le challenge mathématique nécessaire pour que le réseau l’accepte dans la chaîne.
Cependant, certains commerçants considèrent comme valides des transactions non vérifiées (« 0/unconfirmed ») et n’attendent pas plusieurs créations de blocs pour considérer une transaction comme réalisée. En pareil cas, il est possible d’imaginer un scénario où l’attaquant isolerait la cible du réseau et serait le point de passage de chacune de ses connexions au réseau Bitcoin : il pourrait alors choisir de relayer certaines informations plutôt que d’autres, et jouer sur les attaques de « double-spending ». Pour réduire ce risque, la recommandation est de ne considérer comme valides que les transactions ayant été introduites dans un bloc ajouté à la chaîne. Parce que la validation d’un bloc est très rare, il est quasiment impossible pour l’attaquant, même avec une forte puissance de calcul, de générer suffisamment de faux blocs pour faire croire à la cible que cette transaction est validée.
Le risque le plus important se situe en réalité sur la conservation de la partie privée de la clef, qui constitue la seule information nécessaire à l’utilisation d’un portefeuille Bitcoin. Certains programmes clients sont basés sur un stockage de cette clef localement sur le poste de l’utilisateur (de manière chiffrée pour certains) tandis que d’autres portefeuilles sont basés sur un service en ligne ou de type cloud, pour lequel l’utilisateur n’a d’autre choix que de se fier à la sécurité de l’infrastructure. Et bien sûr, certaines infrastructures ne sont pas fiables. Par exemple le service de portefeuille proposé par le tchèque Bitcash.cz a été piraté et les clefs de 4000 portefeuilles ont été dérobées…
Au final, les problématiques de sécurité de Bitcoin sont les mêmes que celles de la conservation de ses identifiants bancaires et de l’authentification d’un compte sur lequel faire un virement.
Pour ce qui concerne l’intégrité des données confiées à la banque :
- Un système bancaire classique repose sur la confiance de ses clients et les autorités de contrôles
- Le système Bitcoin repose sur la robustesse cryptographique et l’irréversibilité des transactions, une fois celles-ci validées.
Conclusion
Incontestablement, Bitcoin est une prouesse technique. Son auteur a réussi à créer un contexte monétaire décentralisé et sûr, et à générer une confiance en une crypto-monnaie reposant sur d’autres hôtes inconnus sur Internet, auxquels aucune confiance ne peut a priori être accordée.
Ce survol technique du fonctionnement de Bitcoin montre que les risques de la crypto-monnaie et de son protocole en lui-même sont minimes, et que les récents évènements l’affectant sont liés à des vulnérabilités et des attaques qui ne sont pas fondamentalement nouvelles (compromission d’un site, malwares visant à dérober des informations bancaires, confiance accordée aux services en ligne), et qui portent plutôt sur l’écosystème de Bitcoin et non pas sur sa technologie.
Sources :
Official Bitcoin website : http://bitcoin.org/
Bitcoin Wiki : https://en.bitcoin.it/wiki/Main_Page