账户余额无故消失,Opyn合约为何被盗?

作者:成都链安

编者注:Opyn 自我定位为一个保护平台,但其核心是建立在「凸性协议」上的期权平台,是一个通用的期权协议。凸性协议具有相当大的可塑性——允许开发者创建各种不同参数的期权,例如 (1) 欧式与美式,(2) 标的资产,(3) 看涨或看跌 (4) 抵押品类型等。

前期提要:8月5日凌晨四点,有用户在Opyn论坛反馈自己的账户余额无故消失,并有用户发现可疑的交易信息,如下图所示:

Opyn项目方对情况初步分析后做出回应表示:已经转移了资金,并正在寻找问题原因。

事件发生后不久,官方再次发文回应此次事件称:

遭到黑客攻击,并已对可能遭受攻击的资产进行转移,但此次漏洞只涉及ETH合约,并不影响其他合约。

成都链安-安全实验室第一时间对本次事件进行跟踪分析,以下是态势感知系统检测到的攻击者合约地址:

0xe7870231992ab4b1a01814fa0a599115fe94203f

0xb837531bf4eb8ebfa3e20948bd14be067c18cbd3

0xb72e60ea1d0c04605f406c158dce9ac6ae6d224c

攻击者攻击方式还原:

  1. 攻击者调用合约向合约发送n个USDC增加抵押,并得到合约币oETH

  2. 攻击者调用合约发送ETH进行抵押,并销毁oETH以赎回自己的USDC

  3. 攻击者赎回自己抵押的ETH。

如下图所示:

在步骤二中,攻击者调用exercise函数,并向其传递了两个地址A(攻击者自己地址)、B(他人未赎回USDC的地址)和两倍自己应得的USDC,程序正常执行,这导致地址B的资金受损。

技术分析

0x56de6c4bd906ee0c067a332e64966db8b1e866c7965c044163a503de6ee6552a为例,攻击者通过合约0xe7870231992ab4b1a01814fa0a599115fe94203f对合约0x951D51bAeFb72319d9FBE941E1615938d89ABfe2发动攻击,此笔交易中共获利$9907。如下图所示:

攻击者首先调用了addERC20CollateralOption函数,向合约中发送了9900个USDC,如下图所示:

此函数中的addERC20Collateral(msg.sender, amtCollateral);负责代理转账USDC;函数中的issueOTokens(amtToCreate, receiver);负责铸币oETH,此笔交易铸币30个oETH并发送给了攻击者,如下图所示:

在此完成后,攻击者的vault参数进行了变化。vault.oTokensIssued和vault.collateral分别更新300000000和9900000000为如下图所示:

然后攻击者开始将oETH兑换出来。

调用exercise,构造参数oTokensToExercise为60,vaultsToExerciseFrom为两个地址,其中一个是也满足条件的他人地址。如下图所示:

Exercise函数运行_exercise(vault.oTokensIssued, vaultOwner);分支,将30oETH相应比例的USDC发送给调用者,如下图所示:

我们可以注意到,在最终转账时,_exercise是将USDC转给了msg.sender,也就是攻击者。

我们回头看exercise中存在者for循环,攻击者输入的oTokensToExercise为60,所以合约在验证了第二个地址符合条件的情况下,依旧会将余额转给msg.sender,也就是攻击者。这就使得攻击者可以获得两次USDC,从而获得利润。

总结建议

此次事件攻击者利用了exercise函数的逻辑缺陷。此函数在进行最后转账前并未验证调用者是否有权限赎回此地址的USDC,只是简单的验证了地址是否可以赎回。属于代码层的逻辑漏洞,并且根据官方回复,此合约是经过安全审计的。

在此提醒各项目方:

  1. 项目上线前应当进行足够有效的安全审计,最好是多方审计

  2. 对于合约的应当设置暂停合约交易等功能,在发生安全事件时,可以以保证资金安全

  3. 安全是一个持续的过程,绝非一次审计就能保平安

后续


Opyn官方8月5日最新发文,就平台漏洞导致ETH被盗事件作出更新:

我们对早期用户表示最大的尊重和同情,并希望我们的社区做出正确的事。我们将全额赔偿受漏洞影响的ETH看跌期权卖家。我们将在接下来的3天内提供更多详细信息的报销流程。对于ETH看跌期权买家,请按高于市场价20%的价格赎回看跌期权。对于所有用户,除非通过上述Opyn团队定义的过程,请不要创建任何新的oETH Put保险库或买卖oETH Put。


推荐阅读:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值