La sécurité des smart-contracts sur Ethereum
Acheter Ethereum (ETH)
Partenaire Bitpanda
Si l'on s'intéresse aux cryptomonnaies, difficile de passer à côté d'Ethereum. Ce projet d'ordinateur mondial et décentralisé est deuxième au classement des cryptomonnaies en termes de capitalisation boursière. Réunissant beaucoup d'utilisateurs, mais surtout beaucoup développeurs qui construisent leurs Dapps sur le protocole. Tout cela est possible grâce aux smart-contracts, ces scripts immuables déployés sur Ethereum. Mais si c'est immuable, comment les réparer en cas de faille ? Voyons ensemble comment garantir la sécurité des smart-contracts Ethereum.
Le hack de TheDAO
L'exploitation de failles dans les smart-contracts de TheDAO Ethereum a porté un grand coup à la communauté. Le projet TheDAO avait été financé par les utilisateurs Ethereum et avait pour but, comme son nom l'indique, de mettre en place un modèle d'entreprise décentralisée, une Decentralized Autonomous Organisation ou DAO. Elle avait récolté plus de 100 millions de dollars et avait été mise sur pied entre avril et mai 2016, mais une vulnérabilité dans son code a été exploitée en juin. Il s'agit aujourd'hui de l'exploitation la plus spectaculaire et la plus connue dans l'écosystème, et elle rappelle à tous les développeurs qu'un smart-contract peut avoir de lourdes conséquences. Aujourd'hui les tokens DAO ne sont plus listés sur les exchanges principaux.
Dès mai 2016, des vulnérabilités ont été présentées et il a été recommandé aux investisseurs de se focaliser sur la résolution de ces failles avant de mettre en place de nouveaux projets. Dès le début de juillet, des solutions ont été proposées, mais le fonctionnement de TheDAO faisait qu'il fallait attendre une semaine entre la proposition et la mise en place. Ce délai permettait aux investisseurs de mettre en place un vote afin de définir si oui ou non les solutions devaient être appliquées.
C'est donc le 17 juillet qu'une attaque a était réalisée sur les smart-contracts liés à TheDAO, exploitant différentes vulnérabilités. Cette attaque a conduit la réalisation d'un transfert de 3,6 millions d'éthers en provenance de TheDAO. C'est donc un tiers des fonds de TheDAO qui ont été siphonnés, mais pas à destination des wallets des pirates, mais d'un compte bloqué pour une période de 28 jours. Cela a permis à TheDAO et la communauté Ethereum de réaliser des débats pour définir la marche à suivre. L'histoire nous apprend que cela a conduit à la scission de la chaîne en deux projets qui sont Ethereum et Ethereum Classic, mais cela ne nous concerne pas pour la sécurité des smart-contracts.
En revanche cet épisode a démontré par l'exemple que la sécurité des smart-contracts doit être une priorité des projets sur Ethereum. Mais cela a modifié les façons d'appréhender l'utilisation des smart-contracts et la façon de les appréhender par les développeurs. Voyons ensemble quelles sont les bonnes manières de développer des smart-contracts, et les principes à suivre.
Les bonnes pratiques de développement de smart-contracts
Si la plupart des développeurs et architectes Ethereum sont d'anciens développeurs de logiciels traditionnels, le développement de smart-contracts nécessite de bons réflexes supplémentaires. Tout d'abord Consensys rappelle qu'Ethereum et les applications développées sur la plateforme restent très souvent expérimentales. En effet même si nous ne sommes plus aux balbutiements des applications décentralisées, les smart-contracts et fonctionnalités vont toujours plus loin dans le domaine du possible. Mais même dans ce contexte d'innovation il reste possible de garantir une qualité de code grâce à de bonnes habitudes de programmation.
Tester, tester et tester
Afin de détecter en amont les problèmes dans les smart-contracts, il faut vous préparer à un maximum d'éventualités. Faire des tests et faire participer votre communauté est un très bon moyen de détecter des erreurs de codes. D'autres méthodes comme les récompenses en cas de découvertes de failles et l'audit de smart-contracts que nous allons voir plus en détail sont importantes.
Rester à la page
L'écosystème avance vite et les outils et bibliothèques se mettent très régulièrement à jour. Il est très important de faire l'effort de les mettre à jour et réaliser une veille sur les nouveaux protocoles. Mettre en place une veille des technologies que l'on utilise est maintenant commun pour les développeurs, mais c'est encore plus important dans des écosystèmes qui évoluent aussi rapidement que celui d'Ethereum. Il ne faut pas se contenter d'étudier les nouveaux projets ou fonctionnalités : il faut surtout observer de nouvelles pratiques de sécurité. Par exemple, MetaMask met en ce moment à jour sa façon de permettre la connexion à des Dapps pour des questions de sécurité.
Chercher la simplicité
Dès lors que l'on quitte les bancs des écoles informatiques, les développeurs deviennent fainéants, du moins au premier abord. Inutile de chercher à recréer la roue si les plans sont déjà disponibles sur GitHub. Mais c'est aussi un moyen de garantir la sécurité de votre code. Si vos fonctions sont réutilisables et modifiables facilement, c'est un signe de bonne méthode de travail. Réaliser une logique complexe se fait par l'utilisation d'une multitude de fonctions simple. Cela permet également de réutiliser le même code et éviter les duplications. Il ne faut pas hésiter à utiliser des bibliothèques de fonctions reconnues par la communauté, comme celle d'OpenZepelin par exemple.
Mais également dans la programmation des smart-contracts il faut que ces derniers restent le plus simples possible. C'est le reste de votre projet qui réalisera des tâches plus complexes afin de fournir des interfaces aux utilisateurs par exemple. N'utilisez d'ailleurs des smart-contracts que pour le minimum de fonctionnalités possible.
Les audits de smart-contracts
Si la sécurité des smart-contracts se remettent souvent dans les mains des leurs développeurs, l'utilisation d'audits de smart-contracts est commune dans l'écosystème. Ces audits réalisés permettent aux utilisateurs de ne pas dépendre de leurs capacités techniques pour avoir confiance envers les smart-contracts. J'ai eu la chance de pouvoir discuter avec Hadrien Croubois du projet iExec afin d'en apprendre d'avantages sur ces fameux audits.
Pourquoi sont-ils importants ?
Hadrien nous rappelle que les smart-contracts sont des codes critiques pour les projets de l'écosystème. En effet ils sont souvent très importants dans le fonctionnement des protocoles et gèrent des mouvements financiers. Mais ils sont également immuables et tout changement après le déploiement du contrat devient plus complexe. Les audits permettent d'assurer en partie une confiance envers les smart-contracts d'un projet.
En effet même si tous les contrats et la plupart des codes des projets décentralisés sont publics, ce n'est pas pour cela qu'ils sont sans failles. L'utilisateur non technique ne pourra pas s'assurer de la conformité des smart-contracts qu’il utilise. En revanche même s’il n’analyse pas la logique technique, il peut très bien comprendre le rapport de l’audit ou lire des résumés de ce dernier.
Hadrien m'a confié néanmoins que les audits ne sont plus aussi pertinents, et que par exemple la mise en place d'un bug bounty était également une bonne alternative. Cela permet en autre de faire lire le code d’un projet par un plus grand nombre de développeurs.
Déroulé d'un audit de smart-contracts
Un audit de smart-contracts est une procédure assez longue et qui se déroule par étapes. Hadrien m'a dit qu'il prévoyait entre un mois et demi et deux mois pour la réalisation des audits de leurs smart-contracts. Afin de mieux comprendre le fonctionnement des audits du côté des auditeurs j’ai contacté Clément Leseage, qui réalise des audits en tant qu'indépendant.
Auditer des smart-contracts c’est avant tout auditer une logique de programmation. C’est dans cette optique que Clément passe avant tout par le code papier pour réaliser ses audits. Il imprime sur papier les contrats et les corrige comme s’il s’agissait de copies. Ensuite place à l’attaque : Clément passe en mode « hacker » et recherche un maximum de vulnérabilités. Une fois ce travail réalisé il rédige un rapport dans lequel il va présenter ses conclusions et conseils envers les développeurs. Si les audits semblent de plus en plus s'automatiser pour la recherche formelle des failles habituelles, ils restent un travail humain de manière générale.
Les failles récurrentes dans des smart-contracts Ethereum
Consensys a mis en place un guide sur les attaques principales qu'il faut prendre en compte lors du développement de smart-contracts. Ce guide rappelle par exemple les types de bugs qui ont conduit à l'attaque de TheDAO. Un des bugs courant dans les smart-contracts Solidity peut être mis en place si des fonctions de contrats peuvent être appelé à de multiples reprises, sans que les appels précédents soit fini. Cela peut par exemple permettre de réaliser plusieurs transactions au lieu d'une, si les soldes des utilisateurs ne sont modifiés qu'à la fin de la fonction. Mais des attaques peuvent être plus pernicieuses et utiliser plusieurs fonctions pour arriver à leurs fins. Si plusieurs fonctions agissent sur le même état comme le nombre de tokens d'un utilisateur par exemple, cela peut conduire à des exploitations de ces fonctions pour réaliser des transferts non conformes.
Foire aux questions
J'ai profité de la présence de Clément pour lui poser des questions que je reçois régulièrement, ou qui m'ont été posées à cette occasion. Nous avons donc discuté de sécurité de smart-contracts, mais également leur développement.
Peut-on corriger des failles de contrats déployés ?
Il faut déjà que les failles soient repérées et qu'elles soient remontées à l'équipe sans être exploitées. Ensuite il est assez rare finalement que des modifications soient mises en place. En effet certains projets n'ont pas pris en compte les différentes mises en garde sur la sécurité de leurs smart-contracts. Si le projet a une gouvernance décentralisée, proposer des solutions n'est pas si facile et cela prend du temps. Le plus rapide est de déployer d'autres smart-contracts qui comblent les failles, limitent les pertes et qui permettent une transition vers un protocole plus sécurisé.
Comment se déroule le développement de smart-contracts au sein d'un projet ?
Pour iExec nous ne développons pas que des smart-contracts, nous avons également une infrastructure plus traditionnelle et des éléments de front end. Le développement des smart-contracts reste à part puisque nous les développons principalement en amont, en parallèle sur la fin du développement. Par exemple les smart-contracts que nous utilisons pour les nouvelles versions ont étés développé pendant 6 à 10 mois avant leurs intégrations.
Hadrien, quels seraient tes conseils pour bien développer des smart-contracts ?
Mes conseils seraient les suivants :
- Réutiliser au maximum des contracts existants et reconnus par leurs qualités, comme ceux d'OpenZepelin par exemple.
- Segmenter au maximum les fonctionnalités entre différents smart-contracts.
- Utiliser l'héritage de Solidity pour segmenter le code, mais également pour réaliser des tests séparés.
- Refactoriser au maximum et chercher à utiliser le moins de lignes et d'écrire le code le plus clair possible pour vos fonctionnalités.
Penses-tu qu'aujourd'hui l'échec de TheDAO aurait pu être évité ?
Je n'étais pas dans la communauté en 2016 lors de la faille DAO donc je ne pourrais pas être très précis sur la question. En revanche ce que je sais c'est que les talents Solidity sont bien plus nombreux aujourd'hui, et plus de développeurs auraient lu le code et auraient donc pu alerter sur les failles de sécurités. Mais le process de développement de smart-contracts Ethereum n'a pas fondamentalement changé depuis.
Des conseils pour débuter la programmation de smart-contracts ?
Je conseille la très bonne ressource qu'est Cryptozombie pour s'initier. Mais j'aimerais mettre en garde les débutants qui souhaitent débuter la programmation par Solidity. Il est important de privilégier d'autres langages plus généralistes. En effet pour moi un bon développeur de SM est avant tout un bon développeur. Ensuite la lecture de code est très importante avant d'écrire le sien. La veille sur l'écosystème Ethereum est également primordiale je pourrais citer Ethereum Magicians en ressource par exemple.
Voilà pour cet article sur la sécurité des smart-contracts, j'espère que vous en avez appris plus sur ce monde un peu obscur ! Un grand merci à Sajida Zouarhi,Clément Leasage et Hadrien Croubois pour avoir échangé de ce sujet avec leur expertise. Si vous avez des questions n'hésitez par à réagir à cet article en commentaires ou sur Twitter.