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 :
Activer les vérifications de débordement en mode release :
Utilisez le crate uint pour prendre en charge des types d'entiers plus grands, tels que U256, U512, etc.
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
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.
9 J'aime
Récompense
9
4
Partager
Commentaire
0/400
SellLowExpert
· 07-16 05:14
N'est-ce pas que quelqu'un a encore été victime d'une avalanche ?
Voir l'originalRépondre0
SigmaBrain
· 07-16 05:14
Écrire du code sans débordement, ceux qui comprennent savent.
Voir l'originalRépondre0
SchroedingersFrontrun
· 07-16 05:11
Vous parlez de cette chose, n'est-ce pas une chute à zéro des actifs dans le Portefeuille ?
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.
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 :
toml [profile.release] overflow-checks = true panic = 'abort'
Utilisez le crate uint pour prendre en charge des types d'entiers plus grands, tels que U256, U512, etc.
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
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.