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 :
attack() fonction pour tout commencer
fallback() fonction pour la partie sournoise
Le flux se déroule comme suit :
ContractB lance l'attaque () qui appelle le retrait de ContractA ()
ContractA vérifie le solde de ContractB
ContractA envoie ETH à ContractB
Cela déclenche le fallback de ContractB()
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();
}
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.
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.
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.
Comprendre les attaques par réentrance & comment les prévenir 🔐
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 :
Le Mécanisme d'Attaque 🕵️♂️
Vous avez besoin de deux choses clés :
Le flux se déroule comme suit :
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);
}
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);
}
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;
}
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 ! 🛡️