Hackeando DeFi: El primer ataque exitoso a una plataforma de lending

CTF Capital
9 min readFeb 19, 2020

--

Grafico de las operaciones invocadas en el contrato del primer ataque

Durante el fin de semana anterior tuvo lugar la conferencia de ETH Denver, una de los encuentros más importantes del mundo Ethereum, y no fue para menos que durante uno de los eventos más importantes tomó lugar uno de los primeros y más innovadores “ataques” a una plataforma DeFi.

Durante el mediodía de Denver, una operación movió las tasas de interés en Compound de WBTC a un 27% lo cual llamó la atención de los distintos usuarios de las plataformas DeFi. No fue solo unas horas más tarde cuando el equipo de bZx tuvo que emitir un comunicado advirtiendo a sus usuarios que sus fondos estaban seguros y estaban analizando una transacción compleja que obtuvo una ganancia a través de unos shorts.

Con el correr de las horas se empezó a aclarar que una operación interactúo de forma compleja con diferentes protocolos había conseguido “vencer” los oráculos de bZx, dejando asi a la plataforma con una posicion en default muy importante. Los rumores respecto a que solo una fuente de datos descentralizada (Uniswap) daba información del precio de WBTC a la plataforma empezaron a aparecer y poco a poco se empezó a saber más respecto del evento.

Mediante la interaccion con 5 protocolos DeFi diferentes un trader habia logrado en una sola transaccion un profit aproximado de 350K U$D. Los protocolos involucrados fueron dYdX, Compound, Uniswap, Kyber Network y el más afectado bZx.

Parte 1: Tomando un flash loan y dejando en una posicion de default a Kyber

Diagrama del primer ataque (PeckShield)

La operación financiera fue:

  • Tomar prestado 10.000ETH de dYdX con un flash loan.
  • Depositar un 5500ETH en compound para tomar prestado 112 WBTC
  • Depositar 1300ETH en bZx y tomar un short de ETH/WBTC apalancandose por 5
  • Vender sus 112 WBTC en uniswap cuyo precio habia aumentado por la compra de los shorts por parte de bZx
  • Consiguiendo asi una ganancia para devolver el flash loan y un remanente, y a su vez , quedarse con la posicion en Compound y dejar a bZx con una posición insegura al haber permitido en su plataforma un prestamo sin el colateral necesario.

Vamos a hacer entonces un repaso de cómo se llevó acabo este ataque y lo que significó explicando en cada paso porque utilizo cada plataforma:

1.dYdX tomando flash loans para apalancarse

dYdX es una exchange descentralizado (DEX) que funciona con un Order Book y tiene la opción de apalancarse. De un gran éxito durante el año pasado la plataforma también permite recibir interés por la inmovilización de fondos y tomar prestado.

Los flash loans son una especie de préstamo especial que tiene una tasa de interés y que permite tomar y devolver dinero en el mismo bloque sin estar colateralizado. Esto significa que uno puede sacar y devolver un préstamo sin necesidad de poner ningún activo en garantía, solo con la condición de que se devolverá en la misma transacción. Si esta condicion no se cumple entonces toda la operación no puede funcionar, de esta manera el prestamista sabe siempre que el dinero que presta va a volver, pero no tiene influencia en que pasa en el medio con el capital prestado.

El trader en este caso hizo un retiro de 10.000 ETH (casi 2.5MM U$D a la cotización de ese dia) de la plataforma de dYdX.

2. Depositando ETH en Compound para obtener WBTC.

Una vez obtenidos los 10.000 ETH el usuario utilizó el 50%, 5500 ETH , para depositarlos en Compound, una plataforma de lending que otorga un porcentaje por depositar fondos y permite sacar préstamos colateralizados. Con este dinero entonces inmovilizado en la plataforma fue capaz de retirar 112 WBTC.

3. Comprando un short en bZx

En paralelo con 1300ETH se dirigió a bZx donde fue capaz de obtener shorts de ETH/WBTC con un apalancamiento de 5x, lo que en si es que tomo una deuda por esa posicion de 5637 ETH con los que compro 51WBTC. Recordemos que un short es una posicion que es una posicion que indica que se cree que el precio va a caer.

Para otorgarle el short el smart contract de bZx, fue a realizar la operación de compra de WBTC en Kyber, un exchange descentralizado que en el caso de WBTC utilizaba como proveedor de los activos a Uniswap. Al comprar los WBTC a través de Kyber entonces, la plataforma hizo que el precio suba violentamente dado que había una baja liquidez en Uniswap que fue finalmente el exchange donde finalmente se realizó la operación.

Es en este paso donde debemos notar que el trader realizo la parte donde se considera que pudo haber sido un ataque lo que hizo, dado a que engaño al protocolo para que no sea consciente de que iba a defaultear en su posicion despues de que se realice la compra de los shorts.

La compra en Uniswap fue tan grande que el precio normal en Uniswap aumento de un promedio de 38 WBTC/ETH a 109.8 WBTC/ETH. Si el sistema hubiese funcionado bien bZx hubiese debido detectar que la posicion no iba a poder cubrir la posicion que estaba tomando.

Para mas informacion en el bug recomendamos esta nota de Peckshield

4. Vendiendo WBTC en Uniswap para aprovechar la subida de precio.

Con el préstamo que tomó, el trader vendió en Uniswap los 112 WBTC que había adquirido gracias al préstamo, dado ha que en el momento anterior bZx había ido a comprar también en Uniswap 51 WBTC sacando gran parte de la liquidez, el precio era extremadamente alto y del otro lado el trader pudo vender todos su BTCs a un valor mucho más alto que el del mercado obteniendo por los mismos una ganancia de 6871 ETH.

5. Cerrando los prestamos

Una vez que se activó la transacción en Uniswap, gracias a la ganancia de 6871 ETH de la venta de WBTC y los 3200 ETH que no habia gastado de lo que habia sido el prestamo original, pudo devolver a dYdX toda la deuda y obtuvo un profit de 71 ETH.

6. Cerrando los numeros

De esta manera al final de la operacion la cuenta tenia 5500ETH en colateral en Compound que tenian una deuda de 112WBTC que puede cubrir con 4300ETH, una posicion en ETH/WETH de colateral en bZx y una deueda que dado a que ya habia defaulteado en ese prestamo no le interesa, y por ultimo tambien posee los 71 ETH que le sobraron al cerrar el Flash Loan.

Considerando el precio promedio de 1WBTC=38.5ETH, el atacante consiguio 112WBTC con aproximadamente 4300ETH lo que cerraria todo en :

71ETH+5500ETH-4300ETH = 1271 ETH = 355880 U$D

Lo más sorprendente de esto que toda esa lógica fue inyectada en solo una transacción, haciendo que de cumplirse el trader iba a ganar todo lo que ya había preconfigurado de primera mano (que suba el precio gracias a la compra de shorts y que al vender lo que tomo prestado el precio ya haya subido).

Parte 2. Subiendo el precio de un stablecoin para obtener un prestamo mas grande

Diagrama del segundo ataque (PeckShield)

El día Lunes y luego incluso de ciertas mejoras en la seguridad de los contratos de bZx, el mismo atacante realizo un ataque similar pero con otro tipo de logica que le dejo una ganancia de aproximadamente 650K U$D.

Para esto condujo una manipulación en los oráculos generando que el equipo de bZx cesará las operaciones hasta que puedan auditar los mecanismos que condujeron a esto.

En esta ocasión el atacante:

  • Tomó 7500 ETH en un Flash Loan de dYdx
  • Luego con 3500 ETH aproximadamente compro 975K sUSD (un sintético del dólar) en Synthetix.
  • Depósito esos 975K sUSD como colateral en bZx.
  • Por otra parte utilizó 900 ETH para comprar sUSD en Kyber y Uniswap haciendo que en este caso el valor del sUSD que debería mantenerse constante en 1 U$D salte a casi 2 U$D.
  • Aprovecho la subida artificial del sUSD tomando un préstamo colateralizado en bZx que tomó el valor de referencia de 2 U$D por lo cual sus depósitos de 975K sUSD=975 K USD pasaron a cotizar a 975K sUSD=1.8M USD permitiéndole tomar un préstamo en ETH mucho más grande de lo que debería
  • Con ese dinero pudo entonces cerrar su flash loan y vaciar el ETH del pool de bZx en el camino que quedó con un préstamo en esta ocasión que no debería haber permitido (nuevamente).

Para una explicación en detalle de este ataque les recomendamos el articulo de PeakShield : bZx Hack Full Disclosure (With Detailed Profit Analysis)

Los seguros y los oráculos en alza

Una vez que se confirmó el ataque a bZx las dos únicas plataformas de seguros empezaron a tener más demanda y se vio una caida estrepitosa de los fondos depositados en bZx.

Esta operación disparo tambien una serie de eventos, siendo los mas relevantes el aumento en interes en las plataformas de seguros y en ChainLink una empresa que provee una infraestrucutura de Oraculos mas confiable que en teoría podría mitigar estos ataque

Nexus Mutual, uno de los proyectos más interesantes que surgió el año pasado, ha empezado a recibir solicitudes de usuarios para cobrar el seguro con el que dicho protocolo cubría las posiciones en la plataforma de bZx. Dado la complejidad de la transacción es difícil afirmar si el mismo será considerado un ataque o simplemente un error del diseño del protocolo, dado que hasta los expertos siguen en duda. Esto es en parte una gran noticia, dado que vamos a poder ver por primera vez actuar a estas plataformas de seguros y seguro un creciente interés.

Nexus Mutual compite hoy solamente contra Opyn, una plataforma que fue finalmente estrenada hace unas semanas la cual ofrece seguros para depósitos en Compound a través de la compra de opciones, instrumentos financieros complejos.

A su vez, dado que el ataque incluyó primariamente un ataque a los oráculos, Chainlink alcanzó sus All time highs en las últimas horas alcanzando un valor de 4.5 U$D por token. Esto marca la importancia que este proyecto puede llegar a tener a futuro dado a que hubiese sido una de las posibles formas de evitar una manipulacion u ataque a los componentes que le proveen el precio de referencia a las plataformas, los oráculos.

Grafico del Precio Chainlink

Conclusiones

  • No todas las plataformas en DeFi son tan descentralizadas, al tener un kill switch pausaron los smart contracts y el UI.
  • Es bueno que este tipo de ataques pasen cuando el valor total lockeado en DeFi haya llegado a 1 Billion U$D. No es lo suficientemente grande para que sea una catástrofe y lo suficientemente chico como para aprender y solucionar este vector de ataques.
  • Los Flash loans nos muestran que podemos aprovechar ineficiencias en el mercado de forma muy eficiente en terminos de Capital pero que tambien se pueden volver una herramienta en contra del propio sistema
  • Los bugs en Smart Contracts todavia son un peligro y pueden incluso llegar a ocurrir en plataformas de reconocido renombre, seguimos en una industria naciente y de alto riesgo.

Referencias

PeckShield

Notas

CTF Capital no da consejos de inversion ni tiene inversiones en ninguna de las plataformas mencionadas.

--

--

CTF Capital

CTF Capital is a fund manager specializing in crypto assets