Présentation de Solidify : un outil pour détecter et classer automatiquement les risques de sécurité des contrats intelligents


Présentation de Solidify : un outil pour détecter et classer automatiquement les risques de sécurité des contrats intelligents

Par Peter Kacherginsky, ingénieur principal en sécurité Blockchain

Lorsque notre équipe de sécurité blockchain a commencé à effectuer des examens de la sécurité des contrats intelligents en 2018, nous ne savions pas que nous ferions des centaines d'examens en 2021.

Pour développer le système financier ouvert, Coinbase s'engage à étendre sa liste de crypto-monnaies prises en charge. Nous avons récemment lancé Asset Hub pour rationaliser notre processus de diligence raisonnable pour les nouvelles inscriptions. L'un des facteurs critiques que nous considérons est la sécurité des contrats intelligents, en particulier en ce qui concerne les jetons basés sur Ethereum, dont la complexité technique peut varier considérablement. Par conséquent, nous avons créé un outil de sécurité de contrat intelligent appelé Solidify pour aider à automatiser, standardiser et faire évoluer ce processus.

L'analyse manuelle des contrats intelligents est un processus long et sujet aux erreurs. Les équipes expérimentées négligent les vulnérabilités occasionnelles qui peuvent entraîner des pertes financières importantes. Pour assurer la sécurité de nos clients et de Coinbase, notre processus de liste de jetons nécessite des examens de sécurité et des recommandations d'atténuation des risques pour chaque contrat intelligent. Considérez notre défi de découvrir comment exécuter ce processus d'identification et de recommandation des risques spécialisés à grande échelle. Nous identifions les scanners de sécurité des contrats intelligents existants qui sont orientés vers les examens manuels. Mais ces outils n'offrent pas les garanties de sécurité requises ou un score de risque standardisé pour une analyse entièrement automatisée.

Pour résoudre ce problème, nous avons développé un outil appelé Solidify (un jeu Solidity) pour augmenter le taux d'examens de sécurité pour les nouveaux actifs sans abaisser notre niveau de sécurité élevé que les clients de Coinbase s'attendent à protéger leurs jetons. Solidify utilise une grande base de données de signatures et un moteur de correspondance de modèles pour détecter de manière fiable les caractéristiques et les risques des contrats, normaliser et qualifier les risques liés aux contrats intelligents, suggérer des stratégies d'atténuation et générer des rapports détaillés pour nous aider à décider si Coinbase doit ou non répertorier l'actif. Solidify évalue les risques de sécurité de centaines de contrats intelligents, soit de manière entièrement automatique, soit en identifiant des fonctionnalités uniques qui nécessitent un examen manuel supplémentaire.

Comment fonctionne Solidifier

La plupart des risques des contrats intelligents proviennent des options de conception commerciale des émetteurs d'actifs qui introduisent des fonctionnalités potentiellement dangereuses (par exemple, gel, mise à jour, etc.) ou des implémentations de fonctionnalités non standard qui ne sont pas suffisamment testées (par exemple, une logique de retrait personnalisée). Du côté de la conception, nous notons que la plupart des émetteurs d'actifs utilisent des modèles standard tels que la bibliothèque de contrats OpenZeppelin pour implémenter des fonctionnalités telles que la pause d'actifs :

Contrat Pause est possédé {
Événement Pause () ;
Unpause () événement ;
        bool public ralentir = faux ;
        modificateur quandPasPause () {
exiger (! en pause);
_;
}
        modificateur quandPause () {
exiger (en pause) ;
_;
}
            fonction pause () onlyOwner whenNotPaused public {
en pause = vrai ;
Pause();
}
            une fonction reprendre () onlyOwner whenPaused public {
en pause = faux ;
Annuler la pause ();
}
}

Fontaine: openzeppelin-contracts-1.3.0 / contrats / cycle de vie / Pausable.sol

En utilisant les fonctions pause () ci-dessus, le propriétaire du contrat intelligent peut arrêter toutes les opérations d'envoi/réception et, dans certains cas, affecter négativement l'utilité du contrat. Par la présence de la bibliothèque de pause et des fonctions de transfert respectives qui les utilisent, nous pouvons classer de manière fiable le contrat comme présentant un risque de pause. Solidify le fait en ajoutant toutes les instances connues et les variations possibles dans le pause() fonction et vérifier automatiquement si le contrat actuellement analysé l'a. Des signatures uniques sont générées à l'aide de structures AST (Abstract Syntax Tree) pour éviter les doublons causés par de légères variations de syntaxe, tout en garantissant la précision grammaticale de ce que fait réellement la fonction.

L'exemple d'arbre AST ci-dessus pour la fonction pause () sera traité pour générer un hachage unique qui sera utilisé comme signature pour comparer avec d'autres contrats intelligents :

Vous trouverez ci-dessous un exemple d'entrée dans la base de données de signatures générée par Solidify pour le pause() une fonction:

{
"Hacher": 
"05654d81921af71079698aff1b4be500d1405ece9364a05915b738376c0250b5",
"Nom": "pause ()",
« Mutabilité » : « inestimable »,
"Fontaine":["signatures/openzeppelin/openzeppelin-contracts-1100/contracts/cyclodevida/Pausablesol:666:90:0"["signatures/openzeppelin/openzeppelin-contracts-1100/contracts/lifecycle/Pausablesol:666:90:0"["firmas/openzeppelin/openzeppelin-contratos-1100/contratos/ciclodevida/Pausablesol:666:90:0"["signatures/openzeppelin/openzeppelin-contracts-1100/contracts/lifecycle/Pausablesol:666:90:0"
"signatures / openzeppelin / openzeppelin-contracts-1.11.0 / contracts / life cycle / Pausable.sol: 666: 90: 0",  
"signatures / openzeppelin / openzeppelin-contracts-1.9.0 / contracts / lifecycle / Pausable.sol: 666: 90: 0"
[.. redacted ..]
],
    "Doc": "@dev appelé par le propriétaire pour mettre en pause, activer l'état arrêté  r",
"Caractéristiques":[[[[
"pause"
    ]
},

Remarquez que le même pause() La signature de fonction est présente dans 3 versions différentes de la bibliothèque OpenZeppelin et d'autres jetons qui incluaient littéralement ce code. La signature ci-dessus comprend également une liste de fonctionnalités telles que « pause » qui nous permet d'évaluer automatiquement le risque lié aux actifs et de suggérer des mesures d'atténuation (par exemple, une signature multiple forte pour le compte du propriétaire). Solidify effectue une comparaison de signature similaire avec chaque fonction dans un contrat analysé jusqu'à ce que toutes les fonctions soient découvertes ou ajoutées à notre base de données de signatures, nous n'avons donc jamais besoin d'analyser le même code deux fois.

Solidify dispose actuellement d'environ 6 000 signatures uniques qui sont utilisées pour faire correspondre efficacement les risques à un contrat intelligent donné. Un examen manuel qui a pris jusqu'à 2 jours ouvrables en 2018 peut être effectué en quelques minutes en 2021. Les capacités et les taux de détection de Solidify augmentent continuellement à mesure que nos ingénieurs en sécurité ajoutent de nouvelles signatures et enregistrent les risques associés.

Comment utiliser Solidifier

Jetons un coup d'œil à un exemple de contrat intelligent pour illustrer le moteur de recherche de signatures en action. Jetons un coup d'œil à ChainLink Token (LINK) et voyons à quel point il est sécurisé lors de l'exécution de Solidify sur votre contrat intelligent implémenté dans 0x514910771af9ca656af840dff83e8264ecf986ca:

% ./solidifier -a 0x514910771af9ca656af840dff83e8264ecf986ca
2021/05/20 15:16:22 Signatures de fonction 5777 chargées
2021/05/20 15:16:22 Traitement 0x514910771af9ca656af840dff83e8264ecf986ca
2021/05/20 15:16:23 Chargement des signatures de : contrats / LINK_0x514910771af9ca656af840dff83e8264ecf986ca / LinkToken.sol
2021/05/20 15:16:23 Génération AST pour les contrats / LINK_0x514910771af9ca656af840dff83e8264ecf986ca / LinkToken.sol
2021/05/20 15:16:24 Installation de la version solidity 0.4.21
2021/05/20 15:16:28 Réglez la version solc sur 0.4.21
2021/05/20 15:16:29 19 signatures détectées
2021/05/20 15:16:29 Stockage des rapports dans les rapports / LINK_0x514910771af9ca656af840dff83e8264ecf986ca / LINK.yml
2021/05/20 15:16:29 Stocker les rapports dans les rapports / LINK_0x514910771af9ca656af840dff83e8264ecf986ca / ChainLink Token (LINK) Security Memo.md

Il n'a fallu que quelques secondes à Solidify pour télécharger automatiquement le code source du contrat, générer AST à l'aide d'une version appropriée de Solidity, détecter et combiner 19 signatures de fonctions uniques. Voici un extrait du rapport Markdown produit par l'outil :

Évaluation de la sécurité ERC-20 : Token ChainLink (LINK)

Auditeur: Peter Kacherginsky
Solidifier la version : 1.2.3
Source du contrat : 0x514910771af9ca656af840dff83e8264ecf986ca

Résumé analytique

Date: 2021-05-20
Score de risque de sécurité résiduel : deux
Score de risque de sécurité inhérent : deux

Score de risque : 2
Description du risque : appel de direction externe

Score de risque : 1
Description du danger : utilisation des instructions de montage
** Les risques patrimoniaux sont calculés sur une échelle de 1 à 5, 5 étant le plus grave.

Aucune mesure d'atténuation n'est nécessaire pour cet actif.

Détails du risque

ChainLink Token présente les risques suivants :

2 | Appel de direction externe
Le contrat peut invoquer une autre fonction dans un contrat intelligent différent pour activer une fonctionnalité non définie dans le contrat lui-même.

Les appels vers des adresses externes augmentent la complexité et le risque des contrats intelligents. Les appels externes sont une condition préalable aux vulnérabilités de réentrée.

Les caractéristiques suivantes ont déclenché ce risque :

  • contractFallback (adresse, uint256, octets de mémoire)
  • transferAndCall (adresse, uint256, octets de mémoire)
  • transferAndCall (adresse, uint256, octets de mémoire)

1 | Utilisation des instructions de montage
Les instructions d'assemblage utilisent une interface de bas niveau pour manipuler directement la machine virtuelle Ethereum (EVM) au lieu d'utiliser le langage de robustesse de haut niveau. Par exemple, l'assemblage en ligne peut effectuer des appels de bas niveau vers d'autres contrats, manipuler directement les emplacements de stockage et contourner les protections des développeurs offertes par les langages de niveau supérieur.

L'utilisation d'instructions d'assemblage augmente la complexité et masque la fonctionnalité des contrats intelligents tout en contournant certaines des protections inhérentes au compilateur.

Les caractéristiques suivantes ont déclenché ce risque :

  • estContrat (adresse)

Détails de l'atténuation

La mise en œuvre des mesures d'atténuation des risques suivantes détermine le score de risque de sécurité résiduel : N/A

Surveillance

Surveillance du mou : N/A
Surveillance de la marge et de la pagination : N/A

Signatures de fonction correspondantes

062afb9e84bbfded288268dcd3860be4fac7576697e563970dbfedd29dd9f5ff - ajouter (uint256, uint256)
0f5d6c18af8bfe45551aea6c08ee36f2388d40721a399a99210754fb5b5d4fcc - estContrat (adresse)
27711ded0a7898d7ac3feca9c539c7660909efcc5bf12c8e8b8612d522be6ac4 - contractFallback (adresse, uint256, octets de mémoire)
2d299e0f7d2ea990e5ca714c04fbac5ae68615d9404bf447f42234f28891fcd5 - transferFrom (adresse, adresse, uint256)
3ee09ec574744840001f024d57db0a57f4986733e71f8355bf8cd7af08e03ef4 - transferAndCall (adresse, uint256, octets de mémoire)
504201695c6fb08bebd3aaa9ccc252afd104cedddc5a5db8785ff1ec93e3255d -
[.. REDACTED ..]

Sources de fonction correspondantes :

signatures / openzeppelin / openzeppelin-contracts-1.1.0 / contrats / jeton / BasicToken.sol
signatures / openzeppelin / openzeppelin-contracts-1.1.0 / contrats / jeton / StandardToken.sol
signatures / openzeppelin / openzeppelin-contracts-1.10.0 / contrats / maths / SafeMath.sol
signatures / openzeppelin / openzeppelin-contracts-1.11.0 / contrats / maths / SafeMath.sol
signatures / openzeppelin / openzeppelin-contracts-1.3.0 / contrats / maths / SafeMath.sol
[.. REDACTED ..]

La majeure partie du contrat provient des bibliothèques standard OpenZeppelin ou d'autres contrats intelligents populaires, ce qui facilite la combinaison de fonctionnalités. Il n'y avait que deux résultats informatifs liés à l'utilisation de code assembleur personnalisé et à l'exécution d'appels de fonctions externes ; cependant, ceux-ci ne posent pas en eux-mêmes de risque pour la sécurité. Sur la base du résultat ci-dessus, le jeton serait classé avec un score de risque de (2) qui est considéré comme un risque faible du point de vue de la sécurité.

Limites

Solidify est spécialement conçu pour répondre à notre besoin d'examiner rapidement et en toute sécurité les jetons ERC-20 et autres. Disposer d'interfaces de jetons standardisées et de fonctionnalités relativement limitées requises pour la gestion des comptes est idéal pour créer des bases de données de signatures correspondant à un grand pourcentage de contrats. Mais les actifs plus complexes, tels que les AMM et autres applications DeFi, nécessitent une analyse manuelle supplémentaire en raison du pourcentage élevé de code personnalisé. Cependant, Solidify est toujours bénéfique pour ces applications en analysant les clones DeFi ou en supprimant les bibliothèques standard de la portée de l'examen manuel afin que les analystes puissent se concentrer sur la logique personnalisée.

Bien que Solidify soit actuellement limité à la blockchain Ethereum et Solidity, il est prévu d'étendre l'outil à d'autres plates-formes basées sur EVM et de prendre en charge des langues supplémentaires telles que Vyper.

Étant donné que toutes les données dans Solidify sont complétées manuellement par les analystes, il existe également le risque que nous perdions ou classions mal les caractéristiques d'une signature, ce qui entraînerait une évaluation incorrecte. Nous sommes préoccupés par les contrats mis en œuvre qui tentent de cacher les portes dérobées via des constructeurs malveillants, l'obscurcissement du code, l'exploitation de l'outil lui-même et d'autres techniques. Des contrôles supplémentaires sont créés en interne pour valider les signatures, détecter les anomalies et les comportements malveillants.

Développement futur

Nous prévoyons d'ouvrir Solidify plus tard cette année. Pendant ce temps, le développement ultérieur se concentre sur:

  • Amélioration de la précision de la génération de signature et de la logique de détection
  • Intégrez des techniques de vérification formelles pour réduire le besoin d'analyse manuelle.

conclusion

Dans ce blog, nous avons partagé un nouvel outil et de nouvelles techniques qui sont utilisés pour détecter et classer automatiquement les risques des contrats intelligents. Solidify est un outil puissant et hautement configurable qui peut être utilisé par les auditeurs de contrats intelligents, les émetteurs d'actifs et d'autres échanges pour aider à sécuriser les écosystèmes d'actifs numériques. À mesure que l'économie de la crypto se développe, des outils comme Solidify deviendront de plus en plus vitaux.

Si vous souhaitez sécuriser l'avenir de la finance, Coinbase recrute.


Présentation de Solidify – Un outil pour détecter et classer automatiquement les risques de sécurité des contrats intelligents a été initialement publié sur le blog Coinbase sur Medium, où les gens poursuivent la conversation en mettant en évidence et en répondant à cette histoire.

Cours Crypto
Logo
Enable registration in settings - general