在_closePosition函数结束之后,第二阶段会调用_updateDebtAndCollateralIndex更新新的借贷利率。
这里面的总债务量攻击者通过前面的清算已经减少了一半。
由于.raftCollateralToken.setIndex这个质押资产的利率更新中使用了balanceof(address.This)作为参数传入,导致了攻击者通过闪电贷借入的6001个cbETH可以直接转入合约中进行控制。可以看到这6003个cbETH的总量有6001个都是未更新的。
而在代币cbETH的setIndex函数中虽然有权限控制,新的利率是由攻击者操控的backingAmount除代币总量进行计算,攻击者通过被攻击合约(IRPM)的权限,并传入异常的参数,导致这个storedIndex扩大到67*10^36(扩大67*10^18)。
2.在抵押率被操控之后攻击者通过另一个攻击合约0xfdc0feaam进行多笔cbETH铸造rcbETH-c。这里的铸币函数是采用的向上取整的方式,由于上面storedIndex扩大了67*10^18,会导致铸币数量缩小67*10^18倍,但由于铸币函数是采用的向上取整的方式,使得本该按1:1/(67*10^18)比例铸币变成了1:1来铸币,相当于抵押品价值扩大了67*10^18倍。 (责任编辑:admin1) |