裂痕具体进程阐明
修复发起
简朴来说,由于 Opyn ETH Put 智能合约中的行权函数 exercise() 没有对生意业务者的ETH 举办及时校验。按照 Opyn 平台的业务逻辑,看跌期权的买方给卖方转移相应代价的 ETH,即可得到卖方抵押的数字资产。调皮的进攻者,先向本身提倡伪装的生意业务,操作这笔 ETH 可以反复利用的特性,再次向卖方用户提倡转账,进而骗取卖方已经抵押的数字资产。
图3. 进攻生意业务阐明
图1. exercise() 函数中轮回执行传入的 vaults 地点列表
如上面的合约代码片断所示,行权函数 exercise() 的内部是一个轮回,,依据参数中通报的 vaultsToExerciseFrom 中的地点数量依次挪用真正的行权逻辑 _exercise() 函数。进攻点就在这里,由于合约少了一步对 ETH 及时数量的检讨,使得进攻者可以先伪造一笔指向本身的生意业务,然后再把已经花掉的本金再次操作,僻静台其他用户完成一笔正常生意业务。
进攻者发明 Opyn 智能合约行权(exercise)接口对吸收到的 ETH 存在某些处理惩罚缺陷,其合约并没有对生意业务者的及时生意业务额举办检讨,使得进攻者可以在一笔对本身提倡真实的生意业务之后,再插入一笔伪装生意业务骗得卖方所抵押的数字资产,进而实现白手套白狼。
可是当函数处理惩罚的资产为 ETH 时,处理惩罚的方法就完全纷歧样了。因为在 Solidity 中,msg.value 的意思是合约挪用者在挪用具有 payable 接口时所转给该合约的 ETH 数量,仅是一个量值,所以在合约代码的 1879 行中,查抄 msg.value == amtUnderlyingToPay 仅能确保合约确实收到了 amtUnderlyingToPay 数量的 ETH,并不会对 msg.value 的值造成任何影响。
PeckShield 安详团队发起,在 Solidity 中,合约可利用一个局部变量 msgValue 来生存所收到 ETH(即 msg.value 的值)。这样,在后续的步调中通过操纵 msgValue ,就能精确的标志有几多 ETH 已经被耗费,进而制止资产被反复操作。另外,我们还可以利用 address(this).balance 来查抄合约余额来规避 msg.value 被反复利用的风险。
函数处理惩罚 ERC20 Token 时,和大部门的 DeFi 项目做法一样,利用 transferFrom(),如代码 1882 行所示,从 msg.sender 转账到 address(this)。
下面为您具体阐明裂痕原因及进攻进程。
譬喻:小王认为行情进入了下跌趋势,看到 Opyn 上挂着一个小李对 ETH 330美元的看跌期权,于是进入生意业务系统,向小李转账一个 ETH,得到小李抵押的等额数字资产。若而今行情已经跌至了300美元,小王便可得到个中的差价。
3、进攻者在 Opyn 合约中挪用了 exercise(),在持有 150 oETH 看空期权的环境下,先向本身的 Vault 地点转入了75个 ETH,得到本身事先抵押的 24,750 个 USDC,再重操作了这75个 ETH,乐成吃掉了另一个用户的 24,750 个 USDC,进而实现犯科赢利。
北京时间2020年08月05日,DeFi 期权平台 Opyn 的看跌期权(Opyn ETH Put)智能合约遭到黑客进攻,损失约37万美元。
2、进攻者建设了一个 Vault 地点,作为看空期权卖方,而且抵押24,750 USDC 锻造出75 oETH,但并未卖出这些期权,便是本身同时买入了以 330 的价值卖出75 ETH 的权利;
可是正如上面讲到的在 exercise() 中会轮回挪用 _exercise() 函数,这导致尽量合约实际只收到一次ETH,然而在轮回进程中却可以反复利用。
Opyn 是一个通用期权协议,于本年2月份转型为保险平台,通过 oTokens 为 DeFi 平台提供可生意业务的 ETH 看跌期权,以此锚定 ETH 市场价值,为高颠簸性的 DeFi 市场提供相对的不变性。
先来说说,Opyn 平台的业务逻辑:当用户利用 Opyn 合约行权即交易期货(exercise)时,需要买偏向卖方转入相应数量的 ETH 可能 ERC20 Token,然后合约将销毁买方对应的 oToken,尔后买方将得到卖方已经抵押的资产。
PeckShield 安详团队获悉 Opyn 平台蒙受进攻后,迅速定位到问题要害点在于:
图2. 重用传入合约的 ETH 来得到抵押资产
在图3中,我们通过 Bloxy 欣赏器显示的挪用进程来展示进攻的进程。由于进攻者吃掉了许多笔订单,我们以个中一笔生意业务为例,向各人展示其进攻逻辑:郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。