Uniswap 与 Lendf.Me :235,854美元(1278ETH)与25,236,849.44美元
Uniswap 与 Lendf.Me :235,854美元(1278ETH)与25,236,849.44美元
Uniswap/Lendf.Me 攻击事件是由于imBTC采用ERC777标准,ERC777标准中原生地支持hook(钩子)机制的运行,而在imBTC实现过程中,并未在相应函数间加入互斥锁,从而出现了重入攻击漏洞。黑客正是利用该漏洞对Uniswap与Lendf.Me发起攻击,以几乎接近于0的成本获得了巨额的数字资产。
UTC时间2020年4月18日上午12:58:19发生了一起针对Uniswap imBTC流动池的重入漏洞攻击。大约24小时后,UTC时间2020年4月19日上午12:58:43 Lendf.Me上也发生了类似的黑客攻击事件。
从技术上讲,这两起事件背后的主要逻辑是,兼容ERC777的“transferFrom()”的实现有一个回调机制。
“transferFrom()”操作的“from”地址注册成为“implementer”,这个from参数其实是攻击者参数(比如该参数可以向Lendf.ME提供imBTC),第二个参数是一个常数,即“keccak256('ERC777TokensSender')”。在1056行的代码中,“implementer”中定义的“tokensToSend()”函数被调用了,这使得攻击者可以通过填入其他恶意执行代码来黑进相应交易。
下图所示为Uniswap的恶意攻击,内嵌的“tokenToEthSwapInput()”又被调用了一次,这意味着攻击者又进行了一次将imBTC兑换成ETH的交易(当兑换比率被攻击者操纵至对其有利的水平时)。
攻击者利用该漏洞耗尽了Uniswap流动性池中的ETH-imBTC(约有1278个ETH)。
下图为Lendf.Me的恶意攻击,由于在存入函数中,Lendf.Me中的“supply()”函数被嵌入一个额外的提现(withdraw())函数钩子(hook),这导致攻击者可以在不实际存入资产的情况下,伪造其imBTC抵押品余额的内部记录。
攻击者首先向Lendf.Me提供了确定数量的imBTC(即289.999999999 imBTC)。然而在第二个“supply()”中,攻击者仅实际提供了0.000000001个imBTC,并且其后来通过“withdraw()”的钩子又取出了290 imBTC(攻击者黑入了“dotransferIn()”中“imBTC:transferFrom()”的调用——1583行)。从而使得290imBTC在钩子函数“withdraw()”中从攻击者的余额中成功扣除。然而,当代码又回执至“supply”时,余额又被重置为290imBTC(1599行)。这就是攻击者如何在lendf.Me中操纵imBTC抵押品余额数量的内在逻辑。通过多次上述操作,攻击者将其在Lendf.Me中的imBTC内部记录刷到了足够从多个流动池(总资产价值为25,236,849.44美元)中借出可用的10多种资产。
Lendf.Me黑客事件对于当前的DeFi社区而言确实是一个打击。在下面的图片中我们收集了在该事件中各项资产的损失额数据。