前言

BEVO代币是一种Reflection Token(反射型代币),并且拥有通缩的特性。关于Reflection Token更为详细的说明可参考这篇文章。然后目前浏览到的很多分析报告没有指出其漏洞产生的真正原因,所以就自己试着去做一下分析吧。

相关信息

攻击过程分析

整个攻击过程很简单:

  1. 首先闪电贷借出大量的WBNB
  2. 通过池子换出大量BEVO
  3. 调用deliver函数消耗所有的BEVO
  4. 调用skim函数,获得比在deliver函数中所消耗的更多的BEVO
  5. 调用swap函数获得超额的WBNB

每一步都是正常的操作,但是最后的结果就是攻击者成功获利了。背后漏洞的成因还有点绕,接下来详细分析。

函数流程对比

由于BEVOToken是基于ReflectionToken进行修改的版本,而原版的反射代币执行这个简单的deliver+skim操作是安全的。那么我们将原版的ReflectionToken与魔改后的BEVOToken的_transferStandard函数进行一个对比(该函数在transfer的过程中要用到)。

REFLECT.sol(Original)

_transferStandard 流程

  1. 通过_getValues函数,基于tAmount计算出所有后续要用到的tAmount和rAmount,包括Fee和TransferAmount
  2. 登记rTransferAmount的转账:sender账户减少,recipient账户增加。
  3. 然后将Fee燃烧掉:从rTotal中减去rFee

CoinToken.sol(BEVO)

_transferStandard 流程

  1. 通过_getValues函数,基于tAmount计算出所有后续要用到的tAmount和rAmount,包括Fee,Burn,Charity和TransferAmount
  2. 通过_standardTransferContent函数,登记rTransferAmount的转账:sender账户减少,recipient账户增加。
  3. 调用_sendToCharity函数,将Charity值增加到FeeAddress账户中
  4. 调用_reflectFee函数,从rTotal中减去rCharity,rFee,rBurn。从tTotal中减去tBurn。

BEVO机制漏洞

盈利的条件

先来了解一个前置条件,假设不收取任何费用的情况下,要通过deliver+skim这两个操作进行盈利,则需要要求skim得到的rAmount大于deliver掉的rAmount值。表示为rSkim > rDeliver。

公式推导为:

  1. [1]rPair = tPair * (rTotal / tTotal)
  2. deliver操作
  3. [2]rPair2 = tPair * (rTotal - rDeliver) / tTotal
  4. [3]rSkim = rPair2 - rPair
  5. 若要求[4]rSkim > rDeliver,将公式1,2,3代入公式4
  6. 得[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。

这里就出现了问题:

  1. 如果BEVO只是将rCharity从rTotal中减去,则效果类似于deliver和Fee的燃烧。
  2. 如果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代币攻击事件分析的更多相关文章

  1. AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程

    AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程 0x00 项目简述 Ammbr主要目标是打造具有高度弹性且易于连接的分布式宽带接入平台,同时降低上网相关成本.Ammbr打算创建具有人工智能和智 ...

  2. 孟加拉央行SWIFT攻击事件恶意木马分析(转)

    第一章 分析概述 该恶意木马样本为运行于winodws平台上的PE文件(名称:evtdiag.exe).文件大小为64KB,编译时间是2016年2月5日. 经分析,该样本为定制的攻击SWIFT客户端程 ...

  3. 证券化代币的时代已经到来,STO将引爆区块链经济

    STOs 似乎会在 2019 年取代 ICOs,即使不是完全取代,但置换的比例也会相当大.所有在美上市的公司都将按照 SEC 制定的相关规定进行交易.Vellum Capital 的 CEO 兼管理合 ...

  4. 剖析非同质化代币ERC721-全面解析ERC721标准

    什么是ERC-721?现在我们看到的各种加密猫猫狗狗都是基于ERC-721创造出来的,每只都是一个独一无二的ERC-721代币,不过ERC-721在区块链世界远不止猫猫狗狗,它更大的想象空间在于将物理 ...

  5. 用solidity语言开发代币智能合约

    智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发 ...

  6. 以太坊ERC20代币开发

    以太坊ERC20代币开发首先需要对以太坊,代币,ERC20,智能合约等以太坊代币开发中的基本概念有了解.根据我们的示例代码就可以发行自己的以太坊代币. 什么是ERC20 可以把ERC20简单理解成以太 ...

  7. 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, ...

  8. 007_ip统计及攻击ip分析

    线上经常有被扫描的DDoS攻击事件,需要集合日志进行分析,这里有两种方法,分别是通过shell和python的方式. 一.shell '''<1>shell一句命令分析 http://bl ...

  9. 以太坊钱包开发系列4 - 发送Token(代币)

    以太坊去中心化网页钱包开发系列,将从零开始开发出一个可以实际使用的钱包,本系列文章是理论与实战相结合,一共有四篇:创建钱包账号.账号Keystore文件导入导出.展示钱包信息及发起签名交易.发送Tok ...

  10. 以太坊ERC20代币合约案例

    一.ERC20代币合约与web3调用 ERC20代币合约在小白看来觉得很高大上,但其实就是一个代币的定义标准,方便其他dapp统一调用各种代币的方法.如图: 二.ERC20合约标准 [官方链接] co ...

随机推荐

  1. 批量IP 查询脚本

    脚本简单,找到一个免费的IP 查询接口不容易 #-*-coding:utf-8-*- import requests import csv import re header = { 'User-Age ...

  2. A better jump —— 优化游戏中的跳跃

    之前一提起角色的跳跃,想当然的想法就是:给角色一个向上的初速,然后由Unity的物理系统接管就好了嘛,这样忽略空气摩擦的影响,根据重力加速度,角色向上跳到最高点的时间和由最高点落下的时间相等,不是很合 ...

  3. 安卓自动化查看包名和activity名的方法

    1,cmd下,adb shell "dumpsys window | grep mCurrentFocus" 2,CMD中输入adb logcat ActivityManager: ...

  4. JS中报错处理 try catch finally的使用

    JS中标准报错处理通过 try catch finally ,使用格式 try { } catch (err) { } finally { } 代码1: try { console.log('顺序 1 ...

  5. ChatGPT的那些事 -1- 背景资料

    ChatGPT的那些事 -1- 背景资料 多处搬运,学无止境 目     录 1  关键词 1 1.1.  AIGC(百度百科) 1 1.2.  AlphaGo(百度百科) 1 1.3.  ChatG ...

  6. vue3-使用百度地图遇到的坑-地图实例化

    1.创建地图实例 原因:在使用vue3为了只定义一次地图实例,在所有方法中使用,直接使用如下定义方式: setup() { const data = reactive({ bmap: null,}) ...

  7. 继承和组合关系: is a & has a

    继承:is-a 比如 营销人员类 和 开发人员类 都继承自 职工类,营销人员 is-a 职工.组合:has-a 比如 汽车类 包含一个 发动机类 的对象,汽车 has-a 发动机.

  8. 解密Prompt系列3. 冻结LM微调Prompt: Prefix-Tuning & Prompt-Tuning & P-Tuning

    这一章我们介绍在下游任务微调中固定LM参数,只微调Prompt的相关模型.这类模型的优势很直观就是微调的参数量小,能大幅降低LLM的微调参数量,是轻量级的微调替代品.和前两章微调LM和全部冻结的pro ...

  9. 文件上传 upload-labs Pass-18 条件竞争

    Pass-18 条件竞争 审计源码 $is_upload = false; $msg = null; if(isset($_POST['submit'])){ $ext_arr = array('jp ...

  10. Redis中 HyperLogLog数据类型使用总结

    转载请注明出处: 目录 1. HyperLogLog 的原理 2.使用步骤 3.实现请求ip去重的浏览量使用示例 4.Jedis客户端使用 5.Redission使用依赖 6.HyperLogLog ...