¿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 y a Stars Arena que perdió USD $3 millones, utilizó esta vulnerabilidad.
- Enseñamos en que consiste el ataque y como evitarlo para que tus Smart Contracts no sufran de esta vulnerabilidad
- La protección incluye seguir el patrón “checks-effects-interactions” y usar semáforos.
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:
Como evitar esta vulnerabilidad
Para proteger un contrato 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.
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