close
正在加载
DeFi协议MIM_Spell遭黑客“偷袭” 损失超600万美元
互联网 · 2024-01-31 13:46:01
币界网报道:

来源: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反洗钱平台将对资金进行持续监控。


s_logo
App内打开