北京时间2020年08月05日,DeFi 期权平台 Opyn 的看跌期权(Opyn ETH Put)智能合约遭到黑客攻击,损失约37万美元。
Opyn 是一个通用期权协议,于今年2月份转型为保险平台,通过 oTokens 为 DeFi 平台提供可交易的 ETH 看跌期权,以此锚定 ETH 市场价格,为高波动性的 DeFi 市场提供相对的稳定性。
PeckShield 安全团队获悉 Opyn 平台遭受攻击后,迅速定位到问题关键点在于:
攻击者发现?Opyn 智能合约行权(exercise)接口对接收到的 ETH 存在某些处理缺陷,其合约并没有对交易者的实时交易额进行检验,使得攻击者可以在一笔对自己发起真实的交易之后,再插入一笔伪装交易得卖方所抵押的数字资产,进而实现空手套白狼。
简单来说,由于 Opyn ETH Put 智能合约中的行权函数 exercise() 没有对交易者的ETH 进行实时校验。根据 Opyn 平台的业务逻辑,看跌期权的买方给卖方转移相应价值的 ETH,即可获得卖方抵押的数字资产。狡猾的攻击者,先向自己发起伪装的交易,利用这笔 ETH 可以重复使用的特性,再次向卖方用户发起转账,进而取卖方已经抵押的数字资产。
元宇宙基础设施平台InfiniteWorld拟通过SPAC方式上市募集1.45亿美元:8月4日消息,元宇宙基础设施平台 InfiniteWorld 计划通过 SPAC(特殊目的收购公司)方式上市,该公司希望与 Aries I Acquisition Corporation(RAM)一同进行 SPAC,并在公开市场筹集 1.45 亿美元。
此外,InfiniteWorld 还宣布收购游戏工作室 Super Bit Machine,但具体收购金额暂未对外披露。Super Bit Machine 拥有围绕游戏和游戏基础设施的可扩展技术,本次收购将提升 InfiniteWorld 为品牌客户提供 Web3 体验和虚拟世界服务。(venturebeat)[2022/8/5 12:03:16]
下面为您详细分析漏洞原因及攻击过程。
漏洞详细过程分析
先来说说,Opyn 平台的业务逻辑:当用户使用 Opyn 合约行权即买卖期货(exercise)时,需要买方向卖方转入相应数量的 ETH 或者 ERC20 Token,然后合约将销毁买方对应的 oToken,而后买方将获得卖方已经抵押的资产。
例如:小王认为行情进入了下跌趋势,看到 Opyn 上挂着一个小李对 ETH 330美元的看跌期权,于是进入交易系统,向小李转账一个 ETH,获得小李抵押的等额数字资产。若此刻行情已经跌至了300美元,小王便可获得其中的差价。
图1. exercise() 函数中循环执行传入的 vaults 地址列表
如上面的合约代码片段所示,行权函数 exercise() 的内部是一个循环,依据参数中传递的 vaultsToExerciseFrom 中的地址数量依次调用真正的行权逻辑 _exercise() 函数。
图2. 重用传入合约的 ETH 来获得抵押资产
函数处理 ERC20 Token 时,和大部分的 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 购入了 75 oETH 为进一步调用函数行权做好筹备;2、攻击者创建了一个 Vault 地址,作为看空期权卖方,并且抵押24,750 USDC 铸造出75 oETH,但并未卖出这些期权,等于自己同时买入了以 330 的价格卖出75 ETH 的权利;3、攻击者在 Opyn 合约中调用了 exercise(),在持有 150 oETH 看空期权的情况下,先向自己的 Vault 地址转入了75个 ETH,获得自己事先抵押的 24,750 个 USDC,再重利用了这75个 ETH,成功吃掉了另一个用户的 24,750 个 USDC,进而实现非法获利。
修复建议
PeckShield 安全团队建议,在 Solidity 中,合约可使用一个局部变量 msgValue 来保存所收到 ETH(即 msg.value 的值)。这样,在后续的步骤中通过操作 msgValue ,就能准确的标记有多少 ETH 已经被花费,进而避免资产被重复利用。此外,我们还可以使用 address(this).balance 来检查合约余额来规避 msg.value 被重复使用的风险。
红薯刚种下,就得挖出来了? 今日DeFi领域再次发生一起魔幻事件,呼声极高的红薯项目一经上线,流动性矿工们就开始疯狂涌入。短短8个小时内,Yam Finance中锁仓总价值就超过2亿美元。COMP挖矿带动了DeFi产业出圈,而YAM直接带动了DeFi头部项目集体上涨,堪称“一飞冲天”。 然而短短36小时内,眼见它高楼起,高楼塌。
据金色财经报道,北京时间8月4日21时,以太坊2.0多客户端测试网络Medalla已正式启动,共有5个客户端参与Medalla的创世。
7月22日,最高人民法院联合国家发展和改革委员会共同举行新闻发布会,发布《最高人民法院 国家发展和改革委员会关于为新时代加快完善社会主义市场经济体制提供司法服务和保障的意见》(以下简称《意见》)。《意见》明确“加强对数字货币、网络虚拟财产、数据等新型权益的保护,充分发挥司法裁判对产权保护的价值引领作用”。
我们知道,我们需要三分之二以上的验证者才能正确遵守协议。但是究竟有多少个验证者?他们是如何选择的?他们为什么要遵守规则? 为了使验证者知道一个区块具有超过三分之二的协议,GRANDPA需要知道总共有多少个验证者。该链的治理流程设置(并可以更改)数量,但目标是至少有1,000个验证者在Polkadot中运行BABE和GRANDPA。
Uniswap有点火。 这个项目声名鹊起,还是在2019年的悉尼开发者大会前后,听去参会的以太坊社区项目描述, 在会上看到了Uniswap,认为未来会是一个新黑马,这时候记得比较有意思的是币安和Uniswap的一笔交易出了问题,最开始把问题归咎于Uniswap的pool,而最后确认问题是出在了币安身上。
疑惑、犹豫、兴奋,所有的情绪交杂在一起,渐渐发酵、升腾,随着DeFi一波又一波的行情,一路向上,它们终于爆发了。 老陆,这一波DeFi行情的绝对受益者。 从2018年的Maker DAO、Compound到现在的流动性挖矿,老陆可以说是参与了DeFi的全过程。