Rubriques tendance
#
Bonk Eco continues to show strength amid $USELESS rally
#
Pump.fun to raise $1B token sale, traders speculating on airdrop
#
Boop.Fun leading the way with a new launchpad on Solana.
En tant que développeur Solidity soucieux de la sécurité, c'est votre signe pour être très prudent lorsque vous utilisez des blocs non vérifiés et de l'assemblage en ligne.
À partir de la version 0.8.0 et ultérieure, le compilateur gérera automatiquement les débordements/underflows. Mais que se passe-t-il si une variable autorisée à déborder est ensuite utilisée en yul ?
L'EVM n'a en fait aucun concept de types étroits, donc le code yul de bas niveau fonctionne sur la taille de mot complète de 256 bits. Vous voyez où cela mène ?
Dans ce scénario fortement simplifié que j'ai rencontré lors de mon engagement actuel chez @CyfrinAudits, la variable de longueur déborde silencieusement uint8 dans le bloc non vérifié et revient à 254 comme prévu.
Cependant, lorsqu'elle est utilisée pour redimensionner le tableau dans le bloc d'assemblage en ligne suivant, les bits supérieurs sales persistent comme si le débordement ne s'était jamais produit !
Cela entraîne une longueur de tableau considérablement plus grande que prévu, même si nous pourrions nous attendre à ce qu'elle soit limitée modulo la valeur maximale représentable par la variable de longueur.
En utilisant le débogueur foundry et cast --to-base <0xfe|0x01fe> dec, nous pouvons confirmer que nos hypothèses étaient incorrectes et que les bits supérieurs restent effectivement sales lors de l'écriture de la longueur en mémoire.
Bien que cet exemple puisse être encore simplifié, la leçon clé est d'être toujours très méfiant à l'égard des blocs non vérifiés/assemblage et de considérer comment les bits supérieurs des types étroits peuvent devenir sales, même pour quelque chose d'aussi simple en yul qu'une affectation.
Cela peut parfois sembler être un bug ésotérique impossible à repérer sans une connaissance approfondie des internals de l'EVM et du compilateur Solidity, donc une fois que j'ai réalisé ce qui se passait, j'ai trouvé cet exemple concret assez utile.
Laissez-moi un commentaire ci-dessous si vous avez des questions, mais j'espère que vous l'avez trouvé utile aussi !




7,76K
Meilleurs
Classement
Favoris