北京时间2020年8月5日,DeFi期权平台opyn put的智能合约遭到黑客攻击,损失约37万美元。
Opyn是一个普通期权协议,今年2月被转变为一个保险平台。它通过otokens为DeFi平台提供可交易的ETH看跌期权,从而锚定ETH市场的价格,为高度动荡的DeFio市场提供相对稳定的价格。
在得知opyn平台受到攻击后,peckshield安全团队迅速发现问题如下:
攻击者发现opyn智能合约执行界面在收到的ETH上存在一些处理缺陷,其合约没有检查交易员的实时交易量,因此攻击者可以在发起真实交易后插入伪装交易,欺骗卖家的数字资产,然后认识空手白狼。
简而言之,opyn ETH put art contract中的exERCise()不会实时检查交易员的ETH。根据opyn平台的业务逻辑,看跌期权买方可以通过向卖方转让相应价值的ETH获得卖方抵押的数字资产。狡猾的攻击者首先向自己发起伪装交易,然后利用ETH的可重用特性再次向卖家的用户转账,然后骗取卖家抵押的数字资产。
下面详细分析了漏洞产生的原因和攻击过程。
,
漏洞详细流程分析
首先,我们来谈谈opyn平台的业务逻辑:当用户使用opyn合约来行使自己的权利,即进行期货交易时,买方需要将相应金额的ETH或ERC20代币转让给卖方,然后合同将摧毁买方对应的otoken,买方就获得了资产由卖方抵押。
例如:小王认为市场已经进入下行趋势。他看到小李在opyn上有一个对ETH330的看跌期权,于是他进入交易系统,将以太坊转让给小李,并获得相当于小李抵押的数字资产。如果目前市场已经跌到300美元,小王就能拿到差价。
图1。在exERCise()函数中遍历传入保险库地址列表
如上面的契约代码片段所示,exERCise()函数的内部是一个循环,它根据参数_ExERCiseFrom中传递的vaultsToExERCiseFrom中的地址数依次调用实际的练习逻辑。
图2。重新使用传入合同的ETH以获得抵押资产
在处理ERC20代币时,函数使用transferfrom(),如第1882行所示,就像大多数DeFi项目一样消息发送者转到地址(this)。
但是,当函数处理的资产是ETH时,处理方法就完全不同了。因为在坚固性上,消息值这意味着,当调用带有payment的接口时,合同调用者转移到合同中的ETH数量只是一个数量。因此,在合同代码第1879行中,检查消息值==AMT underyingtopay只能保证合同实际收到ingtopay下AMT的ETH金额,而没有消息值有任何效果。
但如上所述,在exERCise()中,它在循环中被调用,exERCise()函数使契约只接收一次ETH,可以在循环期间重用。
攻击点在这里。由于契约缺少一个测试ETH实时数的步骤,攻击者可以伪造一个指向自己的事务,然后重用花费的主体与平台的其他用户完成正常的事务。
图3。攻击交易分析
在图3中,我们通过bloxy浏览器显示的调用过程显示了攻击的过程。由于攻击者吃了很多订单,我们以其中一个事务为例,向您展示攻击逻辑
1攻击者首先从Uniswap购买了75个oETH,以准备进一步的调用功能练习;
2 2,攻击者创建了一个保险库地址作为做空期权卖方,并抵押了24750美元来铸造75 oETH,但没有出售这些期权,这意味着他购买了同时以330价格出售75 ETH的权利;
3.攻击者创建了一个保险库地址作为做空期权卖方,并抵押24750美元给cast 75 oETH,但没有在Opyn合同中出售这些期权,因此调用了exERCise()。在持有150oETH看跌期权的情况下,先将自己的金库地址转移到75ETH,获得其先前抵押的24750美元,然后重新使用75 ETH,又成功地吃掉了另一个用户的24750美元,实现了非法获利。
维修建议
peckshield安全团队建议,在SOLidity中,合同可以使用一个局部变量msgvalue来保存收到的ETH(即消息值的值)。这样,通过以下步骤对msgvalue的操作,我们可以准确地标记出花费了多少ETH,从而避免了资产的重复使用。另外,我们可以使用address(this)。余额核对合同余额避免消息值重复使用的风险。
文章标题:Defi平台opyn智能合约漏洞详情!
文章链接:https://www.btchangqing.cn/79574.html
更新时间:2021年06月12日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。