Glosario cripto

Ataque de reentrada

Definición

Un ataque de reentrada es un exploit en el que un contrato malicioso vuelve a llamar a su víctima una y otra vez antes de que esta actualice sus saldos.

El fallo aparece cuando un contrato envía fondos o llama a un contrato externo antes de actualizar sus propios registros. El contrato que recibe la llamada puede ejecutar código en ese momento y volver a invocar la función original. Como el saldo aún no se ha descontado, la víctima vuelve a pagar, y el bucle sigue hasta vaciar los fondos o agotar el gas de la transacción.

Es el ataque que provocó el hackeo de The DAO en junio de 2016, en el que se movieron unos 3,6 millones de ETH, lo que llevó al hard fork que separó Ethereum y Ethereum Classic. Siguen surgiendo variantes: en julio de 2023, un fallo en algunas versiones del compilador Vyper desactivó los bloqueos contra la reentrada y varios pools de Curve fueron vaciados.

Los desarrolladores lo evitan con el patrón checks-effects-interactions, que actualiza el estado antes de cualquier llamada externa, y con guardas de reentrada que impiden entrar dos veces en la misma función. Los auditores lo revisan de forma rutinaria, pero sigue apareciendo en sistemas complejos con muchos contratos que interactúan.

Ejemplo

Una bóveda paga 10 ETH antes de poner a cero el saldo del usuario; el contrato del atacante vuelve a entrar diez veces en la función de retiro dentro de la misma transacción y se lleva 100 ETH.

Términos relacionados

Últimos artículos sobre Ataque de reentrada