DeFi平台Opyn智能合约漏洞详解:攻击者空手套白狼!_GAS:OPY

北京时间2020年08月05日,DeFi期权平台Opyn的看跌期权智能合约遭到黑客攻击,损失约37万美元。

Opyn是一个通用期权协议,于今年2月份转型为保险平台,通过oTokens为DeFi平台提供可交易的ETH看跌期权,以此锚定ETH市场价格,为高波动性的DeFi市场提供相对的稳定性。

PeckShield安全团队获悉Opyn平台遭受攻击后,迅速定位到问题关键点在于:

攻击者发现?Opyn智能合约行权接口对接收到的ETH存在某些处理缺陷,其合约并没有对交易者的实时交易额进行检验,使得攻击者可以在一笔对自己发起真实的交易之后,再插入一笔伪装交易得卖方所抵押的数字资产,进而实现空手套白狼。

BNB Chain黑客地址当前余额超7亿美元:10月7日消息,据欧科云链链上卫士安全团队监测,被OKLink多链浏览器标记为“Hack”的BNB Chain被盗案黑客地址(0x489A开头),分别于今晨02:26:46、04:43:18收到200万枚BNB资金转入,随后将其中98万枚BNB转出至PancakeSwap(8万枚BNB)、Venus(90万枚BNB)。截至目前,该地址下余额有102万枚BNB、4128万枚vBNB、2881万枚BUSD、277万枚USDT,按当前市场价格计算,累计价值超7亿美元。此次黑客事件损失超过上次Ronin Network 6.2亿美元,是至今为止被黑金额最高的事件。关于此次被盗后续,欧科云链链上卫士团队还将进一步追踪案件细节并及时同步。

此前消息,BNB Chain官方桥Binance Bridge遭遇黑客攻击,约200万枚BNB被攻击者取出,价值5.66亿美元。[2022/10/7 18:41:30]

简单来说,由于OpynETHPut智能合约中的行权函数exercise()没有对交易者的ETH进行实时校验。根据Opyn平台的业务逻辑,看跌期权的买方给卖方转移相应价值的ETH,即可获得卖方抵押的数字资产。狡猾的攻击者,先向自己发起伪装的交易,利用这笔ETH可以重复使用的特性,再次向卖方用户发起转账,进而取卖方已经抵押的数字资产。

Michael Saylor:自MicroStrategy入场后BTC已增长83%,其股价上涨80%:金色财经报道,MicroStrategy首席执行官官迈克尔·塞勒(Michael Saylor)在社交媒体发文称,自从MicroStrategy于2020年8月启动购买比特币之后,该数字资产价格已增长83%,而MicroStrategy公司股价则上涨了近80%。迈克尔·塞勒还指出,相比于传统股票市场,比特币更具优势,数据显示自MicroStrategy入场后标准普尔指数仅上涨了 16%,纳斯达克 100 指数上涨了 6%,而作为比特币价值储存主要竞争对手的黄金下跌了 14%,白银下跌了 33%。[2022/7/9 2:02:23]

下面为您详细分析漏洞原因及攻击过程。

V神关注BCHA空快攻击事件,称PoS是必要的:11月28日,V神推特对BCHA空快攻击事件发表意见,称PoS是必要的,但还不够。目前这个在BCHA链上打空块的矿工已经扬言,任何只交税8%的区块都会被他孤立作废,只有交100%税的区块才不会被孤立。[2020/11/28 22:25:45]

漏洞详细过程分析

先来说说,Opyn平台的业务逻辑:当用户使用Opyn合约行权即买卖期货时,需要买方向卖方转入相应数量的ETH或者ERC20Token,然后合约将销毁买方对应的oToken,而后买方将获得卖方已经抵押的资产。

例如:小王认为行情进入了下跌趋势,看到Opyn上挂着一个小李对ETH330美元的看跌期权,于是进入交易系统,向小李转账一个ETH,获得小李抵押的等额数字资产。若此刻行情已经跌至了300美元,小王便可获得其中的差价。

ChainUP与EDA(企业数字资产)交易平台达成合作:据官方消息,近日ChainUP与EDA(企业数字资产)交易平台达成合作,ChainUP将为EDA(企业数字资产)平台提供技术与安全双重保障。

据介绍,EDA(Enterprise Digital Aassets)交易所是由福布斯全球排名32位的黄鸿年创办的基金会联合英国3i、Doll资本管理、雷德投资集团、Mayfield等多家机构共同创办的企业数字资产发行、交易、服务平台。日前,EDA(企业数字资产)交易所聚集了众多优质的中小型企业,线上用户过十万,已发展成为一个直通上下游用户的一站式财富共享平台。

ChainUP是区块链技术服务商,目前已为全球500多家客户提供了区块链技术服务,覆盖美国、英国、加拿大、澳大利亚、日本、新加坡、马来西亚、泰国等20多个国家和地区。[2020/7/10]

图1.exercise()?函数中循环执行传入的?vaults?地址列表

如上面的合约代码片段所示,行权函数exercise()的内部是一个循环,依据参数中传递的vaultsToExerciseFrom中的地址数量依次调用真正的行权逻辑_exercise()函数。

图2.重用传入合约的ETH来获得抵押资产

函数处理ERC20Token时,和大部分的DeFi项目做法一样,使用transferFrom(),如代码1882行所示,从msg.sender转账到address(this)。

但是当函数处理的资产为ETH时,处理的方式就完全不一样了。因为在Solidity中,msg.value的意思是合约调用者在调用具有payable接口时所转给该合约的ETH数量,仅是一个量值,所以在合约代码的1879行中,检查msg.value==amtUnderlyingToPay仅能确保合约确实收到了amtUnderlyingToPay数量的ETH,并不会对msg.value的值造成任何影响。

但是正如上面讲到的在exercise()中会循环调用_exercise()函数,这导致尽管合约实际只收到一次ETH,然而在循环过程中却可以重复使用。

攻击点就在这里,由于合约少了一步对ETH实时数量的检验,使得攻击者可以先伪造一笔指向自己的交易,然后再把已经花掉的本金再次利用,和平台其他用户完成一笔正常交易。

图3.?攻击交易分析

在图3中,我们通过Bloxy浏览器显示的调用过程来展示攻击的过程。由于攻击者吃掉了很多笔订单,我们以其中一笔交易为例,向大家展示其攻击逻辑:

1、攻击者先从Uniswap购入了75oETH为进一步调用函数行权做好筹备;

2、攻击者创建了一个Vault地址,作为看空期权卖方,并且抵押24,750USDC铸造出75oETH,但并未卖出这些期权,等于自己同时买入了以330的价格卖出75ETH的权利;

3、攻击者在Opyn合约中调用了exercise(),在持有150oETH看空期权的情况下,先向自己的Vault地址转入了75个ETH,获得自己事先抵押的24,750个USDC,再重利用了这75个ETH,成功吃掉了另一个用户的24,750个USDC,进而实现非法获利。

修复建议

PeckShield安全团队建议,在Solidity中,合约可使用一个局部变量msgValue来保存所收到ETH。这样,在后续的步骤中通过操作msgValue,就能准确的标记有多少ETH已经被花费,进而避免资产被重复利用。此外,我们还可以使用address(this).balance来检查合约余额来规避msg.value被重复使用的风险。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金宝趣谈

[0:31ms0-8:830ms