
Los smart contracts (contratos inteligentes) son programas que se ejecutan en una plataforma blockchain cuando se cumplen ciertas condiciones definidas en los contratos. Estos contratos se han vuelto fundamentales en los ecosistemas de las criptomonedas y proyectos blockchain, ya que permiten automatizar y garantizar la ejecución de acuerdos sin la necesidad de intermediarios.
El presente artículo tiene como objetivo analizar la seguridad de estos contratos desde el punto de vista del desarrollador, analizando las principales vulnerabilidades que se pueden producir en estas aplicaciones. Un error o una vulnerabilidad en un contrato inteligente puede resultar en la pérdida de activos digitales, violación de la privacidad o incluso la manipulación de un sistema descentralizado.
Introducción al OWASP Smart Contract Top 10
El proyecto OWASP Smart Contract Top 10 [1] tiene como objetivo ofrecer a los desarrolladores y a los equipos de seguridad información sobre las 10 principales vulnerabilidades encontradas en los contratos inteligentes que se pueden resumir en los siguientes:
- Reentrancy Attacks (Ataques de reentrada): Vulnerabilidad que se produce cuando un atacante puede llamar repetidamente a una función dentro de un contrato inteligente, aprovechando el hecho de que el estado del contrato no se ha actualizado como se esperaba.
- Integer Overflow and Underflow (Desbordamiento de enteros). Esta vulnerabilidad se produce cuando las operaciones aritméticas exceden el tamaño máximo o mínimo que una variable de tipo entero puede contener, lo que hace que el valor se ajuste al extremo opuesto
- Timestamp Dependence (Dependencia del timestamp). Un contrato podría ser vulnerable si el comportamiento del mismo depende de la marca de tiempo del bloque en el que está incluido. Esto se debe a que los mineros tienen cierto grado de control sobre la marca de tiempo del bloque.
- Access Control Vulnerabilities (Vulnerabilidades de control de acceso). La falta de controles de acceso adecuados puede permitir a cualquiera realizar operaciones críticas, como transferencias de activos, sin necesidad de la autenticación y autorización adecuadas.
- Front running. Es una vulnerabilidad donde un atacante puede observar una transacción pendiente y luego su propia transacción con una tarifa de gas más alta, incentivando a los mineros a incluirla primero en la cadena de bloques. Esto es posible en redes públicas de blockchain como Ethereum [2, 3], donde los datos de las transacciones son accesibles públicamente antes de ser extraídos.
- Denial of Service (DoS) Attacks.(Ataques de Denegación de Servicio). Los ataques DoS tienen como objetivo hacer que un contrato no esté disponible para ser ejecutado dentro de la cadena de bloques. En los contratos inteligentes, en el caso de redes como Ethereum [2, 3] esto podría lograrse consumiendo todo el gas disponible o provocando que las transacciones fallen de forma ilimitada.
- Logic Errors (Errores de lógica). Son un tipo de error en la programación de software que no producen error o excepciones en tiempo de ejecución, pero que podrían hacer que el contrato se comporte de forma incorrecta. Estos errores, a menudo son difíciles de detectar porque el código se ejecuta, pero no produce los resultados esperados debido a un error en la lógica de programación.
- Insecure Randomness. Se refiere a una vulnerabilidad en la que la generación de números aleatorios en un sistema o aplicación no es lo suficientemente segura o impredecible. Esto puede ser especialmente problemático en el contexto de la criptografía y la seguridad de aplicaciones, ya que una aleatoriedad insuficiente puede hacer que los datos y claves sean predecibles y, por lo tanto, vulnerables a ataques.
- Gas Limit Vulnerabilities (Vulnerabilidades de límite de gas). En el caso de la blockchain de Ethereum [3] cada bloque tiene definido un límite de gas, lo que restringe la cantidad de operaciones que puede incluir ese bloque. Si una función dentro de un contrato requiere más gas que este límite, podría congelar los fondos de ese contrato.
- Unchecked External Calls. En Ethereum [2], cuando un contrato llama a otro contrato, el contrato llamado puede fallar sin generar una excepción. Si el contrato de llamada no verifica el resultado de la llamada, podría asumir que la llamada fue exitosa, incluso si no lo fue.
El papel del desarrollador en los smart contracts
Como hemos comentado, los errores en la lógica de programación son un tipo de error en la programación de software que no producen fallos o excepciones en tiempo de ejecución, pero que causan un comportamiento incorrecto o no deseado en la aplicación. Estos errores son difíciles de detectar porque el código se ejecuta sin problemas, pero no produce los resultados esperados debido a errores en la lógica de programación. A continuación, comentamos algunos ejemplo de errores de lógica:
- Errores de lógica de negocio: No reflejar correctamente las reglas de negocio en el código, puede llevar a comportamientos incoherentes o incorrectos en una aplicación.
- Orden de operaciones incorrecto: Cuando se realizan cálculos o acciones en un orden incorrecto, lo que lleva a resultados incorrectos. Por ejemplo, realizar una suma antes de una multiplicación cuando la lógica requería lo contrario.
- Condicionales incorrectos: Usar una condición incorrecta en una estructura condicional (como un if o un switch) que no refleja la intención del programa. Esto puede llevar a que se tomen decisiones incorrectas.
- Bucles infinitos: Crear bucles que no terminan cuando deberían o que terminan antes de lo debido debido a una condición incorrecta.
- Asignación de variables incorrectas: Asignar un valor incorrecto a una variable, lo que puede afectar el funcionamiento de otras partes del código.
- Errores de cálculo: Realizar cálculos incorrectos, como errores en las fórmulas matemáticas o lógicas utilizadas en la aplicación.
La mayoría de estos errores son especialmente difíciles de depurar porque el código no devuelve excepciones ni errores, sin embargo la aplicación se ejecuta sin problemas en términos de funcionamiento. Para encontrar y corregir estos errores, normalmente se requiere una comprensión profunda del diseño y la lógica de la aplicación, así como realizar pruebas exhaustivas y de revisión de código por parte de desarrolladores y equipos de calidad.
Las técnicas de depuración, el análisis de flujo del programa y la revisión de código son herramientas útiles para detectar y solucionar errores en la lógica del programa. Además, la adopción de buenas prácticas de diseño de código pueden ayudar a prevenir la aparición de estos errores.
De esta forma, el papel del desarrollador en la creación y gestión de smart contracts es fundamental para garantizar que estos contratos inteligentes sean seguros, funcionales y cumplan con los requisitos del proyecto. Aquí tienes un resumen de las responsabilidades y tareas del desarrollador en relación con los smart contracts:
- Diseño y planificación:
- Identificación de los requisitos del contrato inteligente, incluyendo sus funciones, parámetros y reglas de negocio.
- Diseño de la arquitectura y la estructura del contrato inteligente.
- Planificación de las interacciones con otros contratos y componentes del ecosistema blockchain.
- Desarrollo y codificación:
- Escritura del código del contrato inteligente en un lenguaje de programación compatible con la plataforma blockchain (por ejemplo, Solidity en Ethereum).
- Implementación de las funciones y lógica del contrato, incluyendo la gestión de datos y la interacción con otros contratos o activos.
- Uso de buenas prácticas de programación y patrones de diseño para garantizar la seguridad y eficiencia del contrato.
- Auditorías de seguridad:
- Identificación y mitigación de vulnerabilidades de seguridad como las mencionadas en el OWASP Smart Contract Top 10 [1].
- Realización de auditorías de seguridad o revisiones de código por parte de expertos en seguridad.
- Implementación de patrones de seguridad recomendados, como el uso de la librería OpenZeppelin [4,5].
- Pruebas unitarias y de integración:
- Creación y ejecución de pruebas unitarias y pruebas de integración para verificar el comportamiento y la funcionalidad del contrato inteligente.
- Pruebas exhaustivas para simular escenarios de uso real y comprobar el cumplimiento de los requisitos.
- Despliegue y gestión:
- Despliegue del contrato inteligente en la blockchain de destino.
- Gestión de las direcciones de contrato y las actualizaciones si es necesario.
- Establecimiento de políticas de actualización y gobernanza, si corresponde.
- Documentación:
- Creación de documentación técnica y de usuario para el contrato inteligente.
- Descripción de las funciones, parámetros, eventos y políticas de uso.
- Documentación de los procedimientos de actualización y mantenimiento.
En resumen,el papel del desarrollador en los smart contracts requiere una comprensión profunda de la plataforma blockchain, así como habilidades de programación, seguridad y buenas prácticas de desarrollo. La seguridad es particularmente crítica en la creación de smart contracts, ya que cualquier vulnerabilidad podría resultar en la pérdida de activos o datos, por lo que la auditoría y la revisión de código por parte de expertos en seguridad son pasos importantes en el proceso de desarrollo.
El papel de la auditorías de seguridad
La auditoría y la seguridad de los contratos inteligentes son esenciales para mitigar riesgos y proteger los activos y datos de los usuarios.
- Auditoría de código: La auditoría de código implica una revisión exhaustiva del contrato inteligente para identificar posibles vulnerabilidades, errores y riesgos de seguridad. Los auditores buscan vulnerabilidades como las comentadas anteriormente.
- Pruebas en diferentes entornos: Además de la auditoría de código, es importante realizar pruebas en diferentes entornos para verificar el comportamiento del contrato. Esto incluye pruebas de unidad, pruebas de integración y pruebas de estrés.
- Buenas prácticas de desarrollo: Seguir buenas prácticas de desarrollo, como el principio de menor autoridad (least authority principle),principio de menor privilegio (least privilege principle) y la reducción de la superficie de ataque, son esenciales para reducir la exposición a vulnerabilidades.
- Actualizaciones y mantenimiento: Los contratos inteligentes deben ser actualizados y mantenidos a medida que cambian los requisitos y las necesidades de seguridad. Las actualizaciones deben ser compatibles con versiones anteriores y contar con mecanismos de actualización seguros.
- Transparencia y revisión en comunidad: La comunidad en torno a los proyectos de blockchain suele realizar revisiones públicas de contratos inteligentes para garantizar la transparencia y la seguridad. La revisión por parte de la comunidad puede ayudar a identificar problemas antes de que se conviertan en amenazas.
Si quieres saber más sobre blockchain y ciberseguridad, el siguiente libro[BLOCKCHAIN. Tecnologías, proyectos y ciberseguridad] escrito por el autor te da una visión global de en qué consiste blockchain, las tecnologías que hay por detrás y recomendaciones de seguridad cuando trabajamos en este tipo de proyectos.
Referencias:
[1] OWASP Smart Contract Top 10
[2] Ethereum
[5] OpenZeppelin Contracts Github
Únete a nuestra comunidad
¿Te gustaría trabajar en desarollo web? En nuestra plataforma de Talent puedes encontrar la forma de llevar tu carrera al siguiente nivel. Entra en nuestra web y encuentra tu trabajo ideal. Échale un vistazo.
Ser parte de la comunidad de Codemotion te permitirá potenciar tu experiencia y enfrentar nuevos desafíos que impulsarán tu carrera. Aprenderás nuevas habilidades técnicas y crecerás junto a otros miembros mediante el intercambio de opiniones y la creación conjunta. Tenemos dos comunidades para ti según tu experiencia:
Si eres wanna-be-dev, junior-dev o early-mid-dev nuestra comunidad de Discord es para ti. Allí encontrarás recursos, eventos, formación, muchos compañeros de viaje y beneficios exclusivos. Súmate aquí.
Si eres late-mid-dev, senior-dev, Tech Lead o CTO nuestra comunidad de Telegram es para ti. Allí encontrarás el mejor networking, artículos high-tech, debates de tendencias tech y beneficios exclusivos. Súmate aquí.
¡Nos vemos en Codemotion!