Prévenir le dépassement d'entier : la clé pour garantir la sécurité des smart contracts

Vulnérabilité de débordement d'entier et sa protection

Le débordement d'entier est une vulnérabilité de programmation courante qui peut survenir dans la plupart des langages de programmation. Un débordement se produit lorsque le résultat d'un calcul dépasse la plage de représentation d'un type entier. Par exemple, la plage d'un entier non signé de 32 bits (uint32) est de 0 à 4 294 967 295. Si l'on ajoute 1 à 4 294 967 295, le résultat "déborde" et devient 0.

Cette débordement peut entraîner des erreurs graves dans le programme, en particulier lors du traitement des données financières. Par exemple, si le prix des actions est représenté par un entier de 32 bits, lorsque le prix dépasse la valeur maximale, il peut être lu par erreur comme 0, ce qui entraînerait évidemment un énorme chaos.

Les débordements d'entiers se divisent en deux cas : débordement supérieur et débordement inférieur.

  • Débordement : le résultat dépasse la valeur maximale, par exemple uint32 de 0xFFFFFFFF + 1 = 0x00000000
  • Sous-flux: le résultat est inférieur à la valeur minimale, comme uint32 de 0x00000000 - 1 = 0xFFFFFFFF

Dans les contrats intelligents de la blockchain, la vulnérabilité de débordement d'entiers est particulièrement dangereuse. En 2018, le jeton BEC de BeautyChain a été exploité par des attaquants en raison d'une vulnérabilité de débordement d'entiers, entraînant le vol d'un grand nombre de jetons.

Pour éviter le débordement d'entiers, le langage Rust propose plusieurs méthodes efficaces :

  1. Activer les vérifications de débordement en mode release :

toml [profile.release] overflow-checks = true panic = 'abort'

  1. Utilisez le crate uint pour prendre en charge des types d'entiers plus grands, tels que U256, U512, etc.

  2. Utilisez des fonctions de conversion de type pour détecter les débordements, par exemple :

rouille let amount_u256 = U256::from(u128::MAX) + 1; let amount_u128 = amount_u256.as_u128(); // cela déclenchera une panique

  1. Utiliser des fonctions Safe Math telles que checked_add, checked_sub, etc:

rouille let result = x.checked_sub(y).expect("Un sous-dépassement s'est produit");

Grâce à ces méthodes, nous pouvons efficacement détecter et prévenir le dépassement d'entier, améliorant ainsi la sécurité des contrats intelligents. Lors de la rédaction de contrats impliquant des calculs de grandes valeurs, il est impératif de traiter avec prudence les situations de dépassement potentielles.

Voir l'original
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.
  • Récompense
  • 4
  • Partager
Commentaire
0/400
SellLowExpertvip
· 07-16 05:14
N'est-ce pas que quelqu'un a encore été victime d'une avalanche ?
Voir l'originalRépondre0
SigmaBrainvip
· 07-16 05:14
Écrire du code sans débordement, ceux qui comprennent savent.
Voir l'originalRépondre0
SchroedingersFrontrunvip
· 07-16 05:11
Vous parlez de cette chose, n'est-ce pas une chute à zéro des actifs dans le Portefeuille ?
Voir l'originalRépondre0
AirdropHunterWangvip
· 07-16 04:45
Encore une erreur, qui comprend ça ?
Voir l'originalRépondre0
Trader les cryptos partout et à tout moment
qrCode
Scan pour télécharger Gate app
Communauté
Français (Afrique)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)