宇宙链 宇宙链
Ctrl+D收藏宇宙链

首发 | DeFi平台Opyn智能合约漏洞详解 攻击者空手套白狼

作者:

时间:1900/1/1 0:00:00

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

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

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

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

百度Apollo首发 “Apollo 001”系列纪念数字藏品:金色财经报道,据百度Apollo智能驾驶官方公众号,百度Apollo全网首发首款 “Apollo 001”系列纪念数字藏品,以百度汽车机器人为主体形象,每款对应一个百度Apollo自动驾驶重要里程碑事件。据悉,该数字藏品将于2022年7月8日 09:55发布汽车机器人家族全家福空投款。[2022/7/7 1:58:19]

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

LBank蓝贝壳于4月9日16:50首发 BOSON:据官方公告,4月9日16:50,LBank蓝贝壳首发BOSON(Boson Protocol),开放USDT交易,4月9日16:00开放充值,4月12日16:00开放提现。上线同一时间开启充值交易BOSON瓜分10,000 USDT。

LBank蓝贝壳于4月9日16:50开启充值交易BOSON瓜分10,000 USDT。用户净充值数量不少于1枚BOSON ,可按净充值量获得等值1%的BOSON的USDT空投奖励;交易赛将根据用户的BOSON交易量进行排名,前30名可按个人交易量占比瓜分USDT。详情请点击官方公告。[2021/4/9 20:02:26]

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

漏洞详细过程分析

《精灵达人3D》正式首发 Cocos-BCX 主网:据官方消息,近日,由生态合伙人 DAPPX 参与开发的《精灵达人3D》正式首发于游戏公链 Cocos-BCX 主网。《精灵达人3D》是一款以精灵宝可梦为题材的抓宠游戏,游戏美术采用全3D 制作。用户可通过 CocosWallet , DAPPX 或 IMCOCOS 登录 COCOS 主网账号即可体验。截至目前,Cocos-BCX 主网已上线《加密骑士团》《恶龙必须死》《XPEX怪兽世界》《Go Block》《可可夺币》《熊猫运动会》等多款玩法多样的趣味性链游,游戏公链生态在逐步壮大和完善。[2020/8/20]

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

公告 | 火币全球站6月29日16:00全球首发 Project PAI:火币全球站定于新加坡时间6月29日16:00 Project PAI (PAI) 充值业务。7月2日16:00在创新区开放PAI/BTC, PAI/ETH交易。7月6日16:00开放 PAI提现业务。[2018/6/29]

例如:小王认为行情进入了下跌趋势,看到 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 被重复使用的风险。

标签:ETHPYNOPYOpynethleneLOVESNOOPY币Opyn Squeeth

以太坊价格热门资讯
比特币活跃地址数量达到两年来的最高水平 说明什么?

在所谓的比特币牛市中,本周比特币网络上的有效地址数量已达到逾100万的高位。来自分析公司Glassnode的数据显示,这是自2018年1月以来记录的最大活跃地址数量。数据基于7天移动平均值,该平均值是7天周期内活动地址的总和除以天数.

1900/1/1 0:00:00
金色观察丨yearn.finance上托管资金真的安全吗?

金色财经 区块链8月10日讯  DeFi收益聚合平台yearn.finance在今年七月中旬发行了治理代币YFI,该代币因为发行公平且分配广泛而受到社区称赞,yearn.finance也因此人气暴涨.

1900/1/1 0:00:00
谷燕西:从计划上市的Coinbase看未来的数字资产交易所

美国的加密数字货币交易服务交易平台Coinbase现在正在美国申请上市。Coinbase成立了8年,在全球范围内其加密数字货币的交易量是排名第三。它的40%的交易量的是来自于同一个交易产品,也就是比特币.

1900/1/1 0:00:00
Filecoin技术分析:深入理解存储管理

Filecoin的存储单元称为扇区(Sector)。对传统硬盘结构理解的小伙伴,对这个术语应该比较亲切,传统硬盘的最小存储单元就叫Sector.

1900/1/1 0:00:00
晚间必读5篇 | DeFi崛起对中心化交易所意味着什么?

BCH再闹分叉:社区反响激烈 币价平平今日,币圈博主“Bitcoin”爆料,ViaBTC矿池CEO杨海坡将发起对BCH的再一次分叉,新的分叉链代码为BCC.

1900/1/1 0:00:00
一问了解7月全球区块链要闻、投融资情况

为更好了解全球区块链产业2020年7月发展状况,01区块链联合零壹智库、数字资产研究院,从区块链投融资、主流加密数字货币行情、政策导向、国内产业发展动态及全球要闻等维度,“解密”区块链产业的最新趋势.

1900/1/1 0:00:00