Aller au contenu

Piratage de Liquid : toute la conversation on-chain entre le hacker et Blockstream, message par message

Tous les messages que l'exploitant de Liquid et Blockstream ont échangés dans des transactions Bitcoin depuis le 6 septembre, attribués par la propriété des coins et la signature PGP : un résumé, puis le fil complet.

  • Le hacker de Liquid et Blockstream ont négocié le retour de 4 000 BTC par messages OP_RETURN. 3 400 BTC sont revenus le 7 septembre ; 598,5 BTC restent détenus.
  • 27 entrées attribuées à ce jour : 12 de l'exploitant, 14 de Blockstream, beaucoup chiffrées, plus le transfert de retour. Le spam envoyé à l'adresse est exclu.

Le 6 septembre, environ 4 000 BTC, soit à peu près 320 millions de dollars, ont quitté le portefeuille qui adosse le Liquid Network, la sidechain Bitcoin de Blockstream, par une faille du logiciel Elements et non par une clé volée. Notre outlook du même jour raconte cette histoire. Cette page porte sur ce qui s'est passé ensuite, et sur le lieu où cela s'est passé : la personne ou le groupe qui détient les coins et Blockstream se sont parlé sur la blockchain Bitcoin elle-même, par des messages inscrits dans des transactions, et l'échange entier est public. Vous trouverez ci-dessous comment une telle conversation fonctionne, ce qui a été dit en résumé, puis chaque message attribué dans l'ordre, avec un lien vers la transaction qui le porte.

Comment une conversation tient dans des transactions Bitcoin

Les transactions Bitcoin peuvent porter une petite quantité de données arbitraires dans un type de sortie appelé OPRETURN. L'exploitant s'en est servi comme d'une boîte aux lettres : chaque message est une transaction qui dépense une infime partie des coins volés, envoie 1 000 satoshis à l'autre partie comme porteur, et inscrit le texte dans une sortie OPRETURN. Blockstream a répondu de la même manière, d'abord depuis une adresse de contact, puis depuis des adresses nouvelles. Certains messages sont en clair. Certains sont signés avec la clé de sécurité publiée par Blockstream, de sorte que chacun peut vérifier qu'ils viennent bien de l'entreprise. Beaucoup sont chiffrés : les notes de l'exploitant à Blockstream sont chiffrées vers la clé PGP publique de l'entreprise, et les notes de Blockstream à l'exploitant sont chiffrées vers la clé derrière l'adresse Bitcoin de l'exploitant, selon le schéma ECIES intégré aux portefeuilles Electrum. Les messages chiffrés existent sur la chaîne à la vue de tous, mais seul le destinataire prévu peut les ouvrir. Nous les présentons comme chiffrés et indiquons leur taille ; nous ne pouvons pas les lire, et personne d'autre non plus, à moins que l'exploitant ne publie la clé privée comme il a menacé de le faire.

L'attribution suit deux règles que chacun peut vérifier. Un message est celui de l'exploitant quand la transaction dépense des coins de l'adresse qui détient les fonds volés : les coins sont le micro. Un message est celui de Blockstream quand il est dépensé depuis l'adresse de contact de l'entreprise, ou quand son texte est un message PGP signé en clair dont la signature se vérifie contre la clé publiée sur blockstream.com, empreinte 1176 542D A98E 71E1 3372 2EF7 4AC8 CC88 6844 A2D6. Notre chronologie vérifiée correspond à l'audit indépendant publié par Sjors Provoost, contributeur de Bitcoin Core.

Ce qui n'est pas dans ce fil

Une adresse Bitcoin discutée publiquement attire du bruit. Depuis le 6 septembre, l'adresse de l'exploitant a reçu près de 300 autres transactions porteuses de texte : publicités pour des memecoins, appels à partager les coins, accusations qui nomment des individus et présentent le vol comme un coup de l'intérieur, et au moins un message prétendant venir du directeur général de Blockstream. Aucune ne dépense les coins volés et aucune ne porte une signature Blockstream valide, donc aucune ne fait partie de la conversation, et nous ne les reproduisons pas.

La discussion en résumé

Premier contact, 6 septembre. Quatre heures après le vidage, l'adresse détenant les coins a écrit « we are whitehats. contact us on chain » (« nous sommes des white hats, contactez-nous sur la chaîne »). Blockstream a répondu dans l'heure avec l'adresse e-mail de son équipe de sécurité. L'exploitant ne l'a jamais utilisée ; tout ce qui a suivi est resté sur la chaîne.

Les conditions, début du 7 septembre. Blockstream a envoyé sa première note chiffrée. L'exploitant a alors proposé, en clair, de renvoyer « most » (« la plupart ») des coins au portefeuille de la fédération Liquid et a demandé si cela convenait. Quelques minutes plus tard, il a ajouté une condition : corriger d'abord le bug, s'assurer que chaque nœud est patché, et alors seulement l'argent bougerait en sécurité. Le détail technique de la faille a suivi, chiffré vers la clé de Blockstream. Blockstream a répondu par un « Yes, thank you. » signé (« Oui, merci. »).

Patché, et remboursé. À 09:41 UTC, Blockstream a publié un message signé : les nœuds du pont étaient patchés et les fonds pouvaient revenir en sécurité. L'exploitant a demandé une confirmation supplémentaire de l'adresse de destination, a envoyé d'autres détails chiffrés sur le correctif, et à 16:09 UTC une seule transaction a déplacé 3 400 BTC vers le portefeuille de peg. Les 598,5 BTC restants, environ 15 pour cent, sont restés à l'adresse de l'exploitant.

À huis clos, du 7 au 8 septembre. À partir de ce soir-là, l'échange est devenu opaque : Blockstream a envoyé une série de notes signées et chiffrées, dont une courte instruction sur la manière de les déchiffrer, et l'exploitant a répondu de même. La seule ligne lisible de l'exploitant dans cette phase est un visage triste, publié tard le 7 septembre.

En clair, puis un ultimatum, du 8 au 9 septembre. Dans l'après-midi du 8 septembre, l'exploitant a annoncé que tous les messages suivants seraient en clair. Le 9 septembre est venu le plus long message du fil : une accusation selon laquelle Blockstream a consacré bien trop peu à la sécurité, une exigence que l'entreprise paie 10 pour cent de sa propre poche à titre de bug bounty, une menace que ses utilisateurs subiraient sinon une perte de 15 pour cent, et une promesse de publier la clé privée qui déverrouillerait la conversation chiffrée. Blockstream a répondu dans l'heure, de façon chiffrée et signée, puis de nouveau tôt le 10 septembre. Elle n'a, ni sur la chaîne ni ailleurs, accepté le cadrage de la prime.

La conversation complète

Les heures sont en UTC. « Exploitant » désigne l'adresse qui détient les coins vidés ; l'étiquette white hat est la sienne. « Blockstream » marque les messages dépensés depuis l'adresse de contact de l'entreprise ou vérifiés contre sa clé publiée. Le texte entre guillemets est reproduit exactement tel qu'il est écrit sur la chaîne.

6 sept., 18:30 UTC, bloc 965 818, Exploitant : "we are whitehats. contact us on chain" (transaction)

6 sept., 19:31 UTC, bloc 965 822, Blockstream : "Please contact security@blockstream.com" (transaction)

7 sept., 01:49 UTC, bloc 965 865, Blockstream : "Encrypted to the key behind bc1ql4mfu6aundtkksxklfajs2h3t9nzcd6gyqjlte (Electrum BIE1 ECIES):" suivi d'un message chiffré à l'exploitant (ECIES, signé PGP par Blockstream, 1 297 octets). Illisible pour les tiers. (transaction)

7 sept., 02:20 UTC, bloc 965 869, Exploitant : "sending most back to bc1qdlld6antmv4xug242ed83q7k4rqw50cwfns38szx4qu2f4jwaxxsuhwxxr, is that ok" (transaction)

7 sept., 03:30 UTC, bloc 965 875, Exploitant : "Please fix the bug first. The chain is under risk at latest commit right now. Make sure every node is patched. Then we will transfer the money back safely after confirming the fix. The detail is as follows (encrypted using https://blockstream.com/pgp.txt)." suivi d'une section chiffrée pour Blockstream, illisible pour les tiers. (transaction)

7 sept., 03:30 UTC, bloc 965 875, Blockstream : "Yes, thank you." (signé PGP, vérifié) (transaction)

7 sept., 09:41 UTC, bloc 965 912, Blockstream : "Bridge nodes are patched, safe to return the funds." (signé PGP, vérifié) (transaction)

7 sept., 12:43 UTC, bloc 965 930, Exploitant : "plz confirm again that we are sending the coins back to bc1qdlld6antmv4xug242ed83q7k4rqw50cwfns38szx4qu2f4jwaxxsuhwxxr More details about the vuln fix:" suivi d'une section chiffrée pour Blockstream, illisible pour les tiers. (transaction)

7 sept., 15:31 UTC, bloc 965 948, Exploitant : Message chiffré à Blockstream (PGP, 979 octets). Illisible pour les tiers. (transaction)

7 sept., 16:09 UTC, bloc 965 950, Exploitant : Envoi de 3 400 BTC au portefeuille de peg de Liquid, sans message joint. (transaction)

7 sept., 17:54 UTC, bloc 965 956, Blockstream : "To decrypt: this is Electrum BIE1 ECIES to your key. In Electrum, Tools > Encrypt/Decrypt Message, paste below, decrypt with the private key for bc1ql4mfu6aundtkksxklfajs2h3t9nzcd6gyqjlte. Or any ECIES/BIE1 library." suivi d'un message chiffré à l'exploitant (ECIES, signé PGP par Blockstream, 1 408 octets). Illisible pour les tiers. (transaction)

7 sept., 17:54 UTC, bloc 965 956, Blockstream : un message chiffré à l'exploitant (ECIES, signé PGP par Blockstream, 1 275 octets). Illisible pour les tiers. (transaction)

7 sept., 17:54 UTC, bloc 965 956, Blockstream : un message chiffré à l'exploitant (ECIES, signé PGP par Blockstream, 1 211 octets). Illisible pour les tiers. (transaction)

7 sept., 17:54 UTC, bloc 965 956, Blockstream : un message chiffré à l'exploitant (ECIES, signé PGP par Blockstream, 1 147 octets). Illisible pour les tiers. (transaction)

7 sept., 18:35 UTC, bloc 965 962, Blockstream : un message chiffré à l'exploitant (ECIES, signé PGP par Blockstream, 1 275 octets). Illisible pour les tiers. (transaction)

7 sept., 18:35 UTC, bloc 965 962, Exploitant : Message chiffré à Blockstream (PGP, 962 octets). Illisible pour les tiers. (transaction)

7 sept., 18:35 UTC, bloc 965 962, Exploitant : Message chiffré à Blockstream (PGP, 1 052 octets). Illisible pour les tiers. (transaction)

7 sept., 21:03 UTC, bloc 965 973, Exploitant : ":(" (transaction)

8 sept., 00:11 UTC, bloc 965 992, Blockstream : un message chiffré à l'exploitant (ECIES, signé PGP par Blockstream, 1 120 octets). Illisible pour les tiers. (transaction)

8 sept., 06:02 UTC, bloc 966 023, Blockstream : un message chiffré à l'exploitant (ECIES, signé PGP par Blockstream, 3 168 octets). Illisible pour les tiers. (transaction)

8 sept., 09:41 UTC, bloc 966 052, Exploitant : Message chiffré à Blockstream (PGP, 2 019 octets). Illisible pour les tiers. (transaction)

8 sept., 12:59 UTC, bloc 966 079, Blockstream : un message chiffré à l'exploitant (ECIES, signé PGP par Blockstream, 4 230 octets). Illisible pour les tiers. (transaction)

8 sept., 14:25 UTC, bloc 966 087, Exploitant : Message chiffré à Blockstream (PGP, 1 356 octets). Illisible pour les tiers. (transaction)

8 sept., 14:25 UTC, bloc 966 087, Exploitant : "All messages will be in plaintext." (transaction)

9 sept., 11:45 UTC, bloc 966 199, Exploitant : "Your dereliction of duty is obvious that you allocated only $1.5M (maybe even 0) to secure $5B assets. This is a flagrant neglect of security and a sign of complete mismanagement. You SHALL pay 10% using your own money as bug bounty or you will cause all your holders a 15% loss for your irresponsibility and stinginess. Even companies that participate in bug bounty programs cannot guarantee complete security, let alone one like yours that remains delusional, greedy, and arrogant to this very day. Anyway we are going to publish the privatekey to decrypt our conversations afterwards." (transaction)

9 sept., 11:45 UTC, bloc 966 199, Blockstream : un message chiffré à l'exploitant (ECIES, signé PGP par Blockstream, 2 222 octets). Illisible pour les tiers. (transaction)

10 sept., 02:18 UTC, bloc 966 296, Blockstream : un message chiffré à l'exploitant (ECIES, signé PGP par Blockstream, 4 889 octets). Illisible pour les tiers. (transaction)

Lisez-le vous-même

Chaque entrée ci-dessus renvoie à sa transaction sur mempool.space, où la sortie OP_RETURN peut être décodée depuis le script brut. La version en direct de ce fil tourne sur notre page d'accueil, mise à jour à mesure que de nouveaux blocs se confirment, et la page de recherche de bloc explique comment l'attribution est faite et ce qui est délibérément laissé de côté. Les messages chiffrés y sont eux aussi présentés comme chiffrés. Si l'exploitant publie la clé promise, la partie fermée de cette conversation deviendra lisible, et nous mettrons cette page à jour.

Cette publication constitue une analyse de marché et non une recommandation d’achat ou de vente.

Ce qui changerait la vue

  • Un nouveau message en clair de l'un ou l'autre côté, en particulier toute déclaration de Blockstream sur la prime exigée de 10 pour cent.
  • Un mouvement des 598,5 BTC encore détenus à l'adresse de l'exploitant, dans quelque direction que ce soit.
  • La publication de la clé privée promise par l'exploitant, qui rendrait les messages chiffrés lisibles par tous.

Sources