shield|详细了解Cream.Finance的ERC777重入攻击

8月30日,派盾发出预警,CreamFinance遭遇闪电贷攻击,攻击者利用漏洞共计获利5890ETH(约合1880万美元)。
【 shield|详细了解Cream.Finance的ERC777重入攻击】原文标题:《经典再现|详解Cream.Finance的ERC777重入攻击》
原文作者:PeckShield
shield|详细了解Cream.Finance的ERC777重入攻击
文章插图
8月30日,Cream.Finance遭到重入攻击,PeckShield「派盾」第一时间预警并定位。
由于AMP支持类似ERC-777的代币标准,而它的特性与某些协议不相兼容,此次Cream.Finance的重入攻击正是操纵了此漏洞。
攻击者总共发起来17笔攻击交易,PeckShield「派盾」简述其中一笔交易的攻击过程:
shield|详细了解Cream.Finance的ERC777重入攻击
文章插图
首先,攻击者创建攻击合约A,从UniSwapV2中借出闪电贷500WETH;
第二步,攻击者将所借500WETH质押到到Cream.Finance,获得24,172.2crETH;
第三步,攻击合约A利用第二步所获得的质押物,通过函数CErc20Delegator.borrow()借出1,948万AMP。同时,利用重入漏洞,在用户的信息未更新前,又借出crETH代币,获得355ETH。
shield|详细了解Cream.Finance的ERC777重入攻击
文章插图
第四步,攻击者创建攻击合约B,并将974万AMP代币从攻击合约A转入攻击合约B中。因为第三步的重入攻击,使得攻击合约A已经资不抵债。所以攻击者利用攻击合约B中的974万AMP,清算了攻击合约A,并获得9,068.6crETH。
第五步,攻击合约B赎回9,068.6crETH,获得187.58ETH;此时,合约B的balanceof()为187.58WETH;
第六步,合约B将187.58WETH转给合约A,并调用函数selfdestruct();合约A的余额为542.58ETH;
最终,攻击者归还闪电贷,获利1,880万美元。
防御方法
在进行代币交换的时候,先扣除用户的代币,再将ETH发送给用户。
多个合约进行交互的时候需要考虑DeFi业务组合可能存在的系统性风险问题,平台方不仅要确保在产品上线前有过硬的代码审计和漏洞排查,还要在不同产品做业务组合时考虑因各自不同业务逻辑而潜在的系统性风控问题。
原文链接

    推荐阅读