Los contratos inteligentes vulnerables tienen debilidades técnicas de varios tipos que pueden ser explotadas por atacantes para robar fondos o datos.
Los contratos inteligentes vulnerables tienen debilidades técnicas de varios tipos que pueden ser explotadas por atacantes para robar fondos o datos.
Las cadenas de bloques como Ethereum se basan en lenguajes Turing-completos, como Solidity, que pueden usarse para programar prácticamente cualquier aplicación concebible. Sin embargo, cuando se puede programar cualquier resultado, puede ser imposible predecir todas las posibles consecuencias no intencionadas que puedan ocurrir. Por ejemplo, un contrato inteligente puede estar programado para dispensar tokens bajo ciertas condiciones. Si un usuario malintencionado logra encontrar una forma de hacer que el contrato dispense tokens bajo condiciones no previstas por los desarrolladores, esto se clasifica como una vulnerabilidad.
Además, la naturaleza pública de las cadenas de bloques introduce ciertos factores que los atacantes pueden explotar. Por ejemplo, antes de que una transacción se confirme y se ingrese en el libro mayor de la cadena de bloques, se transmite a la red como parte de un grupo más grande de transacciones no procesadas conocido como mempool. La forma en que se seleccionan las transacciones del mempool para su inclusión en el siguiente bloque también puede estar sujeta a manipulación y gamificación, ya que a menudo no hay ningún requisito para que un minero o validador elija las transacciones en orden cronológico.
Por lo tanto, si bien el código vulnerable suele ser la causa fundamental de un ataque, los atacantes pueden utilizar varios factores para lanzar un ataque exitoso. El objetivo de tal ataque suele ser robar fondos o datos, aunque ocasionalmente, el atacante puede ser un hacker de sombrero blanco que demuestre la vulnerabilidad y devuelva los fondos a cambio de una recompensa por errores. Sin embargo, tales ataques aún pueden erosionar la confianza entre los usuarios.
Como mejor práctica, los desarrolladores a menudo realizan auditorías de código para identificar vulnerabilidades y errores. A menudo, un programa aún puede ejecutarse de manera efectiva incluso con algunos errores; por lo tanto, las auditorías de código clasificarán los errores y las vulnerabilidades según su gravedad y riesgo.
Tipos de vulnerabilidades de contratos inteligentes
Si bien existen potencialmente muchas formas en que los atacantes pueden explotar los contratos inteligentes, hay varias vulnerabilidades y métodos de ataque conocidos. Estos son algunos de los más comunes.
Ataques de reentrada
Los contratos inteligentes pueden comunicarse con otros contratos inteligentes como parte de su operación normal. Esta capacidad subyace a la composabilidad de las aplicaciones blockchain, permitiendo que dos o más dApps de Ethereum interactúen entre sí incluso dentro de la misma transacción de Ethereum.
Los ataques de reentrada explotan vulnerabilidades en contratos inteligentes al requerir que el código haga una llamada externa a un segundo contrato inteligente no confiable, generalmente para transferir fondos. Antes de que la transacción se haya completado e ingresado en el libro mayor, el ataque de reentrada realizará la misma llamada. Dado que la actualización de fondos aún no ha ocurrido, el ataque de reentrada puede seguir haciendo retiros hasta el punto de drenar el contrato de todos sus fondos.
Uno de los ataques de reentrada más famosos es el incidente de The DAO, que fue un contrato inteligente de inversión al que se le drenaron $60 millones en ETH en 2016.
Desbordamiento/subdesbordamiento de enteros
Los lenguajes de programación generalmente no admiten aritmética de punto flotante, lo que significa que no es posible representar fracciones de números utilizando un punto decimal. Por lo tanto, los desarrolladores deben usar enteros (números enteros) al codificar aplicaciones. La mayoría de las criptomonedas operan con denominaciones fraccionarias de una criptomoneda, como gwei, en lugar de ether, lo que facilita la codificación de los valores de tokens como enteros.
El valor de un entero no puede ir al infinito; está restringido por el máximo permitido por el tamaño de palabra de Solidity, que es de 256 bits. En Ethereum, esto se traduce en 4.3 mil millones de ETH.
Cuando un contrato inteligente está calculando un valor, si el valor del entero sin signo termina siendo cero, devolverá el valor máximo posible de 4.3 mil millones de ETH.
Los atacantes intentan explotar esta limitación utilizando una dirección maliciosa que puede ser leída por el contrato inteligente como si tuviera un saldo de cero y enviando una unidad (cualquier denominación) de ETH. Esto obliga al contrato inteligente a actualizarse al valor máximo permitido, 4.3 mil millones de ETH.
Además, la lógica aritmética estricta involucrada en generar cálculos enteramente en enteros puede atrapar a los desarrolladores. Por ejemplo, los cálculos de porcentajes se pueden hacer de dos maneras. Si se pide calcular el 50% de 90, se podría calcular como:
90*50 = 450
450/100 = 4
Este método solo utiliza enteros. Sin embargo, una forma alternativa de llegar al mismo resultado podría ser:
90/100 = 0.9
0.9 x 50 = 45
Este método genera una entrada inválida (0.9) que creará un error de entero que puede ser explotado.
El último problema generalmente ha sido resuelto por los compiladores de Solidity que escanean en busca de tales errores para que puedan corregirse. Sin embargo, BeautyChain, un proyecto de Ethereum que fue sometido a un ataque de desbordamiento de enteros en 2018, fue demasiado temprano para una solución tan fácil.
Vulnerabilidades de las tarifas de gas
En Ethereum, se aplica un límite de gas a cada bloque, lo que sirve para gestionar la tasa a la que se agregan nuevos datos a la blockchain. Sin embargo, esto introduce un desafío para las aplicaciones con gran cantidad de datos. Las aplicaciones pueden almacenar datos en matrices, de modo que se acceda a ellos recorriendo estas matrices. Tal actividad puede significar en última instancia que la transacción supere el límite de gas del bloque y no se complete. Esto también puede resultar en que todo el contrato quede nulo, ya que ninguna transacción adicional puede completar el bucle.
GovernMental fue un proyecto de cripto Ponzi que requería que los usuarios enviaran ETH a un contrato inteligente. La lista de participantes se hizo tan larga que el límite de tarifa de gas del bloque ahora impide que alguien pueda completar una transacción debido a la necesidad de escanear la lista.
Falta de parámetros o controles de precondición
Los contratos inteligentes a menudo tienen precondiciones básicas en su lugar, como que una dirección sea válida o tenga un saldo suficiente para completar una transacción, por ejemplo. Sin embargo, los desarrolladores a menudo pueden pasar por alto los detalles finos necesarios para codificar las precondiciones, particularmente si son complejas, lo que resulta en errores no intencionados.
Un ejemplo es Skyward Finance, una plataforma IDO desarrollada en NEAR, que fue atacada en 2022. El atacante explotó el hecho de que el contrato inteligente no verificaba que la misma dirección de billetera no debería usarse más de una vez, por lo que el atacante simplemente hizo retiros repetidos por un valor de $3.2 millones.
Adelantamiento (Frontrunning)
El adelantamiento es otro tipo de ataque que aprovecha el hecho de que las transacciones son visibles en el mempool. Los bots de adelantamiento monitorean el mempool en busca de transacciones rentables. Cuando encuentran una, simplemente copian la transacción y establecen una tarifa de gas más alta para ella. Un minero o validador estará incentivado a elegir la transacción con la tarifa de gas más alta para su inclusión en el bloque, y en última instancia, la transacción original se volverá redundante.
El adelantamiento no es necesariamente una vulnerabilidad de la codificación de contratos inteligentes tanto como una vulnerabilidad en el diseño general de la blockchain. Como tal, los bots y ataques de adelantamiento son relativamente comunes. Sin embargo, los programadores y desarrolladores de aplicaciones pueden implementar formas que ayuden a evitar los ataques de adelantamiento, como contadores de transacciones que pueden revelar si el estado del contrato inteligente ha sido modificado o sistemas de ordenamiento fuera de la cadena para garantizar transacciones secuenciales.
¿Cómo evitan los desarrolladores los contratos inteligentes vulnerables?
No existe una forma 100% infalible para que los desarrolladores eviten todas las vulnerabilidades. Sin embargo, existen algunas mejores prácticas, como escribir código utilizando la sintaxis más reciente, actualizar regularmente herramientas como compiladores y realizar pruebas de estrés extensas y robustas bajo diferentes escenarios.
Muchos proyectos ejecutarán fases de prueba incentivadas para este propósito, y los usuarios a menudo pueden ganar recompensas por participar en programas de prueba temprana, lo que ayuda a los desarrolladores a detectar errores y fallas.
Cómo detectar y evitar contratos inteligentes vulnerables
Cualquiera que pueda entender lenguajes de programación como Solidity puede ver el código del contrato inteligente utilizando un explorador de bloques como Etherscan. Incluso sin entender el código, examinar los datos del explorador de bloques, como el historial de transacciones, puede revelar anomalías que requieren una investigación adicional. Por ejemplo, una falta de transacciones de venta podría indicar que se impide a los compradores vender.
Otras formas de evitar contratos inteligentes vulnerables incluyen verificar que los proyectos tengan una auditoría de código independiente, usar siempre protocolos de confianza con gran número de usuarios y asegurarse de que las aplicaciones y billeteras estén utilizando la última versión del software disponible.
Aspectos esenciales de los contratos inteligentes vulnerables
- Las vulnerabilidades en los contratos inteligentes se refieren a la oportunidad de que los atacantes creen resultados no intencionados, como desviar fondos a la billetera del atacante.
- Las vulnerabilidades de los contratos inteligentes incluyen ataques de reentrada, desbordamientos de enteros y adelantamiento.
- Los usuarios pueden mitigar los riesgos tomando precauciones de seguridad como verificar auditorías de código independientes y usar solo protocolos de confianza.