北京时间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() 的内部是一个循环,依据参数中传递的 vaultsToExERCiseFrom 中的地址数量依次调用真正的行权逻辑 _exERCise() 函数。
图2。重新使用传入合同的ETH以获得抵押资产
函数处理 ERC20 Token 时,和大部分的 DeFi 项目做法一样,使用 transferFrom(),如代码 1882 行所示,从 msg.sender 转账到 address(this)。
但是,当函数处理的资产是ETH时,处理方法就完全不同了。因为在坚固性上,消息值这意味着,当调用带有payment的接口时,合同调用者转移到合同中的ETH数量只是一个数量。因此,在合同代码第1879行中,检查消息值==AMT underyingtopay只能保证合同实际收到ingtopay下AMT的ETH金额,而没有消息值有任何效果。
但如上所述,在exERCise()中,它在循环中被调用,exERCise()函数使契约只接收一次ETH,可以在循环期间重用。
攻击点在这里。由于契约缺少一个测试ETH实时数的步骤,攻击者可以伪造一个指向自己的事务,然后重用花费的主体与平台的其他用户完成正常的事务。
图3。攻击交易分析
在图3中,我们通过 Bloxy 浏览器显示的调用过程来展示攻击的过程。由于攻击者吃掉了很多笔订单,我们以其中一笔交易为例,向大家展示其攻击逻辑:
2攻击者创建了一个金库地址作为做空期权卖方,并抵押24750美元给cast 75 oETH,但没有出售这些期权,这意味着他同时以330英镑购买了75 ETH的出售权;
3,攻击者调用了Opyn合同中的exERCise()。在持有150欧不记名期权后,她首先将她的金库地址转移到75 ETH,并获得了24750美元的先前抵押贷款。然后,她再次使用75以太坊,并成功吃掉另一用户的24750美元,从而实现非法获利。
维修建议
peckshield安全团队建议,在SOLidity中,合同可以使用一个局部变量msgvalue来保存收到的ETH(即消息值的值)。这样,通过以下步骤对msgvalue的操作,我们可以准确地标记出花费了多少ETH,从而避免了资产的重复使用。另外,我们可以使用address(this)。余额核对合同余额避免消息值重复使用的风险。
文章标题:Defi平台opyn智能合约漏洞详情:攻击者空手白狼!
文章链接:https://www.btchangqing.cn/79821.html
更新时间:2021年06月12日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。