Comprendre les attaques par réentrance & comment les prévenir 🔐

robot
Création du résumé en cours

Les attaques par réentrance semblent compliquées au début. Laissez-moi les expliquer en termes simples et vous montrer quelques façons de garder vos smart contracts en sécurité 🛡️

Qu'est-ce qu'une attaque de réentrance ? 🧐

C'est quand le ContractB appelle à nouveau le ContractA pendant que le ContractA est encore en cours d'exécution. Des choses désagréables. Les attaquants adorent cette vulnérabilité pour vider les fonds des contrats 💸

Imaginez ceci :

  • ContractA détient 10 ETH
  • ContractB a mis 1 ETH
  • ContractB vole alors tout

Le Mécanisme d'Attaque 🕵️‍♂️

Vous avez besoin de deux choses clés :

  1. attack() fonction pour tout commencer
  2. fallback() fonction pour la partie sournoise

Le flux se déroule comme suit :

  1. ContractB lance l'attaque () qui appelle le retrait de ContractA ()
  2. ContractA vérifie le solde de ContractB
  3. ContractA envoie ETH à ContractB
  4. Cela déclenche le fallback de ContractB()
  5. La boucle continue. Argent parti 🚨

C'est un peu surprenant à quel point cela peut être simple mais dévastateur.

Exemple de code vulnérable 📝

Voici à quoi ressemble un contrat vulnérable : solidity function withdrawAll() public { uint bal = balances[msg.sender]; require(bal > 0);

(bool sent, ) = msg.sender.call{value: bal}("");
require(sent, "Échec de l'envoi d'Ether");

balances[msg.sender] = 0; // Mise à jour APRÈS l'envoi ? Grosse erreur !

}

Le contrat d'attaque fait ceci : solidity fallback() externe payable { if(etherStore.balance >= 1 ether) etherStore.withdrawAll(); }

function attack() externe payable { require(msg.value >= 1 ether); etherStore.deposit{value: 1 ether}(); etherStore.withdrawAll(); }

Trois façons d'arrêter ces attaques 🛡️

1. nonReentrant Modifier 🔒

solidity bool privé verrouillé = faux;

modifier nonReentrant() { require(!locked, "Pas de réentrance"); verrouillé = vrai; _; verrouillé = faux; }

Ajoutez-le aux fonctions vulnérables. Simple mais efficace.

2. Checks-Effects-Interactions Pattern 📊

C'est crucial :

solidity function withdrawAll() public { uint bal = balances[msg.sender]; require(bal > 0);

balances[msg.sender] = 0; // Mettre à jour FIRST

(bool sent, ) = msg.sender.call{value: bal}(""); // ENSUITE interagir
require(envoyé, "Échec de l'envoi d'Ether");

}

Mettez d'abord à jour votre état. Interagissez plus tard. Toujours.

3. Protection Globale 🌐

Pour des projets plus importants :

solidity contrat GlobalReentrancyGuard { bool privé verrouillé = faux;

modificateur globalNonReentrant() {
    require(!locked, "No reentrancy");
    verrouillé = vrai;
    _;
    locked = false ;
}

}

Faites en sorte que tous vos contrats héritent de cela. Écosystème plus sûr.

Dernières tendances 🔥

À partir de septembre 2025, ces attaques continuent de toucher DeFi. Il n'est pas tout à fait clair pourquoi les développeurs continuent de faire les mêmes erreurs. Des outils comme Slither peuvent repérer ces problèmes. Echidna et Foundry aident à les tester 🚀

La sécurité ne consiste pas seulement à ajouter un modificateur. C'est un état d'esprit.

Restez vigilant là-bas ! 🛡️

ETH3.74%
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)