Tendencias del momento
#
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.
Como desarrollador de Solidity con mentalidad de seguridad, esta es tu señal para tener mucho cuidado al usar bloques no verificados y ensamblaje en línea.
A partir de la versión 0.8.0 y posteriores, el compilador manejará automáticamente los desbordamientos/subdesbordamientos. Pero, ¿qué sucede si una variable que permite el desbordamiento se utiliza luego en yul?
La EVM en realidad no tiene concepto de tipos estrechos, por lo que el código de bajo nivel en yul opera en el tamaño completo de palabra de 256 bits. ¿Puedes ver hacia dónde va esto?
En este escenario muy simplificado que encontré en mi actual compromiso con @CyfrinAudits, la variable de longitud se desborda silenciosamente a uint8 dentro del bloque no verificado y se envuelve a 254 como se esperaba.
Sin embargo, cuando se utiliza para redimensionar el arreglo dentro del bloque de ensamblaje en línea subsiguiente, los bits superiores sucios persisten como si el desbordamiento nunca hubiera ocurrido.
Esto resulta en que la longitud del arreglo sea considerablemente mayor de lo esperado, incluso aunque podríamos esperar que estuviera limitado módulo el valor máximo representable por la variable de longitud.
Usando el depurador de foundry y cast --to-base <0xfe|0x01fe> dec, podemos confirmar que nuestras suposiciones eran incorrectas y que los bits superiores efectivamente permanecen sucios al escribir la longitud en memoria.
Si bien este ejemplo puede simplificarse aún más, la clave es siempre ser muy sospechoso de los bloques no verificados/ensamblaje y considerar cómo los bits superiores de los tipos estrechos pueden volverse sucios, incluso para algo tan simple en yul como una asignación.
Esto a veces puede parecer un error esotérico que es imposible de detectar sin un profundo conocimiento de la EVM y los internos del compilador de Solidity, así que una vez que me di cuenta de lo que estaba sucediendo, encontré que este ejemplo concreto era bastante útil.
Déjame un comentario abajo si tienes alguna pregunta, pero espero que también te haya parecido útil!




7,75K
Parte superior
Clasificación
Favoritos