Vulnerabilidad de desbordamiento de enteros y su protección
El desbordamiento de enteros es una vulnerabilidad común en la programación que puede ocurrir en la mayoría de los lenguajes de programación. Ocurre cuando el resultado de un cálculo excede el rango de representación del tipo de entero. Por ejemplo, el rango de un entero sin signo de 32 bits (uint32) es de 0 a 4,294,967,295. Si se suma 1 a 4,294,967,295, el resultado "desbordará" y se convertirá en 0.
Este desbordamiento puede provocar errores graves en el programa, especialmente al manejar datos financieros. Por ejemplo, si se representan los precios de las acciones con un entero de 32 bits, cuando el precio supera el valor máximo, puede leerse erróneamente como 0, lo que evidentemente causaría un gran caos.
Las sobrecargas de enteros se dividen en dos casos: desbordamiento superior y desbordamiento inferior:
Desbordamiento: el resultado supera el valor máximo, como uint32 de 0xFFFFFFFF + 1 = 0x00000000
Subdesbordamiento: el resultado es menor que el valor mínimo, como uint32 de 0x00000000 - 1 = 0xFFFFFFFF
En los contratos inteligentes de blockchain, las vulnerabilidades de desbordamiento de enteros son especialmente peligrosas. En 2018, el token BEC de BeautyChain fue aprovechado por atacantes debido a una vulnerabilidad de desbordamiento de enteros, lo que resultó en el robo de una gran cantidad de tokens.
Para evitar el desbordamiento de enteros, el lenguaje Rust ofrece algunos métodos efectivos:
Habilitar la verificación de desbordamiento en modo de liberación:
Utiliza la biblioteca uint para soportar tipos de enteros más grandes, como U256, U512, etc.
Utilizar funciones de conversión de tipo para detectar desbordamientos, como:
óxido
let amount_u256 = U256::from(u128::MAX) + 1;
let amount_u128 = amount_u256.as_u128(); // desencadenará un pánico
Utilizar funciones Safe Math como checked_add, checked_sub, etc:
óxido
let result = x.checked_sub(y).expect("Ocurrió un subdesbordamiento");
A través de estos métodos, podemos detectar y prevenir eficazmente el desbordamiento de enteros, mejorando la seguridad de los contratos inteligentes. Al redactar contratos que impliquen cálculos de grandes valores, es imprescindible manejar con cuidado las posibles situaciones de desbordamiento.
Ver originales
Esta página puede contener contenido de terceros, que se proporciona únicamente con fines informativos (sin garantías ni declaraciones) y no debe considerarse como un respaldo por parte de Gate a las opiniones expresadas ni como asesoramiento financiero o profesional. Consulte el Descargo de responsabilidad para obtener más detalles.
9 me gusta
Recompensa
9
4
Compartir
Comentar
0/400
SellLowExpert
· 07-16 05:14
¿No será que alguien más ha sido afectado por una avalancha?
Ver originalesResponder0
SigmaBrain
· 07-16 05:14
Es imposible escribir código sin desbordamientos. Los que entienden, entienden.
Ver originalesResponder0
SchroedingersFrontrun
· 07-16 05:11
Lo que ustedes dicen, ¿no es que la Billetera se queda con los activos caídos a cero?
Ver originalesResponder0
AirdropHunterWang
· 07-16 04:45
Otra vez me he llevado un chasco, ¿quién lo entiende?
Prevención de desbordamientos de enteros: clave para garantizar la seguridad de los contratos inteligentes
Vulnerabilidad de desbordamiento de enteros y su protección
El desbordamiento de enteros es una vulnerabilidad común en la programación que puede ocurrir en la mayoría de los lenguajes de programación. Ocurre cuando el resultado de un cálculo excede el rango de representación del tipo de entero. Por ejemplo, el rango de un entero sin signo de 32 bits (uint32) es de 0 a 4,294,967,295. Si se suma 1 a 4,294,967,295, el resultado "desbordará" y se convertirá en 0.
Este desbordamiento puede provocar errores graves en el programa, especialmente al manejar datos financieros. Por ejemplo, si se representan los precios de las acciones con un entero de 32 bits, cuando el precio supera el valor máximo, puede leerse erróneamente como 0, lo que evidentemente causaría un gran caos.
Las sobrecargas de enteros se dividen en dos casos: desbordamiento superior y desbordamiento inferior:
En los contratos inteligentes de blockchain, las vulnerabilidades de desbordamiento de enteros son especialmente peligrosas. En 2018, el token BEC de BeautyChain fue aprovechado por atacantes debido a una vulnerabilidad de desbordamiento de enteros, lo que resultó en el robo de una gran cantidad de tokens.
Para evitar el desbordamiento de enteros, el lenguaje Rust ofrece algunos métodos efectivos:
toml [profile.release] overflow-checks = true panic = 'abort'
Utiliza la biblioteca uint para soportar tipos de enteros más grandes, como U256, U512, etc.
Utilizar funciones de conversión de tipo para detectar desbordamientos, como:
óxido let amount_u256 = U256::from(u128::MAX) + 1; let amount_u128 = amount_u256.as_u128(); // desencadenará un pánico
óxido let result = x.checked_sub(y).expect("Ocurrió un subdesbordamiento");
A través de estos métodos, podemos detectar y prevenir eficazmente el desbordamiento de enteros, mejorando la seguridad de los contratos inteligentes. Al redactar contratos que impliquen cálculos de grandes valores, es imprescindible manejar con cuidado las posibles situaciones de desbordamiento.