Applez Nous: +41 22 518 70 00
En 2016, le piratage tragique de The DAO (ayant entraîné le vol de plus de 60 millions de dollars en ETH et la scission entre Ethereum et Ethereum Classic) a été causé par une faille de réentrance. Cette vulnérabilité survient lorsqu’un contrat effectue un appel externe vers une adresse non sécurisée avant d’avoir mis à jour son propre état interne.
// SCÉNARIO VULNÉRABLE (NE PAS REPRODUIRE)
function retirerSolde() external {
uint256 montant = soldes[msg.sender];
require(montant > 0, "Solde nul");
// FAILLE MAJEURE : Envoi d'ETH externe AVANT la mise à jour du solde !
(bool succes, ) = msg.sender.call{value: montant}("");
require(succes, "Echec transfert");
// Trop tard : Le contrat pirate a réexécuté retirerSolde() en boucle via sa fonction receive()
soldes[msg.sender] = 0;
}
Pour éliminer définitivement ce risque, appliquez systématiquement le pattern Checks-Effects-Interactions :
// CODE SÉCURISÉ SELON LE PATTERN CHECKS-EFFECTS-INTERACTIONS
function retirerSoldeSecurise() external {
// 1. CHECKS (Vérifications)
uint256 montant = soldes[msg.sender];
require(montant > 0, "Solde nul");
// 2. EFFECTS (Mise à jour de l'état interne EN PREMIER)
soldes[msg.sender] = 0;
// 3. INTERACTIONS (Appels externes en dernier)
(bool succes, ) = msg.sender.call{value: montant}("");
require(succes, "Echec transfert");
}
L’équipe d’ecole-informatique.ch enseigne une règle d’or industrielle : « Ne réinventez jamais la cryptographie ni les composants critiques de sécurité ». Utilisez les modules standardisés de la bibliothèque OpenZeppelin Contracts :
Ownable et AccessControl : Gestion sécurisée des rôles administratifs avec contrôle granulaire.ReentrancyGuard : Verrou mutex (modificateur nonReentrant) interdisant physiquement toute rentrée imbriquée.Pausable : Mécanisme d’arrêt d’urgence permettant de suspendre les opérations sensibles en cas d’anomalie détectée.Principe fondamental Éducasuisse : Tout smart contract destiné à manipuler de la valeur réelle en production doit faire l’objet d’une suite de tests unitaires couvrant 100% du code et d’un audit de sécurité statique (Slither, Mythril).