根据慢雾安全团队的分析,2020年11月17日,以太坊DeFi项目OUSD遭受了闪电贷攻击。慢雾安全团队第一时间进行了相关分析。下面是针对本次攻击的简要分析。详细的攻击过程分析将在稍后发布。如果您对此感兴趣,请持续关注。
背景提要: OriginDollar(OUSD)是由OriginProtocol(OUSD)创建的一种新型ERC-20稳定币。当该稳定币仍然存放在钱包中时,它会自动从DeFi协议中获取有竞争力的收益。OUSD是由USDT、USDC和DAI等其他稳定币以1:1的比例支持。
攻击流程简述: 1.攻击者使用dydx闪电贷借出70000个ETH,并通过Uniswap将其兑换为USDT和DAI。 2.攻击者调用OUSDVault的mint函数,Vault会先进行一次rebase,将之前积累的奖励进行分配,然后将750万USDT从攻击者的合约转入OUSDVault中。此时,OUSD合约会铸造出等量的750万OUSD代币给攻击合约,最后通过allocate函数结算当前的收益。 3.在攻击者转入750万USDT之前,Vault的价值约为7018138美元。攻击者转入750万USDT后,其占据Vault总价值的一半以上。 4.接着,攻击合约利用mintMultiple函数传入DAI合约地址和攻击合约地址,同样进行一次rebase,将之前累计的收益进行分配(包括之前转入的750万USDT部分),然后通过transferFrom函数将攻击合约的2050万DAI转入Vault中。接着,攻击合约调用自身的transferFrom函数,在其函数中构造再次调用Vault合约的mint函数的逻辑,从而实现重入攻击。 5.在前一步中转入2050万DAI后,通过攻击合约的transferFrom函数再次调用Vault的mint函数。由于重入时传入2000USDT符合触发rebase条件的判断,此时会进行一次rebase。重入攻击的原因是攻击者没有通过oUSD.mint函数进行铸币操作,并且攻击者在先前已将2050万DAI转入Vault中,导致Vault的总资产价值仍在增加。因此,Vault会认为增加的2050万DAI是收益部分,并进行rebase分配。由于在步骤3中,攻击者的资产已经占据Vault总价值的一半以上,所以攻击者会凭空获得超过1025万美元的收益分配。 6.接着,通过oUSD.mint进行铸造出2000个OUSD,并通过allocate函数结算重入时的2000USDT收益(从前一步可以看出,攻击合约传入的2000USDT只是为了满足触发rebase条件的需要)。重入结束后,攻击者仍然通过oUSD.mint铸造之前转入的2050万DAI相等的OUSD代币。 7.最后,Vault的总价值约为3501万美元,但攻击者所拥有的价值超过3825万美元。因此,攻击者使用大部分的OUSD从Vault中进行赎回操作,将Vault基本清空,然后将剩下的OUSD通过Uniswap和Sushiswap的OUSD-USDT池兑换成USDT,以增加收益。
总结: 此次攻击的关键在于利用外部合约调用引发的重入问题,并结合了Vault的rebase收益分配机制。这导致攻击者可以通过重入来非法获得巨额的收益分配。针对这种情况,慢雾安全团队建议在传入资产后进行检查,对不在白名单内的资产直接进行回滚,并使用防重入锁来避免重入攻击。
相关链接: 参考攻击交易:0xe1c76241dda7c5fcf1988454c621142495640e708e3f8377982f55f8cf2a8401