Un outil pour détecter les contrats intelligents métamorphiques PlatoBlockchain Data Intelligence. Recherche verticale. Aï.

Un outil pour détecter les contrats intelligents métamorphiques

Une hypothèse de sécurité critique d'Ethereum est que le code de contrat intelligent est immuable et ne peut donc pas être modifié une fois déployé sur la blockchain. En pratique, certains contrats intelligents vous changer – même après leur déploiement. Avec quelques astuces astucieuses, vous pouvez créer des contrats intelligents métamorphiques qui "se métamorphoser» en quelque chose d'autre – et en comprenant ce qui les rend possibles, vous pouvez les détecter.

Les contrats intelligents métamorphiques sont modifiables, ce qui signifie que les développeurs peuvent modifier le code qu'ils contiennent. Ces contrats intelligents présentent un risque sérieux pour les utilisateurs du web3 qui font confiance au code qu'ils s'attendent à exécuter avec une cohérence absolue, d'autant plus que de mauvais acteurs peuvent exploiter cette capacité de changement de forme. Imaginez un attaquant utilisant la technique pour «taper» les personnes qui jalonnent des jetons dans un contrat intelligent dont ils ne réalisent pas qu'il est métamorphique. Les attaques basées sur cette prémisse et sur des prémisses similaires pourraient équiper les escrocs pour s'attaquer aux gens et généralement saper la confiance dans la pleine promesse des systèmes décentralisés.

Pour analyser si un contrat intelligent contient des propriétés métamorphiques, j'ai construit un simple Détecteur de contrat métamorphique (inspiré et construit sur le travail original de Jason Carver, 0ageet autres). N'importe qui peut utiliser l'outil pour vérifier si un contrat donné présente des signaux d'alarme qui pourraient indiquer un potentiel de métamorphisme. La méthode n'est pas infaillible : ce n'est pas parce qu'un contrat intelligent affiche un indicateur qu'il est nécessairement métamorphique ; et ce n'est pas parce que ce n'est pas le cas que c'est sûr. Le vérificateur offre simplement une évaluation initiale rapide qu'un contrat pourrait être métamorphique en fonction d'indicateurs possibles. 

Les utilisateurs de Web3 doivent se familiariser avec les menaces posées par les contrats métamorphiques afin qu'ils puissent rechercher et éviter d'éventuelles attaques. Les portefeuilles et les indexeurs de blockchain peuvent aider en avertissant les utilisateurs avant qu'ils n'interagissent avec un contrat intelligent susceptible de contenir des propriétés métamorphiques. Cet outil est destiné à aider à la fois à éduquer les gens sur cette menace potentielle… et à se défendre contre elle.

Détecter les contrats intelligents métamorphiques

Les Détecteur de contrat métamorphique J'ai construit des analyses de six propriétés qui peuvent indiquer si un contrat intelligent est métamorphique.

    1. Un code métamorphique connu a-t-il été utilisé pour déployer le contrat ? Si un bytecode métamorphique connu – le code de niveau inférieur lisible par machine virtuelle que les contrats intelligents Ethereum, généralement écrits dans Solidity, deviennent après avoir été compilé – apparaît dans une transaction pour le déploiement d'un contrat intelligent donné, c'est un drapeau rouge majeur. Dans les sections qui suivent, nous discuterons d'un tel exemple de bytecode métamorphique développé par 0age. Une mise en garde importante : il existe potentiellement d'innombrables variations de bytecode métamorphique, ce qui rend difficile la détection de toutes les variétés. En analysant les instances bien connues, le détecteur élimine les fruits à portée de main pour les attaquants qui ne font que copier et coller des exemples existants.
    2. Le code de contrat intelligent peut-il s'autodétruire ? Pour remplacer le code dans un contrat - une étape clé dans la création d'un contrat métamorphique - un développeur doit d'abord supprimer le code préexistant. La seule façon de le faire est d'utiliser le Code opération SELFDESTRUCT, une commande qui fait exactement ce à quoi elle ressemble - elle efface tout le code et le stockage à une adresse de contrat donnée. La présence de code autodestructeur dans un contrat ne prouve pas qu'il soit métamorphique ; cependant, il offre un indice que le contrat pourrait être métamorphique et il vaut la peine de savoir, de toute façon, si les contrats sur lesquels vous comptez peuvent se neutraliser.
    3. Le contrat intelligent appelle-t-il du code d'ailleurs ? Si le contrat intelligent en question ne peut pas s'autodétruire directement, il peut toujours être en mesure de s'effacer en utilisant le Code opération DELEGATECALL. Cet opcode permet à un contrat intelligent de charger et d'exécuter dynamiquement du code qui réside dans un autre contrat intelligent. Même si le contrat intelligent ne contient pas l'opcode SELFDESTRUCT, il peut utiliser DELEGATECALL pour charger du code autodestructeur depuis un autre endroit. Bien que la fonctionnalité DELEGATECALL n'indique pas directement si un contrat intelligent est métamorphique, c'est un indice possible - et un problème de sécurité potentiel - qui mérite d'être noté. Soyez averti que cet indicateur a le potentiel de générer de nombreux faux positifs. 
    4. Un autre contrat a-t-il déployé ce contrat ? Des contrats métamorphiques peuvent être déployés uniquement par d'autres contrats intelligents. En effet, les contrats métamorphiques sont activés par un autre opcode, utilisable uniquement par d'autres contrats intelligents, appelé CREATE2. (Nous discuterons de CREATE2 - comment cela fonctionne et pourquoi c'est important - plus dans une section ultérieure.) Ce trait est l'un des indicateurs les moins visibles d'un métamorphisme possible ; c'est un préalable nécessaire mais insuffisant. La recherche de ce trait est susceptible de générer de nombreux faux positifs - mais il s'agit d'informations précieuses à connaître car cela peut éveiller des soupçons et fournir une raison d'examiner un contrat plus en détail, en particulier si le contrat intelligent contient l'opcode décrit ci-après.
    5. Le contrat de déploiement contient-il l'opcode CREATE2 ? Comme mentionné ci-dessus, le déploiement via CREATE2 est une condition préalable essentielle au métamorphisme. Si un contrat de déploiement contient l'opcode CREATE2, cela peut indiquer qu'il a utilisé CREATE2 pour déployer le contrat en question. Si le déployeur a effectivement utilisé CREATE2 pour déployer ledit contrat, cela ne signifie pas que le contrat est nécessairement métamorphique, cela signifie qu'il pourrait être métamorphique et il peut être sage de procéder avec prudence et d'enquêter plus avant. Encore une fois, méfiez-vous des faux positifs : CRÉER2 a beaucoup de utilisations légitimes, y compris le renforcement Solutions de mise à l'échelle "couche 2" et faciliter la création de portefeuilles de contrats intelligents qui peuvent améliorer le web3 intégration des utilisateurs et les options de récupération de clé.
    6. Le code a-t-il changé ? C'est le tell le plus évident, mais il n'apparaîtra qu'après la transformation d'un contrat métamorphique. Si le code de hachage du contrat intelligent - un identifiant cryptographique unique - est différent de ce qu'il était lors du déploiement initial du contrat, il est probable que le code a été supprimé, remplacé ou modifié. Si les hachages ne correspondent plus, alors quelque chose dans le code a changé et le contrat peut être métamorphique. Ce drapeau est l'indicateur le plus sûr du métamorphisme, mais il n'aidera pas à prédire ou à anticiper le morphing puisqu'il vérifie seulement qu'il s'est déjà produit.

En plus de créer un outil de ligne de commande simple pour le détecteur de contrat métamorphique, j'ai créé quelques exemples de contrats intelligents qui illustrent un scénario de jalonnement de contrat métamorphique frauduleux, que je décris dans la section suivante. Tout le code est disponible dans ce GitHub référentiel

Comment un acteur malveillant peut utiliser des contrats métamorphiques pour voler les fonds des gens

Voici comment quelqu'un pourrait utiliser un contrat intelligent métamorphique dans le cadre d'une arnaque. 

La première est la phase de configuration. L'attaquant déploie un contrat intelligent à une adresse spécifique sur la blockchain à l'aide de deux outils : le bytecode métamorphique et l'opcode CREATE2. (Nous développerons ces deux concepts plus tard.) Le bytecode métamorphique fait alors ce que son nom suggère et « se transforme ». Ici, il se transforme en contrat de jalonnement où les utilisateurs peuvent miser des jetons ERC-20. (Encore une fois, nous discuterons des détails de cette astuce de morphing plus tard. Promis !)

Vient ensuite l'appât et l'interrupteur. Les utilisateurs peu méfiants misent leurs jetons dans ce contrat, attirés par la possibilité de gagner un rendement ou un autre avantage. L'attaquant supprime ensuite tout le code de jalonnement et "l'état" - le stockage ou la mémoire de la blockchain - à cette adresse de contrat intelligent en utilisant le Code opération SELFDESTRUCT discuté dans la section précédente. (Il convient de noter que les jetons - qui existent dans le cadre d'un contrat ERC-20 distinct - persistent, non affectés par le contrat auto-détruit.)

Enfin, le tapis-pull. L'attaquant réutilise le même bytecode métamorphique utilisé lors de la phase de configuration pour « redéployer » un nouveau contrat. Ce nouveau contrat se déploie à la même adresse récemment libérée par le contrat d'autodestruction. Cette fois, cependant, le bytecode "se transforme" (encore une fois, nous expliquerons comment plus tard) en un contrat malveillant qui peut voler tous les jetons jalonnés à l'adresse du contrat. Arnaque terminée. 

Les risques que posent les contrats intelligents métamorphiques sont désormais clairement apparents. Mais vous vous demandez peut-être encore comment fonctionne cette astuce de métamorphisme ? Pour comprendre cela, vous devez sonder plus profondément, au niveau du bytecode. 

Comment CREATE2 ouvre la possibilité du métamorphisme 

CRÉER2 est une mise à jour d'opcode, présenté à Ethereum en février 2019, qui offre une nouvelle façon de déployer des contrats intelligents. 

CREATE2 donne aux développeurs plus de contrôle sur le déploiement de leurs contrats intelligents qu'ils n'en avaient auparavant. L'opcode CREATE d'origine rend difficile pour les développeurs le contrôle de l'adresse de destination d'un contrat intelligent à déployer. Avec CREATE2, les utilisateurs peuvent contrôler et connaître à l'avance l'adresse d'un contrat intelligent particulier, avant de le déployer sur la blockchain. Cette connaissance préalable - plus quelques astuces astucieuses - est ce qui permet aux gens de créer des contrats intelligents métamorphiques. 

Comment CREATE2 peut-il prédire l'avenir ? Le calcul de l'opcode est déterministe : tant que les entrées ne changent pas, l'adresse déterminée par CREATE2 ne changera pas. (Même le plus petit changement entraînera le déploiement ailleurs.)

Plus granulairement, CREATE2 est une fonction qui combine et hache quelques éléments. Tout d'abord, il intègre l'adresse du déployeur (ou de l'expéditeur) : le contrat intelligent initiateur qui agit en tant que parent de celui à créer. Ensuite, il ajoute un numéro arbitraire fourni par l'expéditeur (ou "sel"), ce qui permet au développeur de déployer le même code à différentes adresses (en changeant le sel) et empêche d'écraser les contrats identiques existants. Enfin, il utilise le hachage keccak256 d'un bytecode d'initialisation de contrat intelligent ("init"), qui est la graine qui se transforme en un nouveau contrat intelligent. Cette combinaison hachée ensemble détermine une adresse Ethereum, puis déploie le bytecode donné à cette adresse. Aussi longtemps que le bytecode reste exactement le même, CREATE2 déploiera toujours le bytecode donné à la même adresse sur la blockchain.

Voici à quoi ressemble la formule CREATE2. (Remarque : vous remarquerez un autre élément, un "0xFF", dans l'exemple ci-dessous. C'est juste une constante que CREATE2 utilise pour prévenir les collisions avec l'opcode CREATE précédent.)

Maintenant que nous avons un moyen de déployer du code sur une adresse déterministe, comment est-il possible de Change le code à cette même adresse ? Au début, cela peut sembler impossible. Si vous souhaitez déployer un nouveau code à l'aide de CREATE2, le bytecode doit changer et, par conséquent, CREATE2 se déploiera à une adresse différente. Mais que se passerait-il si un développeur construisait le bytecode de manière à ce qu'il puisse « se transformer » en un code différent lorsque CREATE2 déploie un contrat intelligent ?

Comment fonctionne réellement un contrat métamorphique

La recette pour transformer un contrat intelligent en un contrat métamorphique nécessite trois contrats intelligents au total, chacun jouant un rôle unique.

L'un de ces composants nécessaires est la Metamorphic Contract Factory, le cerveau de l'opération. Cette « usine » est responsable du déploiement du contrat métamorphique ainsi que d'un autre contrat intelligent appelé contrat de mise en œuvre, ainsi nommé parce que son code est finalement implémenté à l'intérieur du contrat métamorphique. Une subtile chorégraphie entre ces trois contrats aboutit à un métamorphisme, comme le montre le schéma ci-dessous.

Un outil pour détecter les contrats intelligents métamorphiques PlatoBlockchain Data Intelligence. Recherche verticale. Aï.

Discutons de chaque étape, 1 à 7, en détail pour éclairer les opérations en cours.

Étape 1 : Un développeur met tout en mouvement

Un codeur conçoit un code de contrat intelligent - le bytecode du contrat d'implémentation - qui finira par se retrouver dans le contrat métamorphique. Le développeur envoie ce code à la Metamorphic Contract Factory, un contrat intelligent dont le but principal est de déployer d'autres contrats intelligents. Cette action met en mouvement l'ensemble du processus de création du contrat métamorphique.

Tout ce qui suit est le résultat de cette première étape. En effet, Les étapes 1 à 6 se déroulent en une seule transaction atomique sur la blockchain, c'est-à-dire presque toutes en même temps. Ces étapes peuvent être répétées encore et encore, à l'infini, pour remplacer le code à l'intérieur du contrat métamorphique et le faire évoluer en permanence.

Étape 2 : L'usine déploie le contrat de mise en œuvre

Le premier contrat que l'usine déploie est le contrat d'implémentation, qui contient le code d'implémentation. (Créatif, nous le savons.) Considérez le contrat de mise en œuvre comme un quai de chargement, ou un point de cheminement, qui contient du code avant qu'il ne soit expédié à sa destination finale, qui sera, dans ce cas, à l'intérieur du contrat métamorphique. 

Étape 3 : Adresse du contrat de mise en œuvre des magasins d'usine

Après son déploiement sur la blockchain, le contrat de mise en œuvre existera nécessairement à une adresse de blockchain. L'usine stocke cette adresse de contrat dans sa propre mémoire (à utiliser ultérieurement, à l'étape 5). 

Étape 4 : L'usine déploie le contrat métamorphique

L'usine déploie le contrat métamorphique à l'aide de CREATE2 et du bytecode métamorphique. Vous pouvez trouver une présentation technique détaillée du fonctionnement du bytecode métamorphique ici, mais il suffit de dire que lorsque le bytecode métamorphique s'exécute, il copie le code d'un autre emplacement sur la chaîne - dans ce cas, du contrat d'implémentation - dans le contrat métamorphique. Comme nous en avons parlé dans la dernière section, puisque CREATE2 est déterministe - tant que le même expéditeur, le même sel et le même bytecode sont utilisés - alors l'adresse du contrat métamorphique reste la même quel que soit le nombre de fois que ces étapes sont répétées.

Vous trouverez ci-dessous un exemple de ce à quoi ressemble le bytecode métamorphique, à partir du dépôt métamorphique par 0âge. Ceci n'est qu'un exemple de bytecode métamorphique - il existe potentiellement d'innombrables variations, ce qui complique énormément la détection des contrats métamorphiques.

Un outil pour détecter les contrats intelligents métamorphiques PlatoBlockchain Data Intelligence. Recherche verticale. Aï.

Étape 5 : Le bytecode métamorphique interroge l'usine pour l'adresse du contrat d'implémentation

Le bytecode métamorphique demande à l'usine l'adresse du contrat d'implémentation (telle qu'enregistrée à l'étape 3). Peu importe si l'adresse du contrat de mise en œuvre change tant que le bytecode métamorphique qui demande l'adresse reste le même. En effet, si le développeur déploie ultérieurement un nouveau contrat d'implémentation - tel qu'un contrat malveillant conçu pour voler des jetons - il se déploiera nécessairement à une adresse de blockchain différente, par étape 2. Cela n'a aucun impact sur la création du contrat métamorphique.

Étape 6: Le code du contrat d'implémentation est copié dans le contrat métamorphique

À l'aide de l'adresse blockchain apprise à l'étape 5, le bytecode métamorphique localise le code dans le contrat de mise en œuvre et copie ce code dans le stockage local du contrat métamorphique. C'est ainsi que le contrat métamorphique change de forme : en copiant le code du contrat de mise en œuvre. 

Étape 7 : Rincez et répétez

Un développeur peut répéter les étapes 1 à 6 encore et encore et remplacer le code du contrat métamorphique par ce qu'il veut au moyen d'un nouveau contrat d'implémentation. Tout ce qui est nécessaire est d'utiliser l'opcode SELFDESTRUCT - ou, plus sournoisement, les opcodes DELEGATECALL qui aboutissent finalement à un SELFDESTRUCT - pour supprimer le code préexistant dans le contrat métamorphique. En répétant le cycle avec le nouveau bytecode du contrat de mise en œuvre, le contrat métamorphique va, comme par magie, métamorphoser !

En utilisant cette technique de création de contrats métamorphiques, un développeur astucieux peut constamment déplacer le terrain sous les pieds des utilisateurs du web3. Prenons, par exemple, le scénario de l'escroquerie à nouveau. Un développeur peut d'abord déployer le contrat de mise en œuvre avec un code de jalonnement de jetons qui, à travers le chemin détourné décrit dans le graphique et élaboré dans les étapes ci-dessus, aboutit au contrat métamorphique. L'escroc pourrait plus tard autodétruire ce code et le remplacer en déployant un nouveau contrat de mise en œuvre contenant un jeton.vol code. 

Tout ce qui est déployé dans le contrat de mise en œuvre finira par se retrouver dans le contrat métamorphique. C'est l'essence de l'astuce. 

***

Les contrats intelligents métamorphiques rompent le contrat social Web3 implicite selon lequel ce que vous voyez est ce que vous obtenez. Semblable à la façon dont le jeu de coquille utilise trois gobelets mobiles pour cacher une balle, l'interaction des trois contrats dans la création d'un contrat métamorphique rend difficile de suivre la véritable fonction du contrat. Le jeu de la coquille est une comparaison particulièrement appropriée car les escrocs de confiance utiliseront souvent des tours de passe-passe et des erreurs de direction pour s'assurer qu'ils gagnent. Dans la version web3, les rédacteurs de contrats métamorphiques peuvent de la même manière faire disparaître la "boule" - le code d'implémentation, c'est-à-dire - (lire : autodestruction), et ils peuvent le remplacer par ce qu'ils veulent.

L'existence de contrats métamorphiques signifie qu'il est possible pour les utilisateurs du web3 de conclure des contrats qui peuvent changer à volonté - c'est pourquoi il est si important de comprendre cette menace et de s'en défendre. Mon détecteur de contrat métamorphique n'offre qu'un premier pas vers l'identification des contrats métamorphiques par le tour de passe-passe qu'ils emploient. Il existe plusieurs façons d'améliorer le détecteur à l'avenir. Par exemple, en vérifiant récursivement l'usine (ou le contrat de déploiement) qui a créé le contrat métamorphique, on pourrait voir si l'usine est elle-même métamorphique. Cette fonctionnalité serait un ajout utile à une version 2 mise à niveau du détecteur.

Cela vaut la peine de le répéter une fois de plus : cet outil de détection n'est pas infaillible. Les drapeaux qu'il attrape ne sont pas tous des signes révélateurs d'un potentiel métamorphique, mais ils offrent des indices. L'identification de ces drapeaux n'est que le début d'une enquête plus approfondie. C'est pourquoi nous avons étendu le détecteur pour rechercher des drapeaux qui pourraient facilement générer des faux positifs, comme la présence des opcodes CREATE2 ou DELEGATECALL. Si vous avez des suggestions pour améliorer l'outil ou si vous souhaitez développer ou compléter ce travail initial, contactez-moi à .

Analyser les contrats intelligents pour les traits métamorphiques à l'aide de l'outil de détection et visitez le GitHub repo pour plus d'

Éditeur : Robert Hackett @rhhackett

***

Remerciements : Je tiens à remercier ÉNORMÉMENT Robert Hackett, Eddy Lazzarin, Sam Ragsdale, Riyaz Faizullabhoy, Noah Citron, Mason Hall et Daejun Park pour leurs précieux commentaires et conseils pour donner vie à cet article et à cet outil. 

***

Les opinions exprimées ici sont celles du personnel individuel d'AH Capital Management, LLC (« a16z ») cité et ne sont pas les opinions d'a16z ou de ses sociétés affiliées. Certaines informations contenues ici ont été obtenues de sources tierces, y compris de sociétés de portefeuille de fonds gérés par a16z. Bien qu'elles proviennent de sources considérées comme fiables, a16z n'a pas vérifié ces informations de manière indépendante et ne fait aucune déclaration quant à l'exactitude durable des informations ou à leur pertinence dans une situation donnée. De plus, ce contenu peut inclure des publicités de tiers ; a16z n'a pas examiné ces publicités et n'approuve aucun contenu publicitaire qu'elles contiennent.

Ce contenu est fourni à titre informatif uniquement et ne doit pas être considéré comme un conseil juridique, commercial, d'investissement ou fiscal. Vous devriez consulter vos propres conseillers sur ces questions. Les références à des titres ou à des actifs numériques sont uniquement à des fins d'illustration et ne constituent pas une recommandation d'investissement ou une offre de fournir des services de conseil en investissement. En outre, ce contenu n'est ni destiné ni destiné à être utilisé par des investisseurs ou des investisseurs potentiels, et ne peut en aucun cas être invoqué pour prendre une décision d'investir dans un fonds géré par a16z. (Une offre d'investissement dans un fonds a16z ne sera faite que par le mémorandum de placement privé, le contrat de souscription et toute autre documentation pertinente de ce fonds et doit être lu dans son intégralité.) Tous les investissements ou sociétés de portefeuille mentionnés, référencés ou décrits ne sont pas représentatifs de tous les investissements dans des véhicules gérés par a16z, et rien ne garantit que les investissements seront rentables ou que d'autres investissements réalisés à l'avenir auront des caractéristiques ou des résultats similaires. Une liste des investissements effectués par des fonds gérés par Andreessen Horowitz (à l'exclusion des investissements pour lesquels l'émetteur n'a pas autorisé a16z à divulguer publiquement ainsi que des investissements non annoncés dans des actifs numériques cotés en bourse) est disponible sur https://a16z.com/investments /.

Les tableaux et graphiques fournis ici sont uniquement à des fins d'information et ne doivent pas être utilisés pour prendre une décision d'investissement. Les performances passées ne représentent pas les résultats futurs. Le contenu ne parle qu'à la date indiquée. Toutes les projections, estimations, prévisions, objectifs, perspectives et/ou opinions exprimées dans ces documents sont susceptibles d'être modifiées sans préavis et peuvent différer ou être contraires aux opinions exprimées par d'autres. Veuillez consulter https://a16z.com/disclosures pour des informations supplémentaires importantes.

Horodatage:

Plus de Andreessen Horowitz