Journal Comment bloquer 280M de dollars en éther

Posté par  . Licence CC By‑SA.
28
8
nov.
2017

Bonjour fameux Nal',

Aujourd'hui, enfin hier, un développeur a bloqué tous les portefeuilles Parity multisignés.

Grossièrement, il a modifié la lib de Parity et s'est octroyé la propriété de tous les portefeuilles multisignés avec Parity. Il a supprimé son contrat auto-exécutant ce qui bloqué tous les portefeuilles multisignés…

En résumé, le Tweet du concerné explique le résultat :

It's simple really, imagine walking up to a bank vault and there's a button that says "Lock Forever"……. someone accidentally pushes it.

Maintenant le concerné commence à s'inquiéter :
Titre de l'image

C'est environ 20% de tout l'éther disponible qui est paralysé. On ne sait pas encore si c'est un acte qui se voulait malveillant qui aurait mal tourné ou si c'est une véritable erreur. Dans tous les cas, ça représente 280M de dollars gelés.

Dans le meme temps, la valeur de l'Ethereum Classic ne cesse d'augmenter depuis…

Plus d'infos :
https://thehackernews.com/2017/11/parity-ethereum-wallet.html

  • # C'est dur la sécurité

    Posté par  (site web personnel) . Évalué à 7.

    Surtout que c'est la deuxième fois que cette équipe se rate en trois mois…

  • # on vit une époque formidable

    Posté par  . Évalué à 4.

    Aujourd'hui, enfin hier, un développeur a bloqué tous les portefeuilles Parity multisignés.
    Grossièrement, il a modifié la lib de Parity et s'est octroyé la propriété de tous les portefeuilles multisignés avec Parity. Il a supprimé son contrat auto-exécutant ce qui bloqué tous les portefeuilles multisignés…

    Cyberpunk intensifies.

    • [^] # Re: on vit une époque formidable

      Posté par  (site web personnel) . Évalué à 10.

      Cette citation n'est pas vraiment très claire. Voilà ce que j'ai personnellement compris après un peu de recherche.

      Ethereum

      Ethereum est pour rappel un système de blockchain qui permet de stocker et exécuter du code (appelé contrat) dans la blockchain, en plus de porte-feuilles et transactions (comme Bitcoin).

      À chaque exécution du contrat, le nouvel état de sa mémoire est stocké dans la blockchain (ça a donc un coup, qu'il faut payé en gas (ce qui peut donner l'exception out-of-gas si on ne paye pas assez pour finir l'exécution du contrat, exception qui me fait personnellement très rire)). Un contrat n'a pas a proprement parler de propriétaire, mais une pratique consiste simplement à enregistrer dans une variable l'adresse du créateur, pour lui permettre d'exécuter des actions avec plus de privilèges.

      Trois points important à rajouter :

      • un contrat est aussi un porte-feuilles, et peut donc posséder de la monnaie ;
      • un contrat peut s'autodétruire, il y a un appel prévu pour dans la machine Virtuelle Ethereum (selfdestruct) ;
      • un contrat peut appeler du code d'un autre contrat mais l'exécuter avec son propre contexte d'appel (sans avoir besoin d'envoyer un message au contrat que l'on souhaite exécuter, ce qui changerait l'expéditeur) : c'est un mécanisme de bibliothèque.

      Parity

      Parity est un client Ethereum (en Rust). Une des fonctionnalité que propose ce client, c'est de créer des porte-feuilles multi-signés. Avec un tel porte-feuille, tous ses propriétaires doivent signer une transaction avant qu'elle puisse être effectuée.

      Or ce genre de porte-feuille n'est pas du tout prévu de base. Comment faire ? Avec un contrat. Ce porte-feuille multi-signé est en réalité un contrat, avec sa propre monnaie, qui a enregistré les propriétaires et implémente les mécanismes souhaités pour effectuer une transaction de monnaie vers un autre compte.

      Le problème

      Pour implémenter leur porte-feuille multi-signé, les gars de Parity ont développé un contrat qu'ils ont inséré dans la blockchain et que tous les porte-feuilles multi-signés utilisent. Une bibliothèque donc.

      Ce contrat a aussi une notion de propriétaire, ainsi qu'une méthode qui appelle selfdestruct, qui vérifie que c'est bien le propriétaire du contrat qui l'appelle. Là où ça devient drôle, c'est que ce fameux devops199 a réussi à se rendre propriétaire de ce contrat, et une fois fait il a appelé la méthode déclenchant l'autodestruction.

      Résultat, les porte-feuilles multi-signés qui utilisent ce contrat ne fonctionnent tout simplement plus. Comme le disent les mecs de Parity eux-même : « This means that currently no funds can be moved out of the multi-sig wallets ». Mais à part ça, «  We very much regret that yesterday’s incident has caused a great deal of stress » (toujours de Parity) :')

      Cerise sur le gâteau, lorsque un contrat s'autodétruit, il peut envoyer le reste de sa monnaie à une adresse, ce qui pourrait donc être une solution pour récupérer son argent. Mais il semblerait que la méthode qui appelle l'autodestruction utilise elle aussi ce fameux contrat qui n'existe plus, et donc ne fonctionne pas non plus.

      Conclusion

      Faut tout compiler en statique :D

      Pour continuer à s'amuser :

      Il existe deux catégories de gens : ceux qui divisent les gens en deux catégories et les autres.

      • [^] # Re: on vit une époque formidable

        Posté par  (site web personnel) . Évalué à 10. Dernière modification le 24 août 2019 à 18:16.

        Un peu plus de détails.

        Le contrat qui a été supprimé était le suivant : x863df6bfa4469f3ead0be8f9f2aae51c91a907b4. Tout le code important se trouve dans le contrat WalletLibrary.

        On remarque notamment qu'il y a une méthode initMultiOwned, qui prend un tableau de propriétaires initiaux. Cette méthode utilise le modificateur only_uninitialized, pour empêcher de l'appeler plus d'une fois :

        modifier only_uninitialized { if (m_numOwners > 0) throw; _; }
        

        Sauf que dans le cas présent initMultiOwned (ou initWallet, qui l'appelle) n'avait jamais été appelé par les dev de Parity. Du coup devops199 l'a appellé, devenant propriétaire du contrat, et l'a détruit.

        À ce niveau là c'est même plus une faille de sécu, c'est une porte d'entrée. Commentaire d'un des gars de Parity : ça a été déployé à la rache, on a pas vu.

        À noter qu'il existe un mécanisme dans Solidity (le compilateur vers le bytecode Ethereum utilisé) pour empêcher un contrat de disposer d'un espace mémoire (et en faire uniquement une bibliothèque donc). Il aurait fallu le définir ainsi : library WalletLibrary is WalletEvent { … } au lieu d'utiliser contract.

        Pourquoi ça n'a pas été fait ? Bonne question. J'ai l'impression qu'une library ne peut pas déclencher de paiement, alors qu'ici WalletLibrary en fait, mais je ne suis pas sûr de moi.

        Et comment on se sort de cette situation ? On ne s'en sort pas. Par définition, la blockchain ne peut pas être altérée. Ou alors il faut faire un nouvel hard fork, ce que certaines personnes semblent réclamer. Mais ça veut dire que le machin n'est quand même pas très stable…

        En fait tout cela me fait m'interroger sur le concept même d'Ethereum. La blockchain c'est cool pour enregistrer des données statiques comme des transactions, mais pour du code ? Par son concept même, on en pourra jamais mettre à jour le code. Il faut donc être sacrément sûr de son code pour commencer à l'utiliser, parce qu'on ne pourra alors plus le changer. Et même si on prouve le code à 100%, on n'est pas à l'abri d'une erreur humaine (ici, oublier d'appeler une méthode d'initialisation).

        Il y a des idées pour pouvoir mettre à jour du code, à base de proxy où on peut mettre à jour la véritable adresse du code. Mais ça implique soit de faire confiance au gars qui gère le proxy pour ne pas changer l'adresse de la lib n'importe comment, soit que chacun déploie son propre proxy. Et qu'en cas de mise à jour, chacun aille changer l'adresse dans son proxy. Ça peut être géré par le client (comme Parity qui publie déjà des contrats sans qu'on ait besoin d'y comprendre quelque chose) mais ça me semble quand même laborieux.

        Il existe deux catégories de gens : ceux qui divisent les gens en deux catégories et les autres.

        • [^] # Re: on vit une époque formidable

          Posté par  (site web personnel) . Évalué à -8.

          C'est le début d'etherum. Les avions n'ont pas commencé à voler avec peu de carburant pour transporter 150 personnes à 800 hm/h à 20 000 km.

          "La première sécurité est la liberté"

        • [^] # Re: on vit une époque formidable

          Posté par  (site web personnel) . Évalué à 3. Dernière modification le 09 novembre 2017 à 11:12.

          En fait tout cela me fait m'interroger sur le concept même
          d'Ethereum. La blockchain c'est cool pour enregistrer des données
          statiques comme des transactions, mais pour du code ? Par son
          concept même, on en pourra jamais mettre à jour le code. Il faut
          donc être sacrément sûr de son code pour commencer à l'utiliser,
          parce qu'on ne pourra alors plus le changer. Et même si on prouve
          le code à 100%, on n'est pas à l'abri d'une erreur humaine (ici,
          oublier d'appeler une méthode d'initialisation).

          Ce qui en soit est pas si différent du type de déploiement qu'on voit pour de l'embarqu^W IOT. Et dire qu'on peut pas mettre à jour, c'est aussi un peu trompeur. Tu pourrais si tu avais le controle de la blockchain entiére. C'est certes sans doute impossible pour une blockchain publique, mais je suis sur qu'il existe des applications ou tu as ta propre blockchain privé et ou c'est faisable, ce qui limite quand même les risques (un peu comme faire un git push -f, ça passe mieux quand tu es seul)

          • [^] # Re: on vit une époque formidable

            Posté par  . Évalué à 1.

            je suis sur qu'il existe des applications ou tu as ta propre blockchain privé et ou c'est faisable

            Ça fait chers en consommation à côté d'une BDD normale.

            Si vous codez un logiciel sans une interface chatoyante, alors vous faites de la merde. Donation bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

          • [^] # Re: on vit une époque formidable

            Posté par  (site web personnel) . Évalué à 2.

            Ce qui en soit est pas si différent du type de déploiement qu'on voit pour de l'embarquW IOT. Et dire qu'on peut pas mettre à jour, c'est aussi un peu trompeur.

            Est-ce que l'équivalent de curl https://… | sh - serait un code valide?

          • [^] # Re: on vit une époque formidable

            Posté par  (site web personnel) . Évalué à 5. Dernière modification le 11 novembre 2017 à 15:22.

            C'est certes sans doute impossible pour une blockchain publique

            En fait c'est possible, mais ça crée une nouvelle blockchain. Ça s'appelle un hard fork, et c'est déjà arrivé à l'Ethereum (ce qui a donné l'Ethereum (la nouvelle blockchain) et l'Ethereum Classic (l'ancienne)). À noter qu'à l'époque ce fork avait déjà eu lieu suite à une faille dans un contrat.

            Bitcoin a aussi eu son hard fork cet été, avec le Bitcoin Cash (conflit sur la taille de blocs).

            Le seul problème si la blockchain est publique, c'est qu'on ne peut pas décider tout seul d'utiliser la nouvelle. Il faut que le reste du monde l'accepte aussi (ou au moins une quantité de personnes suffisamment importante pour que la nouvelle blockchain reste intéressante).

            Il existe deux catégories de gens : ceux qui divisent les gens en deux catégories et les autres.

        • [^] # Re: on vit une époque formidable

          Posté par  (site web personnel) . Évalué à 2. Dernière modification le 09 novembre 2017 à 19:48.

          Il y a cette technique sinon mais cela me semble très proche des références dans Git - avec la notion de mutabilité inhérente.

          Mais dans ce genre de contexte, on préféra utiliser des outils (externes ou internes au langage) pour assurer le maximum de chose (et c'est ce qui ce fait dans l’aéronautique).

      • [^] # Re: on vit une époque formidable

        Posté par  (site web personnel) . Évalué à 3.

        Merci pour l'explication.

        J'ajouterais qu'il existe un outil pour vérifier ça:
        https://github.com/b-mueller/mythril

  • # Un peu de désinformation quand même

    Posté par  (site web personnel) . Évalué à 4.

    C'est environ 20% de tout l'éther disponible qui est paralysé

    C'est moins de 1% pour sûr. Dont la moitié appartient à la société qui développe Parity.

    • [^] # Re: Un peu de désinformation quand même

      Posté par  . Évalué à 3. Dernière modification le 09 novembre 2017 à 13:19.

      Je n'ai fait que paraphraser l'article :

      So far, it is unclear exactly how much cryptocurrency has disappeared due to this blunder, but some cryptocurrency blogs have reported that Parity wallets constitute roughly 20% of the entire Ethereum network.

      Dont 30% appartiennent à Parity :

      This made researchers familiar with the space estimating around $280 Million worth of Ether is now inaccessible at this time, including $90 million of which was raised by Parity's founder Gavin Woods.

      Si tu as des sources indiquant autre chose, je suis preneur.

      La majeure partie des morts l'était déjà de son vivant et le jour venu, ils n'ont pas senti la différence.

      • [^] # Re: Un peu de désinformation quand même

        Posté par  . Évalué à 1.

        … Parity wallets constitute roughly 20% of the entire Ethereum network

        Je crois comprendre que ce sont les portefeuilles de Parity qui représentent 20% de l'ETH.
        Et il semble que seul un portefeuille soit affecté, donc il se peut que ce portefeuille représente 1% de l'ETH total (ce qui serait déjà énorme).

        Je fais surtout des suppositions parce que je n'ai pas encore tout lu (oui, pas bien de commenter sans avoir lu l'intégralité … Patapé).

        • [^] # Re: Un peu de désinformation quand même

          Posté par  . Évalué à 2. Dernière modification le 09 novembre 2017 à 15:41.

          Je crois comprendre que ce sont les portefeuilles de Parity qui représentent 20% de l'ETH.

          Effectivement c'est peu clair et c'est possible que ce soit bien la totalité des portefeuilles de Parity qui représentent 20% de l'ether disponible. Si c'est le cas, reste à savoir ce que représentent la totalité des portefeuilles multisignés chez Parity…

          Et il semble que seul un portefeuille soit affecté, donc il se peut que ce portefeuille représente 1% de l'ETH total (ce qui serait déjà énorme).

          Là par contre c'est certain, ce n'est pas 1 seul portefeuille qui a été affecté mais plusieurs milliers. En fait, tous les portefeuilles multisignés chez Parity.

          La majeure partie des morts l'était déjà de son vivant et le jour venu, ils n'ont pas senti la différence.

          • [^] # Re: Un peu de désinformation quand même

            Posté par  . Évalué à 1.

            D'après le blog de Parity (https://paritytech.io/blog/security-alert.html) :

            Affected users: Users with assets in a multi-sig wallet created in Parity Wallet that was deployed after 20th July.

            Donc j'en déduis qu'il est possible que certains portefeuilles soient épargnés (mais effectivement du coup, plusieurs portefeuilles sont touchés, certainement un grand nombre).

            • [^] # Re: Un peu de désinformation quand même

              Posté par  . Évalué à 3.

              Exact, ce sont biens les portefeuilles crées après le 20 Juillet qui sont concernés et non pas tous comme je l'ai écrit précédemment. J'avais cru comprendre que les portefeuilles multisignés n'existaient pas chez Parity avant le 20 juillet et qu'ils étaient la conséquence du piratage ayant eu lieu le 19 Juillet mais c'est une erreur de ma part, ils existaient bien auparavant.

              Désolé pour les imprécisions, je suis allé un peu vite en besogne. Si un modo veut modifier mon journal pour y inclure les corrections, ce sera avec plaisir.

              La majeure partie des morts l'était déjà de son vivant et le jour venu, ils n'ont pas senti la différence.

      • [^] # Re: Un peu de désinformation quand même

        Posté par  . Évalué à 5.

        280 millions de dollars en Ether ça représente bien ~1% de la capitalisation totale de l'Ether (29 milliards de dollars à l'heure où j'écris ces lignes, source coinmarketcap.com).

  • # Pas de changement sur le prix de l'ETH

    Posté par  . Évalué à 0.

    C'est quand même assez fou que ce blocage n'a pratiquement pas influé sur le prix de L'ETH, ni sur la market cap ! Si on regarde la courbe du prix de l'ethereum https://www.datacoinz.com/fr/monnaies/ethereum/ on remarque qu'en date du 9 -15 novembre la chute n'est pas si importante et que les transactions on continué à afflué sur la monnaie.

    D'un côté c'est flippant comme réaction du marché…

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.