L'écosystème blockchain, marqué par Ethereum, offre un réseau décentralisé mondial attirant de nombreux utilisateurs et développeurs. Les smart contracts, scripts immuables déployés sur diverses blockchains, sont essentiels à cette révolution. Cependant, leur maintenance et leur sécurité sont primordiales en raison de leur immuabilité apparente.
Introduction aux Smart Contracts et aux Blockchains
Bitcoin, Ethereum, Polygon, Cosmos ou Solana sont des blockchains publiques qui fonctionnent de manière autonome, avec des tokens, des protocoles informatiques et des règles de gouvernance différents. L'article se penche sur les mécanismes de sécurité des smart contracts, explorant les défis et mettant en lumière les meilleures pratiques pour minimiser les risques. Les smart contracts sont des protocoles informatiques qui facilitent, vérifient ou mettent en œuvre l'exécution automatique d'un contrat. Un smart contract est un accord entre deux parties, codé en termes numériques.
Définition et importance des Smart Contracts
Un smart contract (contrat intelligent) est un programme informatique qui s'exécute automatiquement lorsque certaines conditions prédéfinies sont remplies. Les avantages offerts par les smart contracts incluent l'automatisation des transactions, la réduction des intermédiaires et la transparence grâce à leur exécution publique et vérifiable. La sécurité est vitale car les smart contracts manipulent souvent de larges sommes d'argent ou des données sensibles. Les concepteurs de smart contracts sont confrontés à une variété de défis de sécurité, incluant des vulnérabilités inconnues ou l'émergence de nouvelles méthodes d'attaques.
Le rôle des réseaux bêta
Les "réseaux bêta" (ou "testnets") sont un élément important dans le développement et le déploiement de blockchains. Ce sont des environnements de test qui permettent aux développeurs et aux utilisateurs de tester les nouvelles fonctionnalités, de détecter et de corriger les bugs, et d'expérimenter sans risquer de perturber la blockchain principale (également appelée "mainnet"). Les réseaux bêta sont des versions de la blockchain qui ne sont pas destinées à être utilisées pour des transactions réelles ou des activités commerciales. Ils servent principalement à des fins de développement, de test et d'expérimentation. Les développeurs peuvent implémenter de nouvelles fonctionnalités et des mises à jour sur le réseau bêta pour voir comment elles se comportent en conditions réelles. Cela permet de détecter et de corriger les vulnérabilités de sécurité et les bugs potentiels avant de les déployer sur la blockchain principale.
Vulnérabilités et types d'attaques courants
Les contrats intelligents sont devenus un élément crucial de l'écosystème des cryptomonnaies, mais ils ne sont pas exempts de vulnérabilités. Les smart contracts sont soumis à un cadre de réglementations qui évolue constamment. Ces règles varient selon les juridictions et visent à encadrer l'utilisation et la création de smart contracts pour assurer la sécurité, la conformité et le respect des lois en vigueur.
Lire aussi: Sécurité publique et morsures de pitbulls : une étude
Faiblesses des interfaces et oracles non fiables
Les smart contracts interagissent souvent avec des interfaces utilisateur et d'autres contrats. Les interfaces mal conçues peuvent permettre des manipulations malveillantes en exploitant des vulnérabilités dans les entrées ou les sorties. Les smart contracts peuvent nécessiter des données externes (oracles) pour fonctionner correctement. L'utilisation d'oracles non fiables peut introduire des sources de données ou des protocoles indépendants altérés, compromettant ainsi l'intégrité du contrat.
Risques liés au langage de programmation
Le langage de programmation Solidity, est couramment utilisé pour écrire des smart contracts sur la blockchain Ethereum ou encore le Rust et le C++ pour ceux de la blockchain solana. Les erreurs de programmation peuvent exposer les smart contracts à des failles de sécurité ou même à de l’indisponibilité avec la blockchain Solana par exemple. Des problèmes tels que les boucles infinies, les débordements d'entiers et les conditions de concurrence mal gérées peuvent compromettre la fonctionnalité et la sécurité du contrat. Ce qui peut se révéler fatal pour une blockhain.
Attaque de réentrance
Dans le monde des smart contracts, l'attaque de réentrance reste une menace persistante. L'attaque de réentrance se matérialise lorsqu'un contrat externe appelé par le smart contract initial parvient à rappeler dans la même transaction le contrat initial avant que celui-ci n'ait terminé sa première exécution. Dans cet exemple, l'ordre des opérations est crucial : d'abord, la déduction du solde avant d'effectuer l'appel externe. Le cas le plus notoire d'une attaque de réentrance est celui qui a touché The DAO en 2016. La fonction constructeur du portefeuille pouvait être appelée à nouveau après son instanciation et permettait à l’attaquant de devenir le propriétaire du portefeuille.
Débordements (overflows) et sous-débordements (underflows)
Les débordements (overflows) et les sous-débordements (underflows) sont des vulnérabilités courantes dans les smart contracts écrites en Solidity. Un sous-débordement intervient quand une opération de soustraction aboutit à un résultat inférieur à la limite minimale du type. En respectant ces principes et en s'équipant d'outils adaptés, le risque d'exploitation par débordement ou sous-débordement dans les smart contracts peut être significativement réduit. Le premier problème est le type de i, uint8 sera appliqué car c’est le plus petit type qui supporte la valeur 0. Si le tableau a plus de 255 éléments, la boucle ne se terminera pas, ce qui entraînera une épuisement du gas. Utiliser le type uint explicitement est plus judicieux car cela évitera les surprises et augmentera la limite.
Attaques de force brute et phishing
Les attaques de force brute sont une menace insidieuse pour les smart contracts, où un attaquant essaie de deviner un mot de passe ou une clé par une tentative systématique de toutes les combinaisons possibles. Dans une attaque de force brute, les assaillants utilisent des outils automatisés pour générer et tester rapidement un grand nombre de combinaisons de clés ou de mots de passe. Pour contrer ces attaques, il est essentiel d'adopter des protocoles de sécurité robustes. Il est vital de renforcer les smart contracts contre les vulnérabilités liées à la force brute. La menace du phishing et de l'ingénierie sociale est omniprésente dans l'écosystème blockchain, touchant autant les utilisateurs novices que ceux plus avertis. La vigilance et la formation continue sont essentielles pour contrecarrer les efforts des cybercriminels qui utilisent le phishing et l'ingénierie sociale pour cibler les smart contracts et les actifs cryptographiques.
Lire aussi: Crèches et sécurité au Royaume-Uni
Exemples concrets d'attaques
Prenons l'exemple The DAO, sans doute l'un des cas les plus infâmes où une faille a permis à un attaquant de drainer plus de 3,6 millions d'Ether. Mt. Gox a subi en 2014 une attaque menant à sa faillite. La vulnérabilité était fondée sur la « malléabilité de transactions » de la Blockchain Bitcoin, permettant à un attaquant de changer l’identifiant d’une transaction avant sa confirmation. Parity est un portefeuille dédié à la blockchain Ethereum. En juillet 2017, le portefeuille Parity a été hacké. La vulnérabilité applicative venait du code du Smart Contract qui était hérité (importation d’une bibliothèque externe) dans l’implémentation de Parity.
Bonnes pratiques de sécurité
L'élaboration de smart contracts sûrs est cruciale, car les conséquences d'une faille de sécurité peuvent être désastreuses. Les développeurs doivent adopter une approche proactive en matière de sécurité des smart contracts. La sécurité des smart contracts débute avec une programmation robuste et consciente des risques.
Audit de code et tests rigoureux
Les smart contracts devraient être soumis à des audits de code indépendants pour détecter et corriger les vulnérabilités potentielles avant et pendant le déploiement. Un processus rigoureux de tests et d’audit est essentiel pour déceler les failles potentielles dans nos smart contracts. En cas de découverte de bug, le processus de correction doit être effectué avec précaution. La résilience des smart contracts est essentielle pour assurer une protection optimale. Les tests sont cruciaux dans le cycle de développement de tout smart contract.
Utilisation de bibliothèques testées et validation des données
Plutôt que de réinventer la roue, il est conseillé d'utiliser des bibliothèques de smart contracts bien testées et sécurisées pour des fonctions courantes, réduisant ainsi le risque de bugs. Toutes les données externes (provenant d'oracles ou d'autres contrats) devraient être validées rigoureusement pour prévenir les manipulations.
Programmation défensive et gestion des erreurs
En Solidity, la programmation défensive consiste à anticiper les comportements imprévus pour prévenir les failles et les attaques. Toutes les entrées doivent être vérifiées pour leur validité. Utiliser des assertions pour les conditions qui ne devraient jamais être fausses. Écrivez des tests spécifiques pour chaque fonctionnalité ou composante du smart contract. Nous voulons éviter qu’un contrat échoue silencieusement ou qu’il continue à être exécuté dans un état instable ou incohérent. La fonction getSalary vérifie les conditions avant de retourner le salaire stocké, ce qui est une bonne chose. Le problème c’est que dans le cas où ces conditions ne sont pas remplies, une valeur par défaut est renvoyée. Cela pourrait cacher une erreur de l’appelant. S’en tenir à cette structure de fonctions vous évitera beaucoup de problèmes : Conditions, actions, interactions.
Lire aussi: Agir contre les maladies infantiles mortelles
Importance du nommage et de la simplicité
Un code est fiable (au sens sécurisé) lorsque correspondent notre intention et ce que notre code permet réellement de faire. C’est très difficile à vérifier, surtout si le code est énorme et désordonné. Le nommage est également l’un des meilleurs moyens d’exprimer notre intention lors de l’écriture du code. Etudions un exemple de mauvais nommage d’événements. Regardez cette fonction à partir de The DAO. Le problème le plus important est que c’est trop long et trop complexe. Essayez de garder vos fonctions beaucoup plus courtes, disons 30 ou 40 lignes de code max. Idéalement, vous devriez pouvoir lire les fonctions et comprendre ce qu’elles font en moins d’une minute. Un autre problème est le mauvais nom pour l’événement Transfer. Le nom diffère d’une fonction appelée transfer par seulement 1 caractère! Cela apporte beaucoup de confusion. En général, le nommage recommandé pour les événements est de préfixer la variable par “Log”. N’oubliez pas, écrivez des contrats simples, modulaires et aussi bien nommés que possible.
Limites de l'EVM et gestion du Gas
L’EVM a beaucoup de limites strictes sur ce que nos contrats peuvent faire. Ce sont des considérations de sécurité au niveau de la plateforme, mais elles peuvent menacer la sécurité de votre contrat si vous les ignorez. La deuxième aspect que vous devez considérer est la limite de gas. Le gas est le mécanisme d’Ethereum pour payer les ressources du réseau. Chaque appel de fonction qui modifie l’état a un coût en gas. Imaginez que CalculBonus détermine le bonus pour chaque employé en fonction d’un calcul complexe, comme le calcul du profit sur de nombreux projets par exemple. Cela dépenserait beaucoup de gas, ce qui pourrait facilement atteindre la limite de gas de la transaction ou du bloc. Si une transaction atteint la limite de gas, toutes les modifications sont annulées, mais les frais eux restent à payer. Enfin, la profondeur de la pile d’appels est limitée. La pile d’appels de l’EVM a une limite stricte de 1024. Cela signifie que si le nombre d’appels récursifs atteint 1024, le contrat échoue.
Pull Payments
Chaque transfert d’ether implique une exécution potentielle de code. L’adresse de réception peut implémenter une “Fallback” fonction qui peut lancer une erreur. Ainsi, nous ne devrions jamais considérer qu’un appel à send s’exécute sans erreur. Une solution: nos contrats devraient favoriser les “pull paiements”.
Gestion des vulnérabilités et tolérance aux pannes
En plus de cela, nous devrions essayer de découvrir ces vulnérabilités le plus tôt possible. Une idée simple est de permettre au gardien d’un contrat de geler le contrat en cas d’urgence. Stoppable permet de spécifier l’adresse d’un gardien (curator) qui pourra arrêter le contrat. Que signifie «arrêter le contrat»? Cela doit être défini par le contrat enfant qui hérite de Stoppable en utilisant les fonctions modifiers stopInEmergency et onlyInEmergency. Une autre façon de protéger nos smart contracts contre les attaques est de limiter leur portée. Tous les smart contracts ne doivent pas avoir des enjeux aussi importants, surtout si nous effectuons des tests. Dans ce contexte, il pourrait être utile de limiter le montant des fonds que notre contrat accepte.
Outils et services de sécurité
La sécurisation des smart contracts est une opération délicate qui requiert des outils spécialisés pour identifier et remédier aux risques potentiels. L'analyse statique est une méthode de vérification du code qui s'effectue sans exécuter le programme. L'utilisation de ces outils et services est une composante fondamentale de la stratégie de sécurisation des smart contracts.
Sociétés d'audit de smart contracts
De nombreuses sociétés se développent ainsi en ayant pour mission d’auditer ces fameux contrats intelligents. En Europe, des exemples de structures se situent en Allemagne avec par exemple SolidProof et Chainsulting. En France certains cabinets d’audits traditionnels se saisissent du sujet et développent également des solutions technologiques permettant d’interroger la sécurité d’une blockchain. Parmi les sociétés d'audit de smart contract, on retrouve Hacken, Quantstamp, Halborn, OpenZeppelin, Trail of Bits et Kalos.
Importance de la cartographie des risques
Nous recommandons ainsi de toujours accorder la plus grande importance à l’étape de cartographie des risques de tout projet mettant en œuvre un support contractuel tel que le smart contract.
Innovations et perspectives d'avenir
Les avancées technologiques en matière de blockchain et de cryptographie apportent de nouvelles possibilités pour renforcer la sécurité des contrats intelligents. Par exemple, les Zero-Knowledge Proofs permettent de vérifier les transactions sans révéler d'informations sensibles. L'intelligence artificielle (IA) peut jouer un rôle crucial dans l'identification des vulnérabilités des smart contracts. Utilisant le machine learning et le deep learning, l'IA peut analyser d'énormes ensembles de données pour repérer des motifs anormaux qui pourraient indiquer des failles ou des tentatives d'intrusion.
Rôle de l'IA et de la surveillance continue
La DeFi (Finance Décentralisée) a révolutionné le secteur financier en tirant parti des smart contracts sur les blockchains pour créer des protocoles autonomes qui permettent aux utilisateurs d'accéder à des services financiers sans intermédiaire. Cependant, les aspects de cybersécurité sont cruciaux dans l'écosystème DeFi, en particulier en ce qui concerne les pools de liquidités. Les projets DeFi qui réussissent à maintenir la confiance des utilisateurs sont ceux qui accordent une priorité élevée à la cybersécurité, investissant dans des audits professionnels et en mettant en place des mécanismes de sécurité solides pour protéger les actifs des participants. La validation d'un contrat intelligent ne se termine pas après son déploiement.
Évolution réglementaire et conformité
L'environnement réglementaire autour des blockchains et des smart contracts est en pleine évolution. Des organismes tels que la Commission Européenne travaillent sur des régulations telles que le Crypto-Assets Markets (MiCA) qui vise à établir un cadre légal pour les actifs cryptographiques et les services associés. Il est primordial pour les développeurs et les entreprises de rester informés des changements réglementaires pour s'assurer de la conformité et de l'efficacité de leur solutions de sécurité pour smart contracts. La conformité réglementaire implique pour les développeurs l'obligation de suivre les meilleures pratiques de codage et d'être au courant des changements légaux affectant les smart contracts. Les organismes de régulation jouent un rôle crucial en établissant des normes que les smart contracts doivent respecter pour garantir la sécurité et la confiance dans l'écosystème blockchain. Ils fournissent des directives sur la manière dont les smart contracts doivent être structurés, vérifiés et mis en œuvre pour éviter les abus et les vulnérabilités.
tags: #attaque #smart #contract #types
