首页 > 其他分享 >【漏洞分析】Reflection Token 反射型代币攻击事件通用分析思路

【漏洞分析】Reflection Token 反射型代币攻击事件通用分析思路

时间:2023-12-06 17:16:31浏览次数:35  
标签:Reflection rAmount 代币 deliver attacker Token skim tAmount pair

在本篇文章中,我将通过一个攻击事件引出 Reflection Token 攻击事件的一个通用分析思路。
关于 Reflection Token 的其他案例分析,可以参考BEVO代币攻击事件分析及复现一文。

TomInu 攻击事件

TomInu Token 是一个反射型代币 reflection token,于2023-01-26遭到黑客攻击,攻击者获利35577美元。

TomInu(被攻击合约): 0x2d0e64b6bf13660a4c0de42a0b88144a7c10991f
攻击交易: https://phalcon.blocksec.com/tx/eth/0x6200bf5c43c214caa1177c3676293442059b4f39eb5dbae6cfd4e6ad16305668

攻击过程较为简单,攻击者通过几个常规操作就完成获利。

image

  1. 攻击者借出闪电贷
  2. 用 WETH swap 出 1465904852700232013011 TINU
  3. deliver 1465904852700232013011 TINU
  4. skim 得到 1733770910894426471783 TINU(在这一步已经完成了获利)
  5. 把 TINU swap 为 WETH
  6. 归还闪电贷

本次攻击事件通过推文告警并且进行了分析,但是很可惜分析的结论略显含糊的。红框标注的部分并不是攻击者获利的真正原因。(为什么不是真的)

推文:https://twitter.com/QuintenDes/status/1618730379447508998

image

并且,目前在在网络上搜索到的所有关于 reflection token 攻击事件的成因分析中提到:“由于攻击者 deliver 了一笔 token ,导致了 pair 中的 token 升值,从而能够 skim 出更多的 token 进行获利”。这类分析大多是理所当然地下结论,没有通过实际的计算推导,妄下结论误导读者。(为什么这么说)

攻击过程很简单,先 deliver 然后 skim,就能够获利了。根据这个攻击过程的特征,我们直接找 rToken增发代码,定位漏洞点。(为什么可以这么做)

以上的几个为什么都将会在后面“为什么”这一章节进行解释,读者可以先带着疑问进行阅读。

漏洞分析

_transferStandard 函数中可以看出,TomInu 代币在进行转账 rAmount 时需要收取 teamfee 两种手续费,并将扣除了手续费后的 rTransferAmount 转给收款人。

image

其中 team 手续费 rteam 留存在本合约中,fee 手续费 rfee 则是直接销毁。

image

此时他们的数量关系应该为:rTransferAmount = rAmount - rteam - rfee

问题出现在 _getRValues 函数中,该函数在计算 rTransferAmount 的过程中忽略了 rteam 参数,计算 rTransferAmount = rAmount - rfee 得到的结果比实际结果要大,造成了 rToken 的增发。也就是说,因为这个计算问题,市场上实际流通的 rAmount 总和是要大于 rTotal 的值的。

image

代币合约在执行 _transfer() 函数的时候,会将本合约的代币 swap 成 ETH,这个操作使得增发的代币一直累计在 pair 中。

image

为什么

在这个章节中,会对前面的暴言暴论进行解释

  1. 为什么推文中的关于漏洞成因的结论是含糊的不准确的。
  2. 什么说关于 reflection token 攻击事件的成因分析中提到“由于攻击者 deliver 了一笔 token ,导致了 pair 中的 token 升值,从而能够 skim 出更多的 token 进行获利”的分析结论都是错误的。
  3. 为什么看到攻击过程先 deliver 然后 skim 就完成获利之后,我得出的结论是直接找 rToken增发代码定位漏洞点。

首先我将举几个例子来模拟整个 deliver-skim 的过程,为了使得这个例子尽可能的简单,这个过程中将不考虑任何手续费的收取。

场景1:

只有 attacker 和 pair 持有所有的 token

rTotal 1000, tTotal 100, rate 10

pair: rAmount 500, tAmount 50
attacker: rAmount 500, tAmount 50

attacker deliver 500 rAmount

rTotal 500, tTotal 100, rate 5

pair: rAmount 500, tAmount 100
attacker: rAmount 0, tAmount 0

此时,pair 的 tAmount 从 50 变成了 100。接下来 attacker 将调用 skim 来获利了是不是?

attacker calls pair.skim()

rTotal 500, tTotal 100, rate 5

pair: rAmount 250, tAmount 50
attacker: rAmount 250, tAmount 50

attacker 如愿以偿获利了吗?没有,attacker 和 pair 又回到了最初的 50 tAmount,并不能通过这个操作来进行获利。

场景2:

attacker, pair 以及一些其他用户共同持有所有的 token

rTotal 1000, tTotal 100, rate 10

pair: rAmount 250, tAmount 25
attacker: rAmount 500, tAmount 50
others: rAmount 250, tAmount 25

attacker deliver 500 rAmount

rTotal 500, tTotal 100, rate 5

pair: rAmount 250, tAmount 50
attacker: rAmount 0, tAmount 0
others: rAmount 250, tAmount 50

attacker calls pair.skim()

rTotal 500, tTotal 100, rate 5

pair: rAmount 125, tAmount 25
attacker: rAmount 125, tAmount 25
others: rAmount 250, tAmount 50

pair 回到了原始的 25 tAmount,而 attacker 由原来的 50 亏损到了 25 tAmount。坚定持有的 others 由 25 上涨到了 50 tAmount。

通过上面的两个例子,我们可以得出结论,只有当 attacker 和 pair 所持有的代币份额合计 100% 的情况下,deliver-skim 的操作 attacker 才不会亏损。而两者份额不足 100% 的情况下,deliver-skim 的操作反而会导致 attacker 遭受损失。也就是说 attacker 通过 deliver-skim 的操作无论怎么样都是不赚的,最好的情况是 attacker 和 pair 所持有的代币份额合计 100% 的情况下才不至于亏损。

那么…有没有更好的情况呢?好到…两者持有的代币份额合计起来…超过100%

比如,发生了代币增发?

场景3:

由于代码存在 rToken 相关的计算错误,导致代币增发的发生,具体表现为 rToken 的实际流通量大于 rTotal 的数量。

rTotal 1000, tTotal 100, rate 10

pair: rAmount 400, tAmount 40
attacker: rAmount 800, tAmount 80
others: rAmount 400, tAmount 40

sum_rAmount = 1600 > rTotal = 1000
pair.rAmount + attacker.rAmount = 1200 > rTotal = 1000

attacker deliver 800 rAmount

rTotal 200, tTotal 100, rate 2

pair: rAmount 400, tAmount 200
attacker: rAmount 0, tAmount 0
others: rAmount 400, tAmount 200

attacker calls pair.skim()

rTotal 200, tTotal 100, rate 2

pair: rAmount 80, tAmount 40
attacker: rAmount 320, tAmount 160
others: rAmount 400, tAmount 200

至此,attacker 从原来的 80 tAmount,通过 deliver-skim 操作获利达到 160 tAmount。

通过这个场景,也就可以解释为什么看到攻击过程中通过 deliver-skim 操作获利时,首先想到的就是去找代码中使得 rAmount 增发的计算操作。因为只有 rAmount 发生了增发,pair 和 attacker 的份额大于 100%,且增发部分需要留存在 pair 合约中,才能够满足通过 deliver-skim 操作进行获利的基础条件。

后记

在 TomInu 攻击事件发生的4个月后,存在相同漏洞的 ADU token 再次被攻击。
ADU token attack tx:https://explorer.phalcon.xyz/tx/bsc/0xc6f6b70e9e35770b699da9b60244d461d02db66859df42319c3207d76931423c

为什么会写这篇文章,因为当我想对这些攻击事件进行学习与分析的时候,我查看了网络上的分析文章,他们给出的漏洞成因含糊不清毫无根据。我读了很多篇分析文章,说辞都是大同小异地糊弄。还没分析清楚就胡乱指点,最终被忽悠的就是真心想研究清楚的人。走了不少弯路,把弯路总结成这篇文章,感谢你的阅读。

标签:Reflection,rAmount,代币,deliver,attacker,Token,skim,tAmount,pair
From: https://www.cnblogs.com/ACaiGarden/p/17879952.html

相关文章

  • Scope api1 not found in store. IdentityServer4.Validation.TokenRequestValidator:
    看明白了这个报错,说是scopeapi在授权服务器没有定义,但是一直不知道哪出错,我寻思也定义了这个资源来着但其实并没有,说的是scope不是说的resource,所以需要再定义一个Scope  ......
  • seafile获取token和文件夹ID
    获取tokencurl-d"[email protected]&password=tkv7zjV4P0Rq"http://xxxxxxxx:50018/api2/auth-token/双因素认证:curl-d"[email protected]&password=tkv7zjV4P0Rq" -H'X-SEAFILE-OTP:<token>......
  • 京东面试:说说Cookie、Session和Token的区别?
    东子作为目前传统电商三巨头之一(其他还有阿里巴巴和拼多多),其面试题的难度也中规中矩,总体来说没有其他两家面试难度高,当然薪资也没有其他两家薪资高。其中拼多多的薪资最为离谱,尤其是前几年,听说挖同行的开发人员,薪资可以开到原来薪资的两到三倍,真是变态(但是我喜欢)。东子的面试题......
  • 如何实现 token 加密
    以最常见的token格式jwt为例,token分为三段,分别是header、payload、signature。其中,header标识签名算法和令牌类型;payload标识主体信息,包含令牌过期时间、发布时间、发行者、主体内容等;signature是使用特定的算法对前面两部分进行加密,得到的加密结果。token有防篡改的......
  • GB28181视频监控平台LiteCVR调取登录接口获取token的操作步骤
    视频监控设备是安防行业的细分专业领域,近年来,随着计算机、网络、图像处理以及传输技术的飞速发展,视频监控技术也迎来质的飞跃,实现从“简单化”到“多元化”的发展。数以万计的监控摄像头遍布城市各个角落,为人们的安全带来有力保障。安防视频监控管理平台LiteCVR能在复杂的网络环......
  • react项目vite报错:UnhandledPromiseRejectionWarning: SyntaxError: Unexpected toke
    问题:vite报错:UnhandledPromiseRejectionWarning:SyntaxError:Unexpectedtoken'??='今天clone一个vite的项目,安装依赖后运行npmrundev报错:UnhandledPromiseRejectionWarning:SyntaxError:Unexpectedtoken'??='atLoader.moduleStrategy(internal/modules......
  • LLM 入门笔记-Tokenizer
    以下笔记参考huggingface官方tutorial:https://huggingface.co/learn/nlp-course/chapter6下图展示了完整的tokenization流程,接下来会对每个步骤做进一步的介绍。1.Normalizationnormalize其实就是根据不同的需要对文本数据做一下清洗工作,以英文文本为例可以包括删除......
  • 修改sa-token检查token的报错信息
    1.创建一个类去实现NotLoginExceptionMapperimportcn.dev33.satoken.exception.NotLoginException;importorg.springframework.http.HttpStatus;importorg.springframework.http.ResponseEntity;importorg.springframework.stereotype@ComponentpublicclassCustomNotLogin......
  • npm ERR! Unexpected token ‘.‘ 报错解决办法
    报错截图如下: 解决办法:1、通过nvmuninstall[version]命令将已经安装的node版本依次删除。[version]代表node版本号。 2、找到nvm安装位置,卸载nvm,安装最新版本nvm。我目前安装nvm1.1.12双击nvm目录中的unins000.exe进行卸载。弹窗后点击确定卸载。......
  • identityserver4 刷新token接口返回空
    如题,查看日志发现错误信息:Nosigningcredentialforalgorithms(rs256)registered而客户端的配置里的“身份令牌算法”没有rs256于是加上就ok了。 ......