根据慢雾安全团队的分析,2020年11月17日,以太坊DeFi项目OUSD遭受闪电贷攻击。慢雾安全团队在第一时间跟进并进行了相关分析。 OriginDollar(OUSD)是由OriginProtocol(OUSD)创建的新型ERC-20稳定币。当OriginDollar仍保留在钱包中时,它会自动从DeFi协议中获得有竞争力的收益。OUSD以1:1的比例支持USDT、USDC和DAI等其他稳定币。
攻击流程简析: 1. 攻击者使用dydx闪电贷借出70000个ETH,并通过Uniswap将其兑换为USDT和DAI。 2. 攻击者调用OUSDVault的mint函数,Vault会先进行一次rebase将之前积累的奖励进行分配,随后将750万USDT从攻击者合约转入OUSDVault中。OUSD合约会铸出等量的750万OUSD代币给攻击合约,并通过allocate来结算当前的收益。 3. 在攻击者转入750万之前,Vault的价值约为7018138美元。攻击者转入750万USDT后将占Vault总价值的一半以上。 4. 攻击合约利用mintMultiple函数传入DAI合约地址与攻击合约的地址,同样是先进行一次rebase,将之前累计的收益进行分配(包含先前转入的750万USDT部分),再通过transferFrom将攻击合约的2050万DAI转入Vault中。随后调用攻击合约的transferFrom函数,在该函数中构造再次调用Vault合约mint函数的逻辑来实现重入攻击。 5. 在上一步转入2050万DAI后,攻击合约再次调用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的收益。重入结束后,继续通过oUSD.mint铸造之前转入的2050万DAI等值的OUSD代币。 7. 最后,Vault的总价值约为3501万美元,但攻击者所拥有的价值超过3825万美元,因此攻击者用大部分的OUSD去Vault进行赎回操作,将Vault基本提空,剩余的OUSD则通过Uniswap和Sushiswap的OUSD-USDT池将OUSD换成USDT来增加收益。
总结: 此次攻击关键在于调用外部合约造成的重入问题与Vault的rebase收益分配机制相结合,导致攻击者可以通过重入来凭空获得巨额的收益分配。慢雾安全团队建议对传入资产进行检查后,对不在白名单内的资产直接进行回滚,并使用防重入锁以避免重入攻击。
相关链接: 参考攻击交易:0xe1c76241dda7c5fcf1988454c621142495640e708e3f8377982f55f8cf2a8401