【漏洞分析】ReflectionToken BEVO代币攻击事件分析
前言
BEVO代币是一种Reflection Token(反射型代币),并且拥有通缩的特性。关于Reflection Token更为详细的说明可参考这篇文章。然后目前浏览到的很多分析报告没有指出其漏洞产生的真正原因,所以就自己试着去做一下分析吧。
相关信息
- 攻击交易:https://explorer.phalcon.xyz/tx/bsc/0xb97502d3976322714c828a890857e776f25c79f187a32e2d548dda1c315d2a7d
- BEVO合约地址:https://bscscan.com/token/0xc6cb12df4520b7bf83f64c79c585b8462e18b6aa
- FeeAddress地址:https://bscscan.com/address/0x473141b6f5e33dd90bd653940a854b58e83451db
- FeeAddress地址通过Pair用BEVO兑换WBNB:https://bscscan.com/tx/0xc38c290d9139b2f30fbf65666854e09fdc0efe6368c810d4863b3031c93ebc37
攻击过程分析

整个攻击过程很简单:
- 首先闪电贷借出大量的WBNB
- 通过池子换出大量BEVO
- 调用deliver函数消耗所有的BEVO
- 调用skim函数,获得比在deliver函数中所消耗的更多的BEVO
- 调用swap函数获得超额的WBNB
每一步都是正常的操作,但是最后的结果就是攻击者成功获利了。背后漏洞的成因还有点绕,接下来详细分析。
函数流程对比
由于BEVOToken是基于ReflectionToken进行修改的版本,而原版的反射代币执行这个简单的deliver+skim操作是安全的。那么我们将原版的ReflectionToken与魔改后的BEVOToken的_transferStandard函数进行一个对比(该函数在transfer的过程中要用到)。
REFLECT.sol(Original)
_transferStandard 流程
- 通过_getValues函数,基于tAmount计算出所有后续要用到的tAmount和rAmount,包括Fee和TransferAmount
- 登记rTransferAmount的转账:sender账户减少,recipient账户增加。
- 然后将Fee燃烧掉:从rTotal中减去rFee
CoinToken.sol(BEVO)
_transferStandard 流程
- 通过_getValues函数,基于tAmount计算出所有后续要用到的tAmount和rAmount,包括Fee,Burn,Charity和TransferAmount
- 通过_standardTransferContent函数,登记rTransferAmount的转账:sender账户减少,recipient账户增加。
- 调用_sendToCharity函数,将Charity值增加到FeeAddress账户中。
- 调用_reflectFee函数,从rTotal中减去rCharity,rFee,rBurn。从tTotal中减去tBurn。
BEVO机制漏洞
盈利的条件
先来了解一个前置条件,假设不收取任何费用的情况下,要通过deliver+skim这两个操作进行盈利,则需要要求skim得到的rAmount大于deliver掉的rAmount值。表示为rSkim > rDeliver。
公式推导为:
- [1]
rPair = tPair * (rTotal / tTotal) - deliver操作
- [2]
rPair2 = tPair * (rTotal - rDeliver) / tTotal - [3]
rSkim = rPair2 - rPair - 若要求[4]
rSkim > rDeliver,将公式1,2,3代入公式4 - 得[5]
rDeliver > rTotal - rPair
而正常情况下,rTotal作为所有rAmount值的总和,自然可得rTotal >= rDeliver + rPair,调整后得[6]rDeliver <= rTotal - rPair。显然,公式5中的条件并不能满足,无法实现通过deliver+skim这两个操作进行盈利的目的。
那究竟发生了什么,打破了这种安全的场景。
奇怪的计算
在函数流程对比这一章节中有提到,BEVO调用_transferStandard转账的时候,会收取一个叫Charity的费用(1%)。收取这个费用的时候会将rCharity和tCharity增加到FeeAddress账户中,并且从rTotal中减去rCharity。
这里就出现了问题:
- 如果BEVO只是将rCharity从rTotal中减去,则效果类似于deliver和Fee的燃烧。
- 如果BEVO只是将rCharity和tCharity增加到FeeAddress账户中,则效果类似于转账。
但是它既将rCharity从rTotal中减去,又将rCharity和tCharity增加到FeeAddress账户中,这使得从rTotal的数值是不包括rAmount[FeeAddress]的,而FeeAddress地址上确实存在有一笔rAmount。这就有点像一笔本该销毁的资金,被FeeAddress偷偷藏了起来,这笔资金从rTotal账面上来看是销毁了,但是却被FeeAddress揣在了口袋里。
然后,如果这笔资金冻结在FeeAddress地址中不再流转,那么也不会对整个经济模型进行影响(就相当于deliver了)。但是,FeeAddress会用它手中的BEVO从Pair里兑换WBNB。这就使得了这笔不在rTotal范围内的资金流入了Pair地址中。
这会造成什么影响?
漏洞的成因
前面提到,FeeAddress会用它手中不合规的BEVO从Pair里兑换WBNB,从而使这笔不在rTotal范围内的资金rFeeAddress流入了Pair地址中。此时,将Pair池中的rAmount从新定义为[7]rPair2 = rPair + rFeeAddress。
这笔不在rTotal累加范围内的资金加入,使得代表盈利条件的公式5能够实现,由rDeliver > rTotal - rPair2,将公式7代入后调整可得[8]rDeliver + rFeeAddress > rTotal - rPair。
所以,攻击者首先借助闪电贷借出大量的BEVO代币,通过deliver操作,使得Pair中属于rFeeAddress的那部分的代币份额增大,从而执行skim操作的时候就能拿到超额的BEVO代币。最后归还闪电贷跑路。
后语
最近在学习ReflectionToken的相关内容,了解到了BEVO代币的安全事件,打算跟着网上的分析文章把细节摸清一下。但很可惜发现网上的分析文章都是浅尝辄止,一副懂的都懂不懂的我也不多说了的样子,看到攻击者deliver+skim获利了就断定是deliver导致rTotal减少,从而rate增大就获得了套利机会(其实赚不了)。然后我按照文章中的思路计算了两天死活就算不出来盈利(就让我多吐槽几句吧因为我真的手算了好多页纸硬是没算出来)。所以自己摸索着搞了一份分析,因为小老弟也是在学习的过程中,所以文章有可能有错的地方,还请各位师傅多多指点。感谢阅读!
【漏洞分析】ReflectionToken BEVO代币攻击事件分析的更多相关文章
- AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程
AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程 0x00 项目简述 Ammbr主要目标是打造具有高度弹性且易于连接的分布式宽带接入平台,同时降低上网相关成本.Ammbr打算创建具有人工智能和智 ...
- 孟加拉央行SWIFT攻击事件恶意木马分析(转)
第一章 分析概述 该恶意木马样本为运行于winodws平台上的PE文件(名称:evtdiag.exe).文件大小为64KB,编译时间是2016年2月5日. 经分析,该样本为定制的攻击SWIFT客户端程 ...
- 证券化代币的时代已经到来,STO将引爆区块链经济
STOs 似乎会在 2019 年取代 ICOs,即使不是完全取代,但置换的比例也会相当大.所有在美上市的公司都将按照 SEC 制定的相关规定进行交易.Vellum Capital 的 CEO 兼管理合 ...
- 剖析非同质化代币ERC721-全面解析ERC721标准
什么是ERC-721?现在我们看到的各种加密猫猫狗狗都是基于ERC-721创造出来的,每只都是一个独一无二的ERC-721代币,不过ERC-721在区块链世界远不止猫猫狗狗,它更大的想象空间在于将物理 ...
- 用solidity语言开发代币智能合约
智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发 ...
- 以太坊ERC20代币开发
以太坊ERC20代币开发首先需要对以太坊,代币,ERC20,智能合约等以太坊代币开发中的基本概念有了解.根据我们的示例代码就可以发行自己的以太坊代币. 什么是ERC20 可以把ERC20简单理解成以太 ...
- Go-Ethereum 1.7.2 结合 Mist 0.9.2 实现代币智能合约的实例
目录 目录 1.什么是 Mist 2.Mist 在哪里下载? 3.Mist 有哪些依赖? 4.如何安装 Mist? 4.1.安装 Mist 依赖工具包 4.2.安装 Mist 4.3.启动 Mist, ...
- 007_ip统计及攻击ip分析
线上经常有被扫描的DDoS攻击事件,需要集合日志进行分析,这里有两种方法,分别是通过shell和python的方式. 一.shell '''<1>shell一句命令分析 http://bl ...
- 以太坊钱包开发系列4 - 发送Token(代币)
以太坊去中心化网页钱包开发系列,将从零开始开发出一个可以实际使用的钱包,本系列文章是理论与实战相结合,一共有四篇:创建钱包账号.账号Keystore文件导入导出.展示钱包信息及发起签名交易.发送Tok ...
- 以太坊ERC20代币合约案例
一.ERC20代币合约与web3调用 ERC20代币合约在小白看来觉得很高大上,但其实就是一个代币的定义标准,方便其他dapp统一调用各种代币的方法.如图: 二.ERC20合约标准 [官方链接] co ...
随机推荐
- Spring bean注入问题:NoUniqueBeanDefinitionException解决方案归纳
引言 spring实现的bean自动注入在项目开发中是一个经常使用到的功能,但自动装配两个或多个bean时,会抛出NoUniqueBeanDefinitionException:No qualifyi ...
- DASCTF NOV X联合出题人-PWN
太忙了,下午4点才开始做,,剩下的以后补上 签个到 逻辑很简单两个功能的堆,一个就是申请heap.还有一个是检验如果校验通过就会得到flag 申请模块 中间0x886是个很恶心的东西,需要我们绕过 ...
- [复现]2021DASCTF实战精英夏令营暨DASCTF July X CBCTF-PWN
EasyHeap 想可执行的地方写入orw的shellcode,利用tcachebin的df进行劫持malloc_hook 然后调用add来触发. from pwn import * context. ...
- 用猿大师的VLC播放插件在高版本Chrome播放RTSP视频流,并抓图、录像、回放、倍速等
因为项目上需要把海康威视摄像头集成到WEB网页中播放,于是开始了对WEB播放摄像头方案的各种折腾. 2015年之前还可以用VLC原生播放器在Chrome.Firefox等浏览器中直接播放,延迟比较低, ...
- 微信小程序-顶部下拉菜单实现
最近写的小程序里面需要实现顶部下拉菜单的效果,做一个过滤操作,但是没有找到相关组件,所以动手写了一个. 先看一下这拙劣的效果叭~ 下面就直接看具体实现了嗷! index.wxml <view c ...
- vs2010 Windows程序打包成安装包方法
1. 在vs2010 选择"新建项目"--"其他项目类型"--"Visual Studio Installerà"安装项目": ...
- ESP32 IDF V5.0 编译环境
方法:环境搭建工具一键安装: 下载链接:https://dl.espressif.com/dl/esp-idf/ 可以选择离线安装方式和在线安装方式,建议:采用离线安装的方式 下载离线安装包之后点击安 ...
- 学会规则引擎Drools,让你早点下班
前言 现在有这么个需求,网上购物,需要根据不同的规则计算商品折扣,比如VIP客户增加5%的折扣,购买金额超过1000元的增加10%的折扣等,而且这些规则可能随时发生变化,甚至增加新的规则.面对这个需求 ...
- DecimalFormat--控制输出格式
DecimalFormat的相关应用 整数的实现: 小数的实现: 科学计数法: 分组分隔符: 举个例子吧!-- 关于前缀后缀: 本地化货币符号: 引用特殊的字符,作为前缀或者后缀: 实例来袭! 1.0 ...
- Linux & 标准C语言学习 <DAY4>
一.数据类型 为什么要对数据进行分类 1.现实中的数据就是自带类别属性的 2.对数据进行分类可以节约内存存储空间.提高运行速度 C语言中数据分为两大类别 ...