L'attaque par réentrance : comprendre et prévenir cette vulnérabilité des Smart Contracts

J'ai passé d'innombrables heures à déboguer des exploits de contrats, et laissez-moi vous dire - les attaques par réentrance sont les tueurs silencieux des smart contracts. Elles sont trompeusement simples mais dévastatrices. Plongeons dans ce que c'est et comment les arrêter avant qu'elles ne vident vos fonds.

Lorsque j'ai rencontré pour la première fois une vulnérabilité de réentrance, j'ai perdu des heures de sommeil à essayer de comprendre comment quelqu'un pouvait exploiter un morceau de code apparemment innocent. Le concept est frustrant de simplicité : un smart contract peut rappeler un autre avant que la première exécution ne soit terminée.

Imagine ceci : le ContratA a 10 ETH et le ContratB a déposé 1 ETH dedans. Lorsque le ContratB retire ses fonds, le ContratA envoie l'ETH avant de mettre à jour le solde de B à zéro. Cette petite erreur de séquençage crée une énorme faille de sécurité.

Que se passe-t-il ? La fonction de fallback du contrat malveillant appelle immédiatement withdraw() à nouveau, et comme le solde n'a pas encore été mis à jour, il réussit à nouveau la vérification du solde ! Ce cycle se répète jusqu'à ce que ContractA soit complètement vidé. Sacré intelligent, n'est-ce pas ?

Voici comment un attaquant exploite cela dans le code :

// Appel de contrat d'attaque retire() // ContractA envoie ETH ce qui déclenche fallback() // fallback() appelle withdraw() à nouveau avant que le solde ne soit mis à jour // Rincer et répéter jusqu'à ce que tous les fonds soient volés

J'ai vu des projets perdre des millions parce qu'ils ne comprenaient pas ce vecteur d'attaque simple. Cela me rend furieux de voir combien de développeurs commettent encore cette erreur de débutant.

Trois techniques pour protéger vos smart contracts

  1. Le modificateur nonReentrant

    Cela verrouille le contrat pendant l'exécution, empêchant toute fonction marquée avec ce modificateur d'être réentrant. Simple mais efficace.

  2. Le modèle Checks-Effects-Interactions

    C'est mon préféré personnel. Au lieu de:

    // VULNÉRABLE require(balance > 0); envoyer(ether); solde = 0;

    Faites ceci :

    // SAFE require(balance > 0); balance = 0; // Mettre à jour l'état AVANT les interactions externes envoyer(ether);

    Toujours mettez à jour votre état avant d'envoyer des ETH ou des tokens !

  3. GlobalReentrancyGuard

    Pour les projets avec plusieurs contrats interagissant, cela offre une protection à travers tout votre écosystème de contrats en utilisant un mécanisme de verrouillage partagé.

Ces techniques ne sont pas seulement académiques - elles ont sauvé d'innombrables projets d'une ruine financière complète.

Trop de développeurs pensent encore "cela ne m'arrivera pas" et ignorent ces protections. Ne soyez pas cette personne. Chaque fonction qui envoie de l'ETH ou des tokens devrait mettre en œuvre au moins un de ces mécanismes de protection.

N'oubliez pas que, dans le développement de smart contracts, la paranoïa est une fonctionnalité, pas un défaut. Une protection manquée pourrait coûter cher.

ETH1.94%
Voir l'original
Cette page peut inclure du contenu de tiers fourni à des fins d'information uniquement. Gate ne garantit ni l'exactitude ni la validité de ces contenus, n’endosse pas les opinions exprimées, et ne fournit aucun conseil financier ou professionnel à travers ces informations. Voir la section Avertissement pour plus de détails.
  • Récompense
  • Commentaire
  • Reposter
  • Partager
Commentaire
0/400
Aucun commentaire
  • Épingler
Trader les cryptos partout et à tout moment
qrCode
Scan pour télécharger Gate app
Communauté
Français (Afrique)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)