Crypto Week

Référence d’audit : comment auditer votre Dapp | de Yehia Tarek | Coinmons | février 2022

J’ai dû travailler sur des fermes et des pools de jalonnement où de nombreux utilisateurs mettaient leurs jetons pendant longtemps. Dans les projets DeFi, vous êtes constamment menacé par des attaques de pirates car de nombreux jetons seront dans un contrat intelligent pendant longtemps. C’est pourquoi j’ai dû en apprendre davantage sur l’audit des contrats intelligents. J’ai rassemblé toutes les pratiques essentielles, exercices, tutoriels, documentation dans un article comme référence.

Référence d'audit : comment auditer votre Dapp | de Yehia Tarek | Coinmons | février 2022
Audit des contrats intelligents

Pour mettre en ligne votre Dapp, assurez-vous qu’elle est digne de confiance pour les utilisateurs et les investisseurs. Vous devez vous assurer que vous n’avez aucune vulnérabilité dans votre contrat intelligent. L’audit est un ensemble de techniques et de pratiques permettant de détecter et de décrire (dans un rapport) les problèmes de sécurité avec les expositions sous-jacentes, la gravité/difficulté, les scénarios d’exploitation potentiels et les correctifs recommandés. Je vais vous montrer comment auditer n’importe quel contrat intelligent. L’auditeur de contrats intelligents est un travail tout comme le développeur de contrats intelligents. Mais en tant que développeur de contrats intelligents, vous devez vous assurer que votre code ou le code que vous allez réutiliser est sécurisé. Avant de passer par les processus d’audit. Vous devez appliquer certaines mesures pour vous faciliter la vie et tirer profit de l’audit.

Avant d’auditer le contrat intelligent, vous devez vous assurer que le contrat intelligent est bien expliqué sur les parties commerciales et techniques. Ainsi, lorsque vous commencez à auditer, vous pouvez obtenir les résultats les plus efficaces. Trois choses que vous devez faire :

Documentez et décrivez en détail ce que fait votre projet et pourquoi. Incluez tous les actifs et tous les privilèges des acteurs. Décrire les composants qui sont censés fonctionner de manière fonctionnelle dans le cadre de leur conception et de leur architecture.

L’analyse des spécifications décrit quoi et pourquoi. Mais l’analyse de la documentation explique comment. Documentez tout le code source au format NatSpec et vous pouvez générer automatiquement la documentation. Je ne recommande pas de dépendre uniquement des documents générés automatiquement, car les développeurs oublient de nombreux détails. Je préfère dessiner des diagrammes et écrire des descriptions en points (c’est ma préférence. Vous pouvez choisir autre chose).

Tout d’abord, vous devez commencer par des cas de test unitaire pour tester chaque transaction séparément. Ensuite, créez des scénarios utilisateur dans lesquels le code doit déclencher ou interroger n’importe quel résultat et d’autres procédures dans lesquelles les transactions doivent être annulées. Deuxièmement, refaites les mêmes cas de test avec le test de couverture et le rapport de gaz. Maintenant, vous êtes prêt à commencer les étapes d’audit.

La première étape peut sembler la plus facile, mais ce n’est pas le cas? Vous devez lire attentivement les résultats et ne jamais ignorer les messages d’avertissement. Certains messages sont compliqués, alors n’hésitez pas à demander sur une issue Github ou sur le channel officiel de l’outil.

Il existe de nombreux outils pour vous aider lors de l’audit, tels que :

  1. mythril pour vérifier votre contrat intelligent au niveau EVM
  2. slither est l’un des outils les plus populaires utilisés pour prévenir les problèmes sur le code de solidité (niveau du contrat intelligent)
  3. échidné pour les tests de fuzzing (technique de test de logiciel qui consiste à fournir des données invalides, inattendues ou aléatoires en tant qu’entrées à un programme informatique.)
  4. Manticore pour vérifier les bugs et vulnérabilités potentiels dans la logique de votre code.

Compilateur Chèques

  1. Utilisez uniquement la version connue de Solidity. Pour l’instant, vous pouvez utiliser 0.7.5, 0.7.6 ou 0.8.4 vous pouvez vérifier les différentes versions ici.
  2. Verrouillez le pragma pour vous assurer que vous utilisez la bonne version, pas une ancienne
  3. Utilisez une seule version du compilateur pour tous les contrats intelligents

Fonctions de bas niveau

  1. Assurer destination de confiance address pour delegatecall() et callcode().
  2. Pour envoyer de l’éther, utilisez call() et assurer une attaque de non-réentrance via un modèle de vérifications-effets-interactions ou des gardes de réentrance.
  3. Valeurs de retour des fonctions de bas niveau (call/callcode/delegatecall/send/etc.). voir exemple ici.

Bibliothèques à utiliser

  1. Pour les signatures numériques, utilisez OpenZeppelin’s ECDSA bibliothèque.
  2. Utilisez safeMath ou solidity version 0.8 pour éviter les problèmes de débordement et de sous-dépassement et divisez après la multiplication.

Pour la syntaxe

  1. Ne pas utiliser tx.origin pour autorisation. Utiliser msg.sender au lieu. (tx.origin pour la permission peut être abusé par un Man In The Middle (MITM))
  2. Évitez les mots clés obsolètes.
  3. Suppression d’un struct qui contient un mapping ne supprimera pas le contenu du mappage, ce qui peut entraîner des conséquences imprévues. Utilisez le verrouillage de la structure des données pour empêcher une utilisation incorrecte.
  4. Assert et require ne doivent pas modifier l’état. Nous utilisons assert pour les vérifications invariantes, et les utilisateurs doivent vérifier l’entrée de l’utilisateur et les valeurs renvoyées.

Lorsque vous lisez votre code

  1. Assurez-vous que vous n’avez pas de dépendance à l’ordre des transactions. (Les transactions ne doivent pas dépendre d’une commande spécifique)
  2. Mettre une variable comme privée signifie que les autres contrats intelligents ne peuvent pas la lire. Cela ne signifie pas que les variables ne peuvent pas lire les données en chaîne. Pour masquer des données, chiffrez-les ou enregistrez-les hors chaîne.
  3. Les tautologies ou tautologies contradictoires sont toujours truecontradictoires false ou utilisez des valeurs constantes booléennes dans une condition.
  4. Vérifiez que toutes les entrées d’adresse ne sont pas des adresses nulles et pour les adresses Crucial, modifiez-les en deux étapes. La première transaction (à partir de l’ancienne/actuelle adresse) enregistre la nouvelle adresse (c’est-à-dire accorde la propriété). La deuxième transaction (à partir de la nouvelle adresse) remplace l’ancienne adresse par la nouvelle (c’est-à-dire, revendique la propriété).
  5. Évitez les appels à l’intérieur d’une boucle et assurez-vous que les utilisateurs ne peuvent contrôler aucune taille de tableau pour éviter les attaques DOS.
  6. N’oubliez pas de protéger les transactions init().
  7. Ordre d’héritage incorrect et héritage manquant.
  8. Assurez-vous de l’utilisation correcte de la mémoire et du stockage dans les paramètres de fonction et précisez tous les emplacements de données.

Pour les jetons

  1. Approuver la condition de concurrence : Utiliser safeIncreaseAllowance() et safeDecreaseAllowance() d’OpenZeppelin SafeERC20 mise en œuvre à prévenir les conditions de course de manipuler les montants des allocations.
  2. ERC20 les fonctions transfer() et transferFrom() devrait revenir boolOu utiliser SafeERC20
  3. transfer() et transferFrom() ne devrait pas prendre de frais. Cela peut provoquer des comportements inattendus.
  4. ownerOf La fonction dans ERC721 peut renvoyer une adresse incorrecte, utilisez le contrat OpenZepplin ERC721.

Les notes ci-dessus sont les notes les plus importantes que j’ai trouvées. Bien sûr, il existe de nombreux autres points et vous devez vous exercer à les détecter. Dans la section suivante, j’ajouterai toutes les ressources d’apprentissage et de pratique

Secureum est une excellente organisation financée par Ethereum pour vous aider à devenir un auditeur de contrat intelligent. Ils proposent des bootcamps. Je recommande à tous d’y participer. Ils ont beaucoup de quiz sur leur chaîne discorde pour les questions d’entrevue.

Le contenu de Secureum est un peu difficile. Ce mec génial a simplifié et repris pas mal de points essentiels dans les cours Secureum

Ensuite, vous avez ces deux listes de contrôle de toutes les vulnérabilités courantes. Vous pouvez vous y référer avec chaque partie que vous devez modifier dans votre contrat (par exemple, vous utilisez delegateCall allez vérifier tous les problèmes de sécurité possibles pour obtenir un appel)

Pour mettre en pratique ce que vous apprenez, vous pouvez résoudre des défis sur ces trois sites Web.

Enfin, j’ai trouvé des blogs qui couvrent beaucoup de pratiques essentielles

Enfin, ceci est un exemple du rapport d’audit et à quoi il devrait ressembler

Rejoignez Coinmonks Telegram Channel et Youtube Channel pour en savoir plus sur le trading et l’investissement cryptographiques

Source medium.com

Quitter la version mobile