2024年1月30日,MIM_SPERT遭遇闪贷攻击。由于一个精确计算的漏洞,该项目损失了650万美元。

1.攻击时间分析

攻击者地址:

0x87F585809Ce79aE39A5fa0C7C96d0d159eb678C9

攻击合约:

0xe1091d17473b049cccd65c54f71677da85b77a45

0x13AF445F81B0DEcA5dCb2Be6A4C691F545c95912

0xe59b54a9e37ab69f6e9312a9b3f72539ee184e5a

被攻击的合约:

0x7259e152103756e1616A77Ae982353c3751A6a90

攻击事务处理:

0x26a83db7e28838dd9fee6fb7314ae58dcc6aee9a20bf224c386ff5e80f7e4cf2

0xdb4616b89ad82062787a4e924d520639791302476484b9a6eca5126f79b6d877

攻击过程:

(1).攻击者(0x87F58580)通过闪贷借了300,000个MIM代币。

(2)随后,240,000个MIM令牌被发送到受攻击的合同(0x7259e1520),用于下一步偿还用户的

(3).攻击者(0x87F58580)然后调用repayForAIl函数来偿还其他用户的贷款,然后调用revalve函数来重新支付其他用户的贷款以使弹性变量降为0。

(4).在弹性变量减为0之后,攻击者(0x87F58580)创建一个新的攻击契约(0xe59b54a9),并不断调用借入和偿还函数,直到elastic = 0且base=120080183810681886665215049728为止。

(5).然后攻击者(0x87F58580)调用DegenBox合同的借入函数和撤回函数借出5,000,047个MIM令牌。


(6).攻击者(0x87F58580)返回了闪贷功能,并将4,400,000 MIM代币兑换为1807ETH。这次交易的利润约为450W。

2.漏洞分析

攻击的实质是在计算贷款变量时存在一个准确性问题,导致关键变量的弹性和基数被操纵,比例失衡,导致在计算抵押品和贷款金额时出现问题,最终导致MIM令牌过度借贷。

受攻击的合约(0x7259e1520)中的借入函数和偿还函数在计算弹性变量和基础变量时都使用向上舍入的方法。

攻击者(0x87F58580)首先通过偿还其他用户的贷款,将elastic 变量和base 变量分别设置为0和97。

然后连续调用借入函数和归还函数,参数金额均为1。当借入函数第一次被调用d时,因为elastic=0,上面的if逻辑将被执行并返回给add函数。这将导致elastic = 1, base = 98。

然后,攻击者(0x87F58580)调用借入函数并传入1。由于elastic=1,将执行else逻辑,计算得到的返回值为98。这样,当返回到add函数时,elastic=2,基本变量为196。

但此时攻击者(0x87F58580)调用repeat函数并传入1。由于elastic=2,将执行else逻辑。计算的弹性变量最初为1*2/98=0,但由于以下四舍五入的步骤,导致计算的返回值为1,因此当返回子函数时,弹性变量变回1,base 变量为195。

可以看出,在一个借款一偿还循环之后,弹性变量保持不变,而基础变量几乎增加了一倍。利用这一漏洞,黑客频繁循环借入-偿还功能,最后再次调用偿还,最终使elastic=0   base=120080183810681886665215049728

elastic 变量和base变量之间的比例严重不平衡时,攻击者(0x87F58580)可以通过加入少量的抵押品来通过限制,从而提供大量的MIM。

3.安全建议

针对这种攻击,我们在开发过程中应该遵循以下预防措施:

1.在开发与精度计算相关的逻辑时,请仔细考虑精度和舍入。

2.项目上线前,需要专业的第三方审计团队进行智能合约审计。