Décompte avant la mise à jour : https://fork.codetract.io/
Pour mettre à jour Mist ou Ethereum Wallet cliquez ici!
Ethereum subit depuis 1 mois une attaque par déni de service (DoS) qui a commencé le premier jour de la DEVCON2. Cette attaque a tenté de saturer et faire crasher les nœuds du réseau qui a montré sa résistance. Une EIP (Ethereum Improvement Proposal) a été finalisée en milieu de semaine dernière et sera déployée dans un hard fork au bloc 2 463 000 (soit demain mardi un peu avant 15h) pour corriger les failles exploitées.
Retour sur un mois agité sur Ethereum, sur le contenu et sur les conséquences de cette mise à jour.
Un mois de gros temps où la résilience du réseau a fait ses preuves
Au bloc 2,283,249, c’est-à-dire le 18 septembre aux alentours de 4h du matin à Shanghai, un contrat malicieux a été déployé par la transaction 0x21090b64(…). Le langage machine (en OPCODE) de ce contrat est consultable à cette adresse 0xd6a64d7e(…). Il contient l’opération PUSH20 qui met sur la pile des opérations l’écriture d’une chaîne de caractères de 20 bytes « fromshanghaiwithlove » faisant sans doute référence à DEVCON2 qui devait commencer dans les heures suivantes. On trouve dans ce contrat l’opération EXTCODESIZE qui demande la lecture de la taille du code contenu dans un compte Ethereum. Cette opération s’est avérée sous-estimée dans le calibrage des coûts en gaz initialement réalisé dans le yellow paper d’Ethereum (cf. Gextcode dans l’appendice G) pour les opérations sur Ethereum.
Pour rappel, le système de gaz permet entre autre de résoudre le problème de l’arrêt dans la machine virtuelle Ethereum. A chaque opération correspond un coût en gaz et l’exécution d’une transaction s’interrompt lorsque le gaz fourni pour la transaction est épuisé. L’exécution d’une transaction, qu’elle soit un simple transfert d’ether ou plusieurs lignes du code d’un contrat, nécessite de rémunérer le premier mineur qui valide initialement l’opération en l’incluant dans un bloc. Tous les nœuds complets (full nodes) vérifient à leur tour l’état de la blockchain inscrit dans chaque bloc que les mineurs diffusent en exécutant eux aussi les opérations demandées par les transactions. Les mineurs sont libres de fixer le prix en ether pour une unité de gaz mais pas la quantité de gaz à attribuer aux différentes opérations. Avec le jeu de la concurrence entre les mineurs, ils sont incités à ne pas trop augmenter le prix au risque que les transactions soient inscrites dans le prochain bloc par un autre mineur moins cher.
Pour illustrer ce mécanisme, à la mi-juin le prix du moyen du gaz était de 0,0000000225 ether en moyenne. Une transaction basique de virement entre deux adresses nécessitant 21000 gaz, elle coûte donc en moyenne 0,00047 ether en frais de traitement. La flexibilité du prix du gaz permet de garantir une certaine stabilité du coût d’exécution : si le prix en euros de l’éther venait à doubler les mineurs pourraient diviser par deux le prix du gaz pour que les frais de traitement restent stables en euros. Le gaz est donc un système interne pour éviter de saturer l’exécution sur la blockchain et, toute opération entraînant paiement, il n’y a pas d’attaque par déni de service possible sauf en cas d’écart entre le coût calibré de l’opération et son coût réel.
L’attaque DoS a consisté à innonder le réseau de transactions en faisant appel à diverses opérations dont le coût d’exécution ne correspondait pas à la charge réelle de traitement pour les nœuds du réseau. Cette attaque a d’abord affecté sévèrement les nœuds utilisant Geth, la version plus populaire du client Ethereum (écrit en Go) qui ont rapidement crashé. Il faut avoir à l’esprit que contrairement à Bitcoin où plus de 96% des clients sont dérivés de Core (écrit en C++), la blockchain Ethereum est implémentée dans plusieurs clients qui ne traitent pas l’exécution des opérations avec les mêmes contraintes. La seconde version la plus populaire (Parity, écrite en Rust) a rapidement pris le relais sur le réseau. La plupart des clients ci-dessous ont mis en ligne des versions intégrant EIP 150 :
Client | Langage | Développeurs |
go-ethereum | Go | Ethereum Foundation |
Parity | Rust | Ethcore |
cpp-ethereum | C++ | Ethereum Foundation |
pyethapp | Python | Ethereum Foundation |
ethereumjs-lib | Javascript | Ethereum Foundation |
Ethereum(J) | Java | <ether.camp> |
ruby-ethereum | Ruby | Jan Xie |
ethereumH | Haskell | BlockApps |
Branle-bas de combat du milieu de la nuit au petit matin à Shanghai
Comme écrit plus haut l’attaque est survenue dans la nuit précédant le début de DEVCON2 qui rassemblait la très grosse majorité des développeurs de l’écosystème et de la Fondation. Cette attaque aurait pu ruiner l’événement mais force est de constater que les développeurs ont réagi promptement et efficacement à cette attaque. L’ensemble de la presse spécialisée a d’ailleurs salué cette réactivité. Dès les premières heures qui ont suivi l’attaque, les membres de l’équipe responsable de go-ethereum s’affairaient à préparer un correctif tandis que les coopératives (les pools) de mineurs s’appliquaient à adapter le prix du gaz et le traitement des transactions pour maintenir le réseau à flot.
Une des grosses difficultés de l’opération contre cette première vague de l’attaque semble avoir été de parvenir à mettre en ligne la nouvelle version à travers le Grand Firewall de Chine. Au final le lancement de DEVCON2 a été retardé de 30 minutes après la mise en ligne de la version 1.4.12 de go-ethereum nommée « From Shanghai, with love ». L’effervescence autour de l’attaque et les contributions de la communauté ont produit une analyse constante de la situation et des mouvements suspects dans la blockchain. On a pu par exemple remarquer, quelques blocs après le déploiement du contrat de l’attaque, la transaction suspecte 0x5c19695f(…) qui contenait le message en allemand « Rentrez à la maison » (Fahrt nach Hause) menant rapidement à l’explication de l’auteur de cette transaction.
L’attaque ne s’est pas arrêtée pour autant et plusieurs autres abus du calibrage des opérations ont eu lieu régulièrement depuis « From Shanghai, with love ». Ces attaques ont aussi affecté le client Parity et également la chaîne minoritaire Ethereum Classic (ETC). Plutôt que de passer dans les détails techniques des opérations concernées par les étapes successives de l’attaque et des corrections apportées, je me contenterai de donner les noms des nombreuses versions qui se sont suivies jusqu’à la dernière qui implémente le hard fork à venir :
– From Shanghai, with love (1.4.12)
– Into the Woods (1.4.13)
– What else should we rewrite? (1.4.14)
– Come at me Bro (1.4.15)
– Dear Diary (v1.4.16)
– Poolaid (v1.4.17)
– Note 7 (v1.4.18)
Un mois de réseau ralenti mais jamais entravé
- L’état du réseau
Une des réactions pour contenir l’attaque a été d’augmenter le prix de gaz et celui-ci a doublé puis triplé en moyenne depuis la mi-septembre :
La taille moyenne des blocs exprimée en gaz a également été changée par les mineurs vers le plafond de 500K gaz pour faire face aux dernières attaques :
Du fait des disparités dans la diffusion des stratégies de contre-attaque, les uncles (qui sont des blocs valides mais diffusés trop tardivement aux noeuds du réseau) ont été très nombreux sur la période tandis que le blocktime (le temps entre les blocs) est resté constant à 14 secondes.
Ce tumulte sur le réseau a eu pour conséquence de reporter le déploiement ou de perturber la vente des tokens de quelques gros contrats. L’EIP 150 règlera les problèmes de calibrage des coûts en gaz des opérations impliquées dans l’attaque. On retrouve parmi elles majoritairement des opérations liées à l’utilisation de la mémoire de la machine virtuelle Ethereum (EVM).
Ces changements vont affecter à la marge le fonctionnement de contrats déjà déployés, l’analyse de la blockchain ayant pu mettre en évidence environ 111 ethers répartis sur quelques 570 contrats qui pourraient être inutilisables après le hard fork.
- Une mise à jour par hard fork et après ?
Ce mois d’attaque a donné lieu à des réflexions diverses comme la possibilité d’organiser « un gas price market » ou d’autres plus philosophiques sur les valeurs de la communauté, ce dont nous aurons peut-être l’occasion de parler ultérieurement. La notion d’anti-fragilité théorisée par Nassim Nicholas Taleb revient régulièrement dans les discussions sur les réseaux sociaux pour qualifier Ethereum et sa communauté. Ethereum apparaît comme un projet jeune et dynamique qui croît et s’améliore au gré des attaques, des aléas, de son exposition à la volatilité et des passions que le projet suscite. Cette caractéristique est d’être anti-fragile, c’est-à-dire à l’opposé du fragile. Un projet résilient résiste aux chocs et reste le même, un anti-fragile survit et s’améliore.
Dès les premiers jours de l’attaque il a été mis en évidence que cette opération était très coûteuse pour son ou ses auteurs. Plusieurs milliers d’euros par jour ont été dépensés sans que le cours de l’ether ne s’effondre alors que la Fondation Ethereum dispose d’un programme de bug bounty pour rémunérer les développeurs trouvant un bug. On peut dès lors questionner les motivations d’une telle attaque : s’agissait-il d’un test grandeur nature de la robustesse du réseau ou simplement de l’expression de la volonté de voir Ethereum échouer?
Si l’on retrace l’origine des fonds utilisés par les adresses de l’attaque, on débouche sur des conversions depuis la plateforme Shapeshift. Pour les amateurs d’enquête, j’ai pu remonter les opérations sur Shapeshift jusqu’à ces deux transactions sur Bitcoin 64793d56(…) et 8553e730(…). Il demeure cependant peu probable que l’on découvre un jour le ou les auteurs de cette attaque.
Il apparaît clairement que l’ambition du projet Ethereum s’accompagne d’une surface d’attaque très importante. Et pour conclure, en reprenant le titre d’un article de Genesis mining après le hard fork de juillet :
– Curro de furca in furcam et melior factus sum
(Où vas-tu Ethereum ? Je cours de fourche en fourche et je m’améliore)
Bonus : la première intervention de DEVCON2, Ethereum en 25 minutes !
Merci pour ce compte rendu complet, le client Geth en est à sa 100ième version, il faut arriver suivre le développement 😉
merci pour ces informations