(Parte 3) ¡Más de $300 millones perdidos por esta vulnerabilidad!

Parte 1

Parte 2
Aquí tienes un ejemplo de contrato inteligente en vivo y aprende cómo funciona, incluso si no eres un desarrollador.

Los ataques de reentrada son una vulnerabilidad común en los contratos inteligentes de EVM, que permiten que un contrato externo secuestre el flujo de control y vuelva a ingresar, drenando potencialmente los fondos de la víctima.
Estos ataques siguen siendo un problema importante en el desarrollo de contratos inteligentes y los desarrolladores los toman muy en serio.

Image

Los ataques populares de contratos inteligentes de reentrada incluyen:
• El hackeo de DAO: perdieron alrededor de 50 millones de dólares en ETH.
• Cream Finance: Perdieron más de 30 millones de dólares en diversos activos.
• Siren Protocol: Perdieron más de 30 millones de dólares en diferentes activos.


Implementemos este ejemplo usando contratos inteligentes de Solidity.
No te preocupes, iremos paso a paso.
Usaré @EthereumRemix (X), una interfaz de desarrollo donde puedes escribir, compilar, probar y ejecutar código.
Escribiremos algo de código y simularemos un ataque.

• Primero, crearemos un archivo llamado "Bank.sol", que contendrá todo el código.
• Luego, crea un mapeo para almacenar el saldo de cada dirección.
Aquí cada dirección corresponderá a la cuenta de una persona.

A continuación, crearemos una función de depósito simple que permita a los clientes depositar dinero en el banco.
El contrato inteligente aquí representa al banco.
Cada vez que se realiza un depósito, el mapeo se actualiza agregando el nuevo depósito a la dirección respectiva.

También necesitamos una función de retiro que permita a los depositantes retirar todo o parte de su saldo.
Para simplificar, cada vez que el cliente llama a esta función, retirará todo su saldo y estableceremos su saldo en 0 en el mapeo.

Por último, agregamos una función que no cambia la asignación sino que simplemente permite al cliente consultar su saldo.
Esto se llama función de visualización, que no consume gas porque no modifica los datos en cadena, solo muestra la información solicitada.

El contrato parece bastante simple y, a primera vista, parece inquebrantable.
Intentemos un ataque de reentrada. Construiremos el contrato inteligente del atacante con una función de recepción que seguirá retirando mientras el saldo del contrato sea superior a 1 ETH.

Para finalizar, agregaremos una función de visualización, getBalance, que devolverá el saldo de Ether del contrato del atacante.
Ahora, implementemos todo y probemos si nuestro ataque de reingreso funcionará.

Primero, necesitamos implementar el contrato del Banco:
• Comience compilando ambos códigos.
• Implementar el contrato del Banco.
• Copie la dirección del contrato bancario implementado y úsela como entrada para implementar el contrato del atacante.
• Luego, deposite 10 ETH en el contrato bancario.
• Deposite 1 ETH en el contrato del atacante.
• Finalmente, lanza el ataque utilizando la función de ataque.

Como podemos ver, el ataque funcionó.
Habíamos depositado 10 ETH con una dirección y 1 ETH con la dirección del atacante.
Al final, la dirección del atacante contiene 11 ETH.

¿Cómo se hubiera podido evitar esto?
Esto se podría haber evitado estableciendo el saldo del cliente en 0 antes de enviarle los fondos cuando llama a la función de retiro.
Lo único que habría bastado sería mover una sola línea de código.

Espero que este artículo te haya resultado útil.
Sígueme @Bluechip para más.
Si puedes, dale me gusta o vuelve a publicar la cita.

#TON #DOGSONBINANCE #CryptoMarketMoves #TelegramCEO #USNonFarmPayrollReport