Définition
Overflow : définition
Un overflow ou un underflow se produit lorsqu'un calcul dépasse la valeur maximale ou minimale qu'une variable peut contenir. Dans un smart contract, cette erreur peut fausser des soldes, d'où les vérifications ajoutées par défaut depuis Solidity 0.8.
Thème : Sécurité et arnaques
Les nombres d'un programme sont stockés sur un nombre fixe de bits. Un entier non signé de 8 bits, par exemple, va de 0 à 255. Si l'on ajoute 1 à 255, le résultat repart à 0 : c'est un overflow. Si l'on retire 1 à 0, on obtient 255 : c'est un underflow. Dans un smart contract qui gère des soldes, un tel bouclage peut permettre à un attaquant de se créer un solde gigantesque ou de contourner une vérification.
Avant la version 0.8 de Solidity, ces dépassements se produisaient silencieusement. Les développeurs utilisaient des bibliothèques comme SafeMath pour vérifier chaque opération. Depuis la version 0.8, le compilateur ajoute ces vérifications automatiquement : un dépassement provoque l'annulation de la transaction. Il reste possible de désactiver ces contrôles dans un bloc unchecked pour économiser du gas, ce qui réintroduit le risque si le développeur se trompe.
Un exemple concret
Un vieux contrat de token fictif, compilé avant Solidity 0.8 et sans SafeMath, permet de transférer des tokens en retirant le montant du solde de l'expéditeur. Un attaquant possédant 0 token demande à en envoyer 1. Le solde passe à la valeur maximale possible par underflow, et l'attaquant se retrouve avec une quantité astronomique de tokens.
Les risques à connaître
Les contrats anciens restent vulnérables s'ils n'utilisent pas de vérifications. Dans les contrats récents, le danger vient des blocs unchecked, du code en assembleur, ou des conversions entre types de tailles différentes, qui ne sont pas toujours contrôlées. D'autres langages et blockchains appliquent des règles différentes.
Questions fréquentes sur Overflow
Les overflows sont-ils encore un risque avec Solidity récent ?
Beaucoup moins, car le compilateur annule les transactions en cas de dépassement depuis la version 0.8. Le risque subsiste dans les blocs unchecked, le code assembleur et certaines conversions de types.
Qu'est-ce que SafeMath ?
C'est une bibliothèque Solidity qui vérifiait chaque opération arithmétique pour empêcher les dépassements. Elle est devenue largement inutile depuis que Solidity intègre ces vérifications par défaut.