Juan Fuente

jfuentet@gmail.com

Reentrancy

Reentrancy

Vulnerabiliad_solidity_reentrancy

Los contratos inteligentes, o smart contracts, son una de las partes más importantes de la tecnología blockchain. Estos contratos autónomos realizan transacciones y acuerdos de manera automática, eliminando la necesidad de intermediarios. Sin embargo, a pesar de su aparente seguridad, los contratos inteligentes no están exentos de vulnerabilidades.

Una más comunes y peligrosas es la re-entrancy (reentrada). Vamos a explorar en profundidad qué es la re-entrancy, cómo se manifiesta y cómo podemos protegernos contra ella.

La re-entrancy es una vulnerabilidad que permite a un atacante ejecutar repetidamente una función dentro de un contrato inteligente antes de que la ejecución anterior haya finalizado. Esto puede llevar a un comportamiento inesperado y permitir al atacante manipular los fondos y datos almacenados en el contrato.

Se produce cuando un contrato inteligente interactúa con otro contrato externo o una dirección de contrato. Si el contrato externo tiene una función que a su vez llama de vuelta al contrato original antes de que se complete la ejecución inicial, se crea una oportunidad para la re-entrancy. El contrato no puede distinguir entre la ejecución inicial y las ejecuciones posteriores, ya que todo forma parte de una gran y única transacción. Y ese es el gran ingenio aplicado en este ataque, ya que aunque este aplicado en un ataque malicioso, lo tiene.

Para entender mejor cómo funciona la re-entrancy, consideremos un ejemplo. Supongamos que hay un contrato inteligente que permite a los usuarios retirar una cierta cantidad de tokens. El contrato inteligente mantiene un registro interno del saldo del usuario y realiza las transacciones correspondientes. Sin embargo, el contrato inteligente no actualiza el saldo interno después de cada transacción. Si un atacante crea un contrato externo malicioso y llama repetidamente a la función de retiro antes de que se actualice el saldo interno, puede retirar más tokens de los que debería tener.

Veamos un ejemplo:

Vulnerabilidad_Reentrancy_1

En este contrato, los usuarios pueden depositar fondos y luego retirar una cantidad específica. Sin embargo, hay una vulnerabilidad de re-entrancy en la función withdraw. Observa que la actualización del balance ocurre después de la transferencia de fondos a msg.sender. Esto permite a un atacante malicioso llamar repetidamente a la función withdraw desde otro contrato antes de que se actualice el balance, lo que les permitiría retirar más fondos de los que deberían tener.

Para protegerse contra la re-entrancy, existen varias medidas que se pueden tomar:

– Lo primero sería actualizar el saldo antes de cualquier transferencia: Asegúrate de actualizar los saldos internos antes de realizar cualquier transferencia. De esta manera, los atacantes no podrán aprovechar la falta de actualización para realizar retiros adicionales.

– Utilizar el patrón «checks-effects-interactions»: Este patrón implica que primero se realicen todas las verificaciones necesarias, luego se realicen los efectos secundarios y, por último, se interactúe con otros contratos o direcciones.

– Limita el uso de llamadas externas: Siempre que sea posible, evita realizar llamadas externas a contratos o direcciones desconocidas. Al limitar las interacciones externas, reduces las posibilidades de que se produzca una re-entrancy.

– Utilizar funciones de retiro con restricciones de tiempo o límites de retiro: Puedes establecer restricciones de tiempo o límites de retiro para las funciones que permiten a los usuarios retirar fondos. Esto puede ayudar a prevenir abusos y minimizar los riesgos asociados con la re-entrancy.

Este sería un ejemplo de cheks-effets-interactions: 

Vulnerabilidad_Reentrancy_2

En este caso, después de comprobar que el balance sea suficiente, primero se actualiza el balance del usuario y luego se realiza la transferencia de fondos. Al hacerlo, mitigamos la posibilidad de que ocurra un ataque de re-entrancy.

La re-entrancy es una vulnerabilidad importante en los contratos inteligentes que puede permitir a los atacantes manipular los fondos y datos almacenados en un contrato. Sin embargo, al comprender cómo funciona y tomar las medidas adecuadas para protegerse contra ella, es posible minimizar los riesgos y garantizar la seguridad.

También puedes ver este mismo artículo en Linkedin aqui.