Guide sur la malléabilité des transactions Bitcoin

Sommaire

  1. Qu’est-ce qu’une transaction Bitcoin ?
  2. Qu’est-ce que la malléabilité des transactions ?
  3. Est-ce la même chose qu’une double dépense ?
  4. Comment fonctionne la malléabilité des transactions ?
  5. Comment cela peut-il causer des problèmes ?

Aujourd’hui, nous allons comprendre ce qu’est la malléabilité des transactions sur le protocole Bitcoin, une faille qui a fait de très gros dégâts, notamment sur la plateforme Mt. Gox au début de l’année 2014, qui a entrainé une perte de 744 408 bitcoins.

Qu’est-ce qu’une transaction Bitcoin ?

Les transactions consistent à débiter certains comptes pour en créditer d’autres.

Elles sont composées d’entrées (inputs) et de sorties (outputs). Chaque sortie comporte un montant et la clé publique de l’adresse créditée, ou plus généralement un programme permettant de déterminer cette adresse (un « script »). Chaque entrée désigne une sortie d’une transaction antérieure et comporte un programme (script) qui fournit les données attendues par le script figurant dans cette sortie.

Lors de la validation d’une transaction, les scripts de chaque entrée sont exécutés ; d’abord le script de la sortie antérieure à laquelle l’entrée fait référence, puis le script de l’entrée elle-même. La transaction n’est validée que si le résultat est « vrai » pour toutes les entrées.

Ces scripts sont écrits dans un langage interne conçu par Nakamoto. Ce langage est volontairement minimaliste et non Turing-complet afin notamment d’éviter que le système ne puisse s’engager dans des boucles infinies. L’utilisation des scripts doit permettre au logiciel de s’adapter aisément à des évolutions ultérieures et permettre la prise en charge de fonctionnalités avancées telles que les transactions impliquant plusieurs signatures ou les contrats intelligents.

Les transactions effectuées par un nœud sont diffusées à ses voisins. Ceux-ci valident les transactions qu’ils reçoivent et les regroupent progressivement dans un pool local avant de les transmettre à leurs propres voisins. Les transactions valides sont ainsi diffusées de proche en proche à tous les nœuds du réseau, après une nouvelle vérification lors de chaque étape.

Avant d’inscrire définitivement une transaction dans la chaîne de blocs, le réseau effectue à plusieurs reprises un ensemble de vérifications, comprenant notamment le fait que les sorties référencées par les entrées existent bien et n’ont pas encore été utilisées, que l’auteur de la transaction est bien titulaire de l’adresse créditée dans ces sorties, et que la somme des montants figurant dans les sorties de la transaction est bien inférieure ou égale à la somme des montants des sorties référencées par les entrées.

L’inscription d’une transaction dans la chaîne de blocs a pour effet d’interdire toute future référence aux sorties désignées par les entrées de cette transaction, ce qui revient à débiter les comptes destinataires de ces sorties des montants qui y figurent, et de créditer les comptes désignés par les sorties de la transaction des montants indiqués.

Une transaction est prise en compte instantanément par le réseau et confirmée une première fois au bout de 10 minutes environ. Chaque nouvelle confirmation renforce la validité de la transaction dans le registre des transactions.

Source : Wikipédia

Qu’est-ce que la malléabilité des transactions ?

La malléabilité des transactions est une attaque qui permet à quelqu’un de changer l’ID unique d’une transaction bitcoin, avant qu’elle ne soit confirmée sur le réseau par les mineurs. Ce changement permet à quelqu’un de prétendre qu’une transaction n’ a pas eu lieu, si toutes les bonnes conditions sont réunies.

Est-ce la même chose qu’une double dépense ?

Non. La double dépense consiste à dépenser des pièces de monnaie une première fois, puis à créer une transaction différente avec ces mêmes pièces avant de confirmer cette première transaction. L’astuce est alors de faire d’abord confirmer la transaction frauduleuse (la première) sur le réseau Bitcoin, de sorte qu’elle n’est pas lieu. Cela signifie effectivement que vous pouvez les dépenser deux fois.

Comment fonctionne la malléabilité des transactions ?

Pour comprendre cela, il faut savoir comment fonctionne une transaction Bitcoin. Une explication sur qu’est-ce qu’une transaction Bitcoin est défini plus haut.

Lorsque vous envoyez des Bitcoins à quelqu’un, vous ne les retirez pas d’un compte ou d’une adresse, non. Les Bitcoins ne sont jamais envoyés de cette façon. Au lieu de cela, une transaction est créée sur la chaîne de blocs Bitcoin ou plus communément appelée blockchain Bitcoin.

La chaîne de blocs agit comme un grand livre géant pour l’ensemble du réseau Bitcoin. Il conserve les enregistrements de toutes les transactions Bitcoin. Qui a envoyé, combien, quand etc. Ceci lui donne un enregistrement complet du nombre de Bitcoins pouvant être attribués à quelles adresses sur le réseau, à un moment donné.

Lorsqu’une transaction Bitcoin est effectuée, certaines informations sont inclues dans celle-ci :

  • la / les adresses d’où proviennent les Bitcoins, on les appelle : les entrées, ou inputs
  • la / les adresses à qui ils sont destinés, on les appelle : les sorties, ou les outputs
  • le / les montants transférés
  • diverses informations, comme la date et l’heure de la transaction, les taxes, etc.

Je vous invite à lire cet article, pour en savoir plus sur les transactions Bitcoin

Chaque transaction doit être identifiée de façon univoque afin qu’elle puisse être référencée dans la chaîne de blocs. Cet ID de transaction (nommé TX ID) est produit en prenant les différentes informations de la transaction puis on applique une fonction de hashage. Elles utilisent l’algorithme SHA-256.

Exemple de transaction : http://blockchain.info/fr/tx/7280aafbf5c88a022a32c364ad006e4d9c7207961bf1839feecc7030c2888b9d

Adresse de sortie 114zXvCXN3n1Vc44adqg4AcFTvL1Fq2hiv
 Adresse d’entrée 1M1ZV81yRZAAoFX84rFR2bFsUKQWxRLDsn
 Total des entrées  0.15347223
 Total des sorties  0.15133138
 Taxes  0.00214085

Le hashage est une procédure mathématique qui utilise différentes données et les combine pour produire une information plus courte. Une des choses qui est incluse dans un hash de transaction est la signature numérique de l’utilisateur, ce qui prouve que la transaction provient bien de la personne qui envoie les Bitcoins.

Une des principales qualités d’une fonction de hashage est qu’il est impossible de dire quelle était l’information originale simplement en regardant le hashage. Il est également impossible de prédire ce que sera le hashage, en se basant sur les informations dont vous disposez au départ. Si un petit détail change dans l’une de ces données, cela changera le hashage d’une manière totalement imprévisible.

Cela rend les ID de transaction pratiquement impossibles à usurper. Chaque transaction ne doit avoir qu’un seul hash possible. Vous pouvez prouver qu’une transaction est valide en exécutant simplement toutes les informations qui la composent via la fonction de hashage, pour vérifier que vous obtenez le même hash.

C’est l’idée. Mais c’est là que la malléabilité entre en jeu. Les signatures numériques utilisées dans le cadre du hashage pour « signer » la transaction sont censées être dans un certain format. Ce format n’ a pas toujours été vérifié correctement. Une personne mal intentionnée pouvait modifier les détails d’une transaction, sans invalider sa signature.

La modification de la signature permet ainsi de créer différents hash pour une même transaction.

Ce n’est pas bon signe. Mais, en fin de compte, ce n’est pas mauvais non plus. Voici pourquoi.

Comment cela peut-il causer des problèmes ?

Un problème ici est lié aux différentes places de marchés, que les utilisateurs de Bitcoins utilisent pour acheter et vendre des bitcoins. Ils envoient leur monnaie de fiduciaire (euros, dollars us etc.) ou leurs Bitcoins à une place de marché. À un moment donné, ils souhaiteront peut-être retirer des Bitcoins du compte.

Il existe plusieurs scénarios possibles. En voici quelques-uns :

Attaques individuelles malveillantes

– Imaginons que Julie et Eve effectuent un échange

– Eve décide de récupérer ses Bitcoins et demande à Julie de les envoyer à son adresse

– Lorsque Julie les envoie, cela crée automatiquement une transaction qui est transmise au réseau et est insérée dans la chaîne de blocs Bitcoin

– Mais Eve prétend que Julie ne les a jamais envoyés

Elle utilise le défaut de malléabilité de la transaction pour reproduire la transaction originale de Julie, en modifiant légèrement la signature pour produire un hashage différent. Elle retransmet ensuite cette transaction, avec les différents ID.

Il y a une chance que la transaction d’Eve soit d’abord confirmée sur la chaîne de blocs. Si cela se produit, le réseau supposera que la transaction est valide et n’enregistrera pas celle de Julie. Eve peut alors se plaindre à Julie qu’elle n’ a pas reçu ses Bitcoins. Lorsque Julie vérifie son numéro d’identification de transaction dans la chaîne de blocs, elle ne le trouvera pas, et elle pourrait essayer de re-envoyer la même somme de Bitcoins. Là est toute la faille.

Des accidents bien intentionnés

Si vous utilisez un logiciel pour manipuler vos Bitcoins, il peut générer des hashages malformés par erreur. Ces hashs peuvent ensuite être « corrigés » par un autre porte-monnaie qui les re-formatent correctement. Mais ça pourrait changer l’ID de la transaction. Si votre portefeuille n’est pas conçu pour repérer des transactions ayant les mêmes caractéristiques, mais un ID différent, il peut se retrouver avec des transactions « bloquées », perdues à tout jamais. Pire encore, il pourrait penser qu’il a encore des Bitcoins à dépenser.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *