Hacker de KyberSwap usó un “fallo de dinero infinito” para drenar fondos
El atacante que sustrajo USD 46 millones de KyberSwap se basó en un “complejo y cuidadosamente diseñado exploit de contrato inteligente” para llevar a cabo el ataque, según un hilo en redes sociales compartido por el fundador de Ambient Exchange, Doug Colkitt.
Colkitt calificó el exploit de “fallo de dinero infinito”. Según él, el atacante se aprovechó de una implementación única de la función de liquidez concentrada de KyberSwap para “engañar” al contrato haciéndole creer que tenía más liquidez de la que tenía en realidad.
1/ Finished a preliminary deep dive into the Kyber exploit, and think I now have a pretty good understanding of what happened.
This is easily the most complex and carefully engineered smart contract exploit I’ve ever seen…
— Doug Colkitt (@0xdoug) November 23, 2023
1/ Terminé una inmersión profunda preliminar en el exploit Kyber, y creo que ahora tengo una comprensión bastante buena de lo que pasó.
Este es fácilmente el exploit de contrato inteligente más complejo y cuidadosamente diseñado que he visto nunca…
La mayoría de los exchanges descentralizados (DEX) ofrecen una función de “liquidez concentrada”, que permite a los proveedores de liquidez fijar un precio mínimo y máximo al que ofrecerían comprar o vender criptomonedas. Según Colkitt, esta función fue utilizada por el atacante de KyberSwap para drenar fondos. Sin embargo, el exploit “es específico de la implementación de liquidez concentrada de Kyber y probablemente no funcione en otras DEX”, dijo.
El ataque KyberSwap consistió en varios exploits contra fondos individuales, siendo cada ataque casi idéntico a los demás, dijo Colkitt. Para ilustrar cómo funcionaba, Colkitt consideró el ataque al pool común ETH/wstETH en Ethereum. Este pool contenía Ether (ETH) y Lido Wrapped Staked Ether (wstETH).
El atacante comenzó tomando prestados 10,000 wstETH (por valor de USD 23 millones en ese momento) de la plataforma de préstamos flash Aave, como se muestra en los datos de blockchain. De acuerdo con Colkitt, el atacante vertió entonces tokens por valor de USD 6.7 millones en el pool, lo que provocó que su precio se desplomara a 0.0000152 ETH por 1 wstETH. En este punto de precio, no había proveedores de liquidez dispuestos a comprar o vender, por lo que la liquidez debería haber sido cero.
A continuación, el atacante depositó 3.4 wstETH y ofreció comprar o vender entre los precios de 0.0000146 y 0.0000153, retirando 0.56 wstETH inmediatamente después del depósito. Colkitt especuló con la posibilidad de que el atacante hubiera retirado los 0.56 wstETH para “hacer que los cálculos numéricos posteriores cuadraran perfectamente”.
Tras realizar este depósito y esta retirada, el atacante realizó un segundo y un tercer canje. El segundo swap empujó el precio a 0.0157 ETH, lo que debería haber desactivado la liquidez del atacante. El tercer swap volvió a subir el precio a 0.00001637. Esto también estaba fuera del rango de precios establecido por el propio umbral de liquidez del atacante, ya que ahora estaba por encima de su precio máximo.
En teoría, los dos últimos swaps no deberían haber servido para nada, ya que el atacante estaba comprando y vendiendo su propia liquidez, puesto que todos los demás usuarios tenían un precio mínimo muy por debajo de estos valores. “En ausencia de un fallo numérico, alguien que hiciera esto simplemente estaría comerciando de ida y vuelta con su propia liquidez”, declaró Colkitt, y añadió: “y todos los flujos se compensarían a cero (menos las comisiones)”.
Sin embargo, debido a una peculiaridad de la aritmética utilizada para calcular los límites superior e inferior de los rangos de precios, el protocolo no eliminó la liquidez en uno de los dos primeros swaps, pero también la volvió a añadir durante el swap final. Como resultado, el pool acabó “contando doblemente la liquidez de la posición LP original”, lo que permitió al atacante recibir 3,911 wstETH por una cantidad mínima de ETH. Aunque el atacante tuvo que deshacerse de 1,052 wstETH en el primer swap para llevar a cabo el ataque, aún así le permitió obtener un beneficio de 2,859 wstETH (USD 6.7 millones al precio de hoy) después de devolver su préstamo flash.
Al parecer, el atacante repitió este ataque contra otros pools de KyberSwap en varias redes, y acabó llevándose un botín total de USD 46 millones en criptomonedas.
Según Colkitt, KyberSwap contenía un mecanismo a prueba de fallos dentro de la función computeSwapStep que pretendía evitar que este exploit fuera posible. Sin embargo, el atacante se las arregló para mantener los valores numéricos utilizados en el swap justo fuera del rango que provocaría la activación del mecanismo a prueba de fallos, como declaró Colkitt:
“[L]a ‘cantidad de alcance’ era el límite superior para alcanzar el límite de ticks se calculó como …22080000, mientras que el explotador estableció una cantidad de swap de …220799999[.] Eso demuestra lo cuidadosamente diseñado que estaba este exploit. La comprobación falló por
Colkitt calificó el ataque como “fácilmente el exploit de contrato inteligente más complejo y cuidadosamente diseñado que he visto nunca”.
Como informó Cointelegraph, KyberSwap fue explotado por USD 46 millones el 22 de noviembre. El equipo descubrió una vulnerabilidad el 17 de abril, pero no se perdieron fondos en ese incidente. La interfaz de usuario del exchange también fue hackeada en septiembre del año pasado, aunque todos los usuarios fueron compensados en ese incidente. El atacante del 22 de noviembre ha informado al equipo de que está dispuesto a negociar la devolución de parte de los fondos.
Aclaración: La información y/u opiniones emitidas en este artículo no representan necesariamente los puntos de vista o la línea editorial de Cointelegraph. La información aquí expuesta no debe ser tomada como consejo financiero o recomendación de inversión. Toda inversión y movimiento comercial implican riesgos y es responsabilidad de cada persona hacer su debida investigación antes de tomar una decisión de inversión