¿Has oído hablar de los ataques de reentrancia en contratos inteligentes y cómo estos pueden comprometer millones en fondos? Descubre qué son, cómo han impactado a la comunidad blockchain en el pasado y las estrategias esenciales para proteger tus activos
***
- Vulnerabilidad de reentrancia permite múltiples retiros antes de actualizar el estado del contrato
- El ataque al DAO en 2016, que perdió USD $50 millones utilizó esta vulnerabilidad
- La plataforma social Stars Arena perdió USD $3 millones recientemente por esta misma vulnerabilidad
- Enseñamos en qué consiste el ataque y como evitarlo para que sus Smart Contracts no sufran este inconveniente
- La protección incluye seguir el patrón “checks-effects-interactions” y usar semáforos.
Un ataque de reentrancia, conocido en inglés como “re-entrancy”, es una vulnerabilidad de seguridad en contratos inteligentes, principalmente asociada con Ethereum y cadenas de bloques que utilizan máquinas virtuales compatibles con Ethereum (EVM), como es el caso del C-Chain de Avalanche y muchas otras.
Esta vulnerabilidad permite a un atacante retirar fondos repetidamente antes de que el contrato original pueda actualizar su estado.
La reentrancia ocurre cuando una función externa es llamada y, antes de que esta función complete su ejecución, vuelve a invocar la función que la llamó.
Vamos a descomponerlo paso a paso:
- Función vulnerable: Imagina que tienes un contrato que permite a los usuarios retirar fondos. Cuando un usuario solicita un retiro, el contrato primero envía los fondos y luego actualiza el saldo interno del usuario.
- Llamada externa: La vulnerabilidad se desencadena cuando, durante el proceso de envío de fondos (antes de que el saldo interno se actualice), el contrato llama a una función externa, que podría ser otro contrato o dirección controlada por un atacante.
- Reentrancia: En lugar de simplemente recibir los fondos, la función externa invocada puede volver a llamar a la función de retiro original. Dado que el saldo interno del usuario original aún no se ha actualizado, la función de retiro piensa que todavía hay fondos disponibles y permite otro retiro. Esta reentrancia puede repetirse múltiples veces en una sola transacción, drenando más fondos de los que deberían ser permitidos.
- Actualización del estado: Finalmente, después de que todas las llamadas reentrantes se hayan completado, el contrato original actualizará el saldo del usuario. Pero para ese momento, el daño ya está hecho y los fondos han sido drenados.
El ataque de reentrancia fue infamemente utilizado en el ataque al DAO el 17 de junio de 2016, resultando en la pérdida de aproximadamente USD $50 millones en Ether. Esto eventualmente llevó a una bifurcación dura en Ethereum, creando Ethereum Classic y Ethereum. Este fin de semana, el contrato de Stars Arena fue víctima de un ataque de piratería por esta misma vulnerabilidad y USD $3 millones fueron drenados del valor del contrato.
Cómo evitar esta vulnerabilidad
Para proteger un contrato inteligente contra ataques de reentrancia, es crucial:
- Utilizar patrones como “checks-effects-interactions”, lo que significa que primero se deben hacer todas las verificaciones, luego actualizar los estados y, finalmente, interactuar con otros contratos.
- Emplear semáforos o bloqueos para evitar que una función se llame reentrante mientras todavía se está ejecutando.
- Estar al tanto de las actualizaciones y las mejores prácticas en la seguridad de contratos inteligentes.
Si eres un desarrollador nuevo en Blockchain, es fundamental que revises y pruebes a fondo cualquier contrato en busca de vulnerabilidades de reentrancia antes de desplegarlo en una red principal.
Observemos en la práctica como luce una función que permite re-entrar y luego la arreglamos para evitar la vulnerabilidad.
Ejemplo vulnerable
En este contrato, un atacante podría crear un contrato que reentrante al método retirar
en su fallback, permitiendo al atacante retirar más Ether del esperado.
Ejemplo arreglado
Para arreglarlo, podemos seguir el patrón “checks-effects-interactions”.
Primero verificamos las condiciones, luego actualizamos el estado y, finalmente, hacemos las interacciones externas.
Con este cambio, incluso si hay un intento de reentrancia, el balance del usuario ya habrá sido actualizado y el segundo retiro no se permitirá debido a la condición retirar
.
Imágenes originales de DiarioBitcoin, de uso libre, licenciadas bajo Dominio Público
Artículo original de DiarioBitcoin
ADVERTENCIA: Este es un artículo de carácter informativo. DiarioBitcoin es un medio de comunicación, no promociona, respalda ni recomienda ninguna inversión en particular. Vale señalar que las inversiones en criptoactivos no están reguladas en algunos países. Pueden no ser apropiadas para inversores minoristas, pues se podría perder el monto total invertido. Consulte las leyes de su país antes de invertir.