Juan Fuente

jfuentet@gmail.com

Overflow y Underflow

Overflow y underflow

Vulnerabilidades_Smart_Contracts_overflow_underflow_JuanFuente

La importancia de la seguridad en los smart contracts. Qué son las vulnerabilidades Overflow y Underflow y como solucionarlas.

Los contratos inteligentes, o smart contracts, son programas, no son más que una serie de instrucciones codificadas. Y son, además, lo que está destrás de todo el sistema financiero de las criptomonedas. Por ello, atraen todas las miradas de aquellas personas que utilizan su talento con el software no para construir, sino para aprovecharse de los demás, con el obtetivo de encontrar un hueco en esos contratos y obtener ganancias fáciles y rápidas.

Dos tipos de vulnerabilidades que pueden utilizar para atacar a los smart contracts son el overflow (desbordamiento ) y el underflow (subdesbordamiento). El desbordamiento ocurre cuando un cálculo produce un resultado que excede el valor máximo que puede ser almacenado en una variable, lo que puede llevar a resultados inesperados y potencialmente peligrosos. El subdesbordamiento ocurre cuando un cálculo produce un resultado que es menor que el valor mínimo que esa variable puede guardar, también llevando a resultados inesperados.

Este es un ejemplo de cómo podría ocurrir en un smart contract escrito en Solidity:

Vulnerabilidades_de smart_contratc_Overflow_JuanFuente

En este contrato, la variable balance se utiliza para mantener un registro del total de ether almacenado en el contrato. La función deposit permite a los usuarios depositar ether en el contrato, y la función withdraw permite a los usuarios retirar ether del contrato. 

Sin embargo, si un usuario depositara más ether en el contrato que el valor máximo que puede ser almacenado en una variable uint256, se produciría un desbordamiento. Esto podría resultar en que el valor de balance se volvería muy grande y superaría el límite máximo permitido para esa variable, el valor de balance volvería a cero y comenzaría a contar desde allí. 

Por ejemplo, si el limite es 100, e ingreso 110, tendría 10 en el balance, en vez de 110. Este es un ejemplo claro pero bastante improbable, ya que nadie difícilmente dispondrá de la enorme cantidad de dinero que se necesita para desbordar un uint256.

Vulnerabilidades_de smart_contratc_Underflow_JuanFuente

En este contrato, la variable totalSupply se utiliza para mantener un registro del total de tokens almacenados en el contrato. La función transfer permite a los usuarios transferir tokens del contrato a otra dirección. Sin embargo, si un usuario transfiriera más tokens del contrato de los que actualmente están disponibles, se produciría un underflow (subdesbordamiento). Y esto si que resulta mucho más sencillo de realizar. 

Podría pasar de tener, por ejemplo, 2 ether, a tener un numero verdaderamente grande. 

Vamos a ponerlo más claro. El underflow hace que se excedan los límites y, al no poder ser menor que cero, el valor de la variable se ubica en el otro extremo. Por ejemplo, si en la variable solo cupiesen los números del 0 al 100. Si en este caso el totalSupply es 2 y se intentan retirar 4, por ejemplo, al llegar al límite de cero se sigue descontando, es una especie de bucle, por lo el valor terminaría siendo 98. El extremo superior y el inferior de los posibles valores estarían conectados. El usuario pasaría de haber retirado 2 ether a tener 98 más en cuenta. 

En este caso concreto, solo con cambiar esa linea require(totalSupply > 0, «Amount can’t be 0»); por otra similar a esta require(totalSupply >= _amount, «Insufficient supply»); ya estamos dando un paso importante a la hora de evitar ese desbordamiento. 

Para prevenir estos tipos de ataques, los desarrolladores se aseguraran de utilizar bibliotecas de matemáticas seguras o tipos apropiados que proporcionen detección de desbordamiento. Estas bibliotecas proporcionan las operaciones aritméticas básicas pero también pueden verificar las precondiciones y postcondiciones para determinar si se ha producido un desbordamiento o no. En caso de error, la biblioteca falla la transacción y actualiza el estado de la transacción a ‘Reverted’.

Además, es importante mantener el código actualizado regularmente para evitar cualquier posible vulnerabilidad. También se pueden incorporar comprobaciones en el código para asegurar que los valores nunca excedan su rango esperado o utilizar modificadores como pudiese ser ‘onlyOwner’ para una seguridad extra.

En resumen, aunque los smart contracts son una herramienta poderosa para la blockchain, también son susceptibles a vulnerabilidades de seguridad como el overflow y el underflow. Al comprender cómo funcionan estas vulnerabilidades y tomar las medidas adecuadas para protegerse contra ellas, es posible minimizar los riesgos y garantizar la seguridad de los smart contracts.

También puedes ver este mismo artículo en Linkedin aqui