mt logoMyToken
Market cap:
0%
FGI:
0%
Cryptocurrencies:--
Exchanges --
ETH Gas:--
EN
USD
APP
Ap Store QR Code

Scan Download

DeFi协议MIM_Spell遭黑客“偷袭” 损失超600万美元

Collect
Share

来源:Beosin

北京时间2024年1月30日,据Beosin旗下EagleEye安全风险监控、预警与阻断平台监测显示, DeFi协议MIM_Spell遭黑客闪电贷攻击,导致了超600万美元的损失。 目前攻击者将被盗资金兑换为ETH,并转移到两个攻击者地址上,Beosin KYT将对资金进行持续监控,同时我们对本次漏洞进行了分析。

漏洞分析

该事件发生的主要原因是 攻击者利用了项目方合约使用了向上取整的算法,并且控制了参数为1,将向上取整的误差控制的最大,从而导致账本失衡。

合约存在两个函数,分别是borrow和repay,一个是向合约借钱,一个是还钱给合约。

Borrow函数将指定借款数额,并且通过比例转换计算出债务值,更新到调用者的总债务值。如下图,这里合约的add算法采用了向上取整。

Borrow函数将指定还款债务值,并且通过比例转换计算出还款数额,将还款数额转移到本合约。如下图,这里合约的sub算法依然采用了向上取整。

了解了借款和还款的过程,我们来看看黑客是如何利用该漏洞的。

黑客先将合约的借款数额与债务值控制为了0与97(如何控制将在下一节介绍)。

接下来不停调用borrow和repay函数,并且借款和还款数值都为1,最后将借款数额与债务值控制为了0和120080183810681886665215049728,导致比例严重失衡。

根据上述代码规则(elastic=0,base=97),当攻击者调用一次borrow并传入1时,两个账本将变为elastic=1、base=98(elastic为0时,将按数值同步增加),再次调用一次borrow并传入1时,将变成elastic=2、base=196(elastic不为0时,将按比例同步增加)。

接下来攻击者调用repay函数传入1,将调用sub函数,此时计算出来的elastic应该等于1*1/196=>0,但是算法向上取整,导致计算出来elastic=1,结果将变成elastic=1、base=195。可以看到,此时elastic不变,base却翻倍。

攻击者通过多次上述方式,将elastic=0、base=120080183810681886665215049728。最终通过一笔borrow将合约500多万MIM借贷出来。

攻击流程

明白了函数问题点,我们来看看攻击者是如何实施攻击的(其中一笔交易为例)。

1.攻击者首先借贷了30万枚MIM。

2.随后,攻击者在回调函数中查询借款数额与债务值,可以看到,此时为24万和23万。

3.接下来攻击者调用repayForAll函数,归还了24万MIM代币,将elastic控制得极小。

4.接下来,攻击者通过repay函数归还了其他用户的负债,最终将借款数额与债务值控制为了0与97。

5.攻击者新创建合约,并通过上诉borrow与repay的方式,将借款数额与债务值控制为了0和120080183810681886665215049728。

6.最终通过一笔borrow将500万MIM借贷出来,并归还闪电贷。

资金追踪

截止发稿,被盗的超600万美元的资金,全部被攻击者兑换为了ETH,并且一直分散存在黑客地址未移动,Beosin KYT反洗钱平台将对资金进行持续监控。

 

Disclaimer: The copyright of this article belongs to the original author and does not represent MyToken(www.mytokencap.com)Opinions and positions; please contact us if you have questions about content