Reentrancy

Sécurité

Définition

Vulnérabilité où un contrat externe rappelle une fonction du contrat victime avant que la première exécution ne soit terminée. Célèbre dans le hack de The DAO (2016, 60M$ volés). Prévention : suivre le pattern Checks-Effects-Interactions, ou utiliser ReentrancyGuard d'OpenZeppelin. Toujours mettre à jour l'état avant les appels externes.

Version anglaise

Vulnerability where external contract recalls victim contract function before first execution finishes. Famous in The DAO hack (2016, $60M stolen). Prevention: follow Checks-Effects-Interactions pattern, or use OpenZeppelin's ReentrancyGuard. Always update state before external calls.

Exemple de Code

// ❌ VULNÉRABLE (mauvais ordre)
function withdraw(uint256 amount) public {
  require(balances[msg.sender] >= amount);
  (bool success, ) = msg.sender.call{value: amount}("");
  require(success);
  balances[msg.sender] -= amount; // Trop tard ! L'attaquant peut rappeler withdraw()
}

// ✅ SÉCURISÉ (Checks-Effects-Interactions)
function withdraw(uint256 amount) public {
  require(balances[msg.sender] >= amount); // Checks
  balances[msg.sender] -= amount;          // Effects
  (bool success, ) = msg.sender.call{value: amount}(""); // Interactions
  require(success);
}

// ✅ Avec ReentrancyGuard
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
function withdraw(uint256 amount) public nonReentrant { ... }

Termes Liés

Pratique ce concept sur Solingo

Maîtrise Reentrancy avec des exercices interactifs et un IDE intégré.

Commencer gratuitement