Los contratos inteligentes son una herramienta poderosa en el mundo de las criptomonedas y la tecnología blockchain. Son autónomos, irrevocables y se ejecutan de forma automática cuando se cumplen ciertas condiciones, lo que los convierte en una solución ideal para una amplia variedad de aplicaciones, desde la automatización de procesos comerciales hasta la creación de nuevas formas de crowdfunding. Sin embargo, a medida que la popularidad de los contratos inteligentes aumenta, también lo hacen los riesgos asociados a su implementación. Desde errores tipográficos hasta fallas de seguridad, los riesgos ocultos en los contratos inteligentes pueden ser devastadores. Es esencial que los desarrolladores comprendan y aborden estos riesgos para garantizar la seguridad de sus implementaciones y proteger a los usuarios de posibles ataques o errores. En este post exploraremos los riesgos en los contratos inteligentes y cómo garantizar la integridad y eficiencia a través de una implementación segura de Smart Contracts.
¿Qué es un Smart Contract?
Un Smart Contract es un tipo de código que permite la verificación y ejecución automática de un acuerdo. Este concepto representa un cambio significativo en el mundo de los negocios, ya que los Smart Contracts funcionan en la tecnología blockchain y no requieren intervención humana para verificar y hacer cumplir las condiciones acordadas.
En el caso de los contratos de préstamos, por ejemplo, los Smart Contracts permiten que el prestamista cierre automáticamente el acceso al dinero si el prestatario no cumple con los pagos o intereses acordados. Además, los Smart Contracts también son útiles en la verificación de datos y para la implementación de cláusulas en los contratos de seguro, reduciendo así las posibilidades de disputas.
Es cierto, la creación de un Smart Contract eficiente es un reto importante. La capacidad de expresar valor, la transparencia y la inmutabilidad son tres de los atributos más importantes de un Smart Contract, pero también los hacen más vulnerables a ataques cibernéticos.
A pesar de que no siempre hay una intención maliciosa detrás de estos ataques, los errores en la programación de los Smart Contracts han llevado a colapsos de capital y pérdidas importantes para las empresas. Por lo tanto, es esencial ser consciente de las vulnerabilidades más comunes que pueden surgir en los Smart Contracts.
Pero ahora vamos a entrar en materia con los cinco problemas más comunes en la seguridad de los Smart Contracts y cómo evitar sus posibles riesgos y consecuencias.
1. El Error Aritmético de Números Enteros
El uso de números enteros para representar valores en smart contracts es una práctica común debido a la falta de soporte para números con punto flotante. A menudo, se requiere reducir el valor a una unidad más pequeña para lograr una precisión adecuada. La mayoría de los tokens admiten hasta 18 lugares decimales, lo que mejora aún más la precisión.
Sin embargo, los desarrolladores deben estar conscientes del potencial de desbordamiento de enteros. Al igual que el kilometraje de un automóvil, los números enteros en una computadora también tienen un valor máximo, y una vez que se alcanza ese valor, vuelven a su valor mínimo. De manera similar, restar 4 de 3 en un entero sin signo resultará en un desbordamiento y un valor muy grande. Para evitar este problema, los desarrolladores pueden usar bibliotecas matemáticas seguras.
Además, los desarrolladores deben ser conscientes de la falta de precisión que puede ocurrir cuando la aritmética de enteros se ejecuta incorrectamente. El orden de las operaciones es crucial, especialmente en el cálculo de porcentajes. Por ejemplo, para calcular el 25% de 80, es común dividir por 100 y luego multiplicar por 25. Sin embargo, una división equivocada puede resultar en un error de redondeo. Por ejemplo, calcular 80/100 * 25 usando solo números enteros resultará en 0.
Este error, aunque parece simple, es común entre los desarrolladores. Por lo tanto, es importante prestar atención a los detalles y ser conscientes de los posibles errores en la aritmética de enteros en los smart contracts.
2. Vulnerabilidades en el Límite de Gas de Bloque
Ethereum mantiene el tamaño de los bloques bajo control a través del límite de gas de bloque. Esto implica que la cantidad de gas que las transacciones dentro de un bloque pueden consumir está limitada. Si una transacción consume demasiado gas, no se incluirá en el bloque y por lo tanto, no se ejecutará.
Esto puede llevar a una vulnerabilidad común: cuando los datos se almacenan en arreglos de tamaño variable y se accede a ellos a través de un bucle, la transacción puede agotarse rápidamente y revertirse si hay demasiados elementos en el arreglo. Este problema suele ocurrir en la producción, pero no durante las pruebas, debido a que el conjunto de datos de prueba suele ser más pequeño que el de producción.
Esta vulnerabilidad es peligrosa porque los contratos relacionados con ella suelen pasar las pruebas unitarias y funcionar bien con una pequeña cantidad de usuarios. Pero a medida que el proyecto crece y el conjunto de datos se agranda, estos contratos pueden fallar. En este caso, puede haber una pérdida irrecuperable de fondos, especialmente en el caso de pagos recurrentes.
3. El Front Running
Antes de continuar prefiero hacer una pequeña introducción para el que no esté familiarizado con el término.
Para comprender lo que es front running, es esencial conocer cómo obtener ganancias adelantándose a la ejecución de una operación. Tradicionalmente, el front running se logra adquiriendo información privilegiada sobre eventos que pueden afectar el precio de acciones, materias primas u otros instrumentos financieros. Sin embargo, en los mercados de criptomonedas, el flujo de órdenes es el elemento clave.
Ahora sí, continuamos en lo que respecta a seguridad…
El análisis del flujo de órdenes y el tamaño de los bloques puede brindar una idea de la dirección en la que está moviéndose el precio. Por lo tanto, el front running en el ámbito de las criptomonedas implica adelantarse a la orden correcta en el flujo de órdenes.
Las transacciones no confirmadas son visibles en el grupo de memoria antes de que los mineros las agreguen a un bloque, lo que permite a los comerciantes interesados monitorear su contenido y adelantar la transacción pagando tarifas más altas. Este proceso se puede automatizar fácilmente y es común en aplicaciones financieras descentralizadas.
El Frontrunning se refiere a la toma de posición de transacciones no confirmadas, y es un resultado de la transparencia en la cadena de bloques.
Para solucionar este problema, suele requerirse una refactorización o un rediseño importante.
4. La falta de control en los parametros y controles precondicionales
En la programación, un error común es olvidar verificar los parámetros de una función o no realizar las comprobaciones necesarias para garantizar la validez de una operación en particular. Esto puede incluir parámetros de dirección que no se comparan con la dirección cero o un usuario sin autenticación que no tiene suficientes tokens para realizar una transacción específica. La verificación de acceso también es importante, ya que solo ciertos tipos de usuarios deberían tener permiso para llamar a una función determinada, pero a veces esta verificación se omite.
Estos errores a menudo son el resultado de un descuido en el proceso de diseño. Por ello, es útil tener un registro escrito de las funciones, que incluya los parámetros, las condiciones previas y las operaciones a realizar. Seguir patrones de diseño estables, como Verificación-Efecto-Interacción, también puede ayudar a prevenir este tipo de vulnerabilidades.
5. Bugs lógicos (o no tanto…)
El problema más común en los contratos inteligentes es un error en su propia lógica. Estos errores pueden ser causados por pequeños errores de escritura o malinterpretaciones de especificaciones, lo que puede tener un gran impacto en la seguridad. Aunque los errores de programación específicos de los smart contracts son importantes, los errores de lógica son inherentes a la programación en sí. Es esencial prestar atención a la lógica y asegurarse de que se entienden las especificaciones antes de comenzar a escribir el código.
En conclusión…
En resumen, la seguridad de los contratos inteligentes es esencial para garantizar la integridad y eficiencia de las aplicaciones descentralizadas. Los errores comunes incluyen falta de privacidad, vulnerabilidades de reentrada, front running y falta de parámetros o controles de precondición. Además, los errores de lógica pueden ser causados por simples errores tipográficos o malentendidos de especificaciones. Para asegurar la seguridad, es necesario seguir buenas prácticas de programación y diseño, tener una comprensión sólida de la tecnología de blockchain y de los contratos inteligentes, y realizar pruebas exhaustivas y revisión por parte de expertos antes de la implementación. La seguridad de los contratos inteligentes es un aspecto crítico en el desarrollo de aplicaciones descentralizadas y debe ser abordado adecuadamente.
Autor: Josué López – CEO & CSO en Auditech.