¡Buenas a todos! Hoy quiero empezar una serie de entradas sobre DeFi hacking y para ello vamos a resolver los retos de Damn Vulnerable DeFi creados por tinchoabbate. Empezaremos por el primer reto de esta colección, unstoppable.
Para empezar vamos a aclarar los conceptos clave, ¿qué es DeFi? Es la abreviatura de Decentralized Finance o finanzas descentralizadas. Esto se refiere a lo relacionado financieramente con criptomonedas y blockchain. La mayoría de "Smart contracts" que son los encargados de estas finanzas están hechos para la red de ethereum y programados en solidity.
No voy a explicar cómo poner estos retos en marcha ya que en la web damnvulnerabledefi se explican brevemente los pasos a seguir.
Bien, al leer el problema que nos presentan vemos que tenemos que hacer que el contrato no pueda hacer préstamos. Al principio pensé que tenía que vaciar la cartera del préstamo pero resulta que hay que romper la lógica de la función de préstamos.
La función toma un argumento que será la cantidad del préstamo.
La primera condición que comprueba la función es si la cantidad pedida es mayor que 0. Aquí no podemos hacer nada.
Después se declara balanceBefore que es el balance antes de la ejecución del préstamo de la cartera de préstamos y se comprueba si hay suficientes fondos para el préstamo pedido.
Ahora vemos que comprueba que poolBalance y la variable balanceBefore que he mencionado antes sean iguales. Esta comprobación según el comentario viene asegurada por la función depositTokens.
La función depositTokens se ve que está diseñada para controlar el balance actual del sistema de préstamos. Comprueba si el depósito es mayor que 0 y si lo es va a hacer la transferencia para después sumar a poolBalance el valor de la transferencia hecha.
Si miramos el código vemos que no hay otra declaración de poolBalance que no sea la inicial donde se indica su tipo como uint256 o la declaración en la función de depósito. Si esta variable se puede descuadrar respecto al balance real de los fondos esa comprobación sería falsa y no se podrían hacer los préstamos.
Como poolBalance no se puede modificar en la ejecución de la función flashLoan vamos a tener que "dejarla atrás" y modificar el balance sin pasar por la función de depósito ni de préstamo.
Para probar nuestra solución tenemos que escribir el exploit en el archivo unstoppable.challenge.js ya que los archivos de los contratos (ReceiverUnstoppable.sol y UnstoppableLender.sol) no debemos de tocarlos porque en un entorno real estos contratos estarían desplegados en la red y no accesibles para su escritura. Dentro del archivo del reto encontramos una parte que tiene un comentario que dice "/** CODE YOUR EXPLOIT HERE */" pues vamos a codear el exploit aquí 😆
Ahora ejecutamos y comprobamos si nuestra solución es válida.
Como veis, no ha saltado ningún error, por lo que hemos completado unstoppable.
Es la primera vez que hago DeFi hacking y me ha gustado bastante. Además, tenía ya ganas de probarlo ya que guardé el enlace hace un par de meses y todavía no los había ni descargado.
Ha sido el primer reto de toda la colección y a pesar de su sencillez me ha dado más trabajo de lo que esperaba ya que tenía muchos conceptos que asimilar pero cuando consiga sacar el segundo, el cual he estado ya revisando, os lo traeré aquí también.
Muchas gracias a todos una vez más por leerme, espero que os haya gustado. Recordad que podéis seguir el canal de telegram o la cuenta de twitter con los enlaces que se encuentran algo más abajo de los comentarios para enteraros de cuando hay una nueva publicación ¡Nos vemos!
No hay comentarios:
Publicar un comentario