Définition
Réentrance : définition
Aussi appelé : Reentrancy
La réentrance (reentrancy) est une vulnérabilité de smart contract qui permet à un contrat malveillant de rappeler une fonction avant que la première exécution ne soit terminée, en profitant d'un état pas encore mis à jour pour retirer des fonds plusieurs fois.
Thème : Sécurité et arnaques
Lorsqu'un smart contract envoie des fonds à une autre adresse, il passe temporairement la main à celle-ci. Si le destinataire est un contrat, il peut exécuter son propre code à ce moment-là, et notamment rappeler le contrat d'origine. Si ce dernier n'a pas encore enregistré que le retrait a eu lieu, il voit toujours l'ancien solde et accepte de payer une nouvelle fois.
C'est la faille exploitée lors du piratage de The DAO en 2016, qui a conduit à un hard fork d'Ethereum. Elle existe sous plusieurs formes : réentrance dans une même fonction, entre plusieurs fonctions d'un même contrat, entre plusieurs contrats, ou en lecture seule, lorsqu'un protocole lit une valeur incohérente pendant l'exécution d'un autre. La parade de base suit le schéma dit checks-effects-interactions : vérifier les conditions, mettre à jour l'état interne, puis seulement ensuite interagir avec l'extérieur. On ajoute souvent un verrou (reentrancy guard) qui interdit d'entrer de nouveau dans une fonction tant qu'elle n'est pas terminée.
Un exemple concret
Imaginons un coffre qui permet de retirer son dépôt : il envoie les fonds, puis met le solde à zéro. Un attaquant dépose une petite somme depuis un contrat. Quand il demande le retrait, son contrat reçoit les fonds et, avant que le coffre n'ait remis son solde à zéro, redemande un retrait. Le coffre, qui voit encore l'ancien solde, paie à nouveau, et la boucle continue jusqu'à épuisement.
Les risques à connaître
Une réentrance peut vider un contrat en une seule transaction. Les variantes entre contrats ou en lecture seule sont plus difficiles à repérer et touchent aussi des protocoles audités. Les tests, audits, outils d'analyse et verrous de réentrance réduisent le risque sans l'éliminer totalement.
Questions fréquentes sur Réentrance
Qu'est-ce qui s'est passé lors du piratage de The DAO ?
Un attaquant a exploité une faille de réentrance pour retirer des fonds en boucle avant que les soldes ne soient mis à jour. La communauté Ethereum a ensuite décidé d'un hard fork pour restituer les fonds.
Comment les développeurs se protègent-ils de la réentrance ?
En mettant à jour l'état avant tout appel externe, en utilisant des verrous de réentrance et en faisant auditer leur code.