【漏洞分析】OSN 代币攻击事件:一笔资金伪造多个分红大户
背景
OSN 是一种 fee on transfer 代币,会根据用户分红账户的余额对用户发放分红。攻击者利用漏洞增发分红账户的余额,随后触发分红机制完成获利。
OSN:https://bscscan.com/address/0x810f4c6ae97bcc66da5ae6383cc31bd3670f6d13#code
攻击由三笔交易组成:
- https://app.blocksec.com/explorer/tx/bsc/0xbf22eabb5db8785642ba17930bddef48d0d1bb94ebd1e03e7faa6f2a3d1a5540
- https://app.blocksec.com/explorer/tx/bsc/0x69c64b226f8bf06216cc665ad5e3777ad1b120909326f120f0816ac65a9099c0
- https://app.blocksec.com/explorer/tx/bsc/0xc7927a68464ebab1c0b1af58a5466da88f09ba9b30e6c255b46b1bc2e7d1bf09
Trace 分析
攻击交易1
攻击者首先用 BUSD 换出 OSN 代币

然后将少量 BUSD 和 OSN 发放到新创建的地址中

攻击交易2
攻击者操控攻击交易1中创建的账户向 pair 添加流动性

攻击交易3
攻击者首先闪电贷 50000 BUSD

随后购入 70000 OSN

向 pair 添加流动性,获得 53032907572135909484703 流动性代币

把流动性代币发送到攻击合约,然后调用其 addLiq 函数 burn 35524 流动性代币(交易2中添加的),取回资产。随后将之前收到的 53032907572135909484703 流动性代币转移到下一个合约,不断重复这个操作。

移除流动性,取回 BUSD 和 OSN 代币,然后反复执行 BUSD -> OSN 和 OSN-> BUSD 两种的兑换操作。

执行攻击合约的 cc 函数,向 pair 添加流动性,触发 OSNLpDividendTracker.setBalance 函数,随后给攻击合约分红 55 BUSD。最后将攻击合约内全部的 121 BUSD 转移到攻击者地址。

从调试界面可以知道攻击合约内原有 66 BUSD,加上分红得到的 55 BUSD,一共 121 BUSD。

最后攻击者归还闪电贷 500250 BUSD,获利 1767 BUSD。

漏洞分析
攻击者在第一笔交易中创建了大量的账户,然后在第二笔交易中通过这些账户向 pair 添加少量的流动性
在 OSN._transfer 函数中,会记录流动性账户 userInfo 所持有的流动性代币,以及分红账户所持有的流动性代币。

随后在第三笔交易中,攻击者首先是添加流动性获取到大量的流动性代币,然后把流动性代币发送到攻击合约,再移除攻击合约之前添加的流动性。
此时会进入到 OSN._transfer 函数的另一个分支——移除流动性分支。函数先获取了 to 地址的流动性代币余额,然后通过 lpDividendTracker.setBalance 函数将该数值记录到 to 地址的分红账户上。

从下面的 trace 可以看出,攻击合约的 newBalance 被设为了一个很大的数值。随后攻击者故技重施,将这笔流动性代币转移到下一个攻击合约并更新其 newBalance 值,在创建的多个攻击合约之间不断重复这个操作。

随后攻击者移除了流动性,取回 BUSD 和 OSN 代币,然后反复执行 BUSD -> OSN 和 OSN-> BUSD 两种的兑换操作。
当 OSN -> BUSD 时,会执行红框内的三个函数
swapAndSendDividends:将 OSN -> BUSD,然后将 BUSD 发送给lpDividendTracker,随后调用lpDividendTracker.distributeDividends函数。burnPoolToken:burn 掉 pair 中一部分的 OSN 代币。swapAndAddLiqidity:将 OSN -> BUSD,把 4/7 BUSD 发送给marketAddress,把 3/7 BUSD 发送给lpDividendTracker,随后调用lpDividendTracker.distributeDividends函数。

lpDividendTracker.distributeDividends 函数的主要功能就是累加奖励数值 magnifiedDividendPerShare,也就是说每调用一次该函数,奖励就增加一次。这也就是攻击者反复进行 swap 操作的原因。

在进行完 swap 操作后,攻击者调用攻击合约的 cc 函数向 pair 添加少量流动性,目的是触发分红发放函数来获利。
函数调用流程如下:_transfer -> setBalance -> processAccount -> _withdrawDividendOfUser -> withdrawableDividendOf -> accumulativeDividendOf
accumulativeDividendOf 函数计算用户可以分得的分红,其中 magnifiedDividendPerShare 被攻击者通过反复 swap 操控,而 balanceOf 则被那笔复用的流动性代币所操控。

在 _withdrawDividendOfUser 函数中,根据被操控的分红金额向攻击地址进行分红,完成此次攻击的获利。

后记
原本以为代币上的安全问题不会太复杂,比较一个代币的代码量相比其他 DeFi 协议还是比较小的。但是查看了代码以后才发现这个代币还是挺复杂的,在 ERC20 的基础上加了很多机制:收税,通缩,分红,回购等等。所以在本篇文章也只是跟踪关键的几个受影响的变量进行追踪分析,如果读者想要深入全面了解 OSN 代币的机制的话可以阅读他的源码。如果文章有哪些地方分析有误也请多多指教,感谢你的阅读。
【漏洞分析】OSN 代币攻击事件:一笔资金伪造多个分红大户的更多相关文章
- 【阿菜漏洞复现】DeFi 平台 MonoX Finance 漏洞分析及复现
前言 2021 年 11 ⽉ 30 ⽇,DeFi 平台 MonoX Finance 遭遇攻击,损失共计约 3100 万美元. 造成本次攻击的漏洞主要有两个: 移除流动性的函数未对调用者进行检测,使得任 ...
- AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程
AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程 0x00 项目简述 Ammbr主要目标是打造具有高度弹性且易于连接的分布式宽带接入平台,同时降低上网相关成本.Ammbr打算创建具有人工智能和智 ...
- 【漏洞分析】KaoyaSwap 安全事件分析
相关信息 KaoyaSwap 是 BSC 链上的一个自动做市商 AMM.然后,现在他们的官网 https://www.kaoyaswap.com/ 已经打不开了(如果我打开方式没错的话).所以就直接进 ...
- 证券化代币的时代已经到来,STO将引爆区块链经济
STOs 似乎会在 2019 年取代 ICOs,即使不是完全取代,但置换的比例也会相当大.所有在美上市的公司都将按照 SEC 制定的相关规定进行交易.Vellum Capital 的 CEO 兼管理合 ...
- 分析苹果代充产业链 汇率差+退款造就三线城市千万富翁_中新游戏研究_Joynews中新游戏
分析苹果代充产业链 汇率差+退款造就三线城市千万富翁_中新游戏研究_Joynews中新游戏 CNG:近日有媒体曝出8月22日这一天,有一家淘宝店卖出了351张面值4000南非南特的App Store ...
- Web 漏洞分析与防御之点击劫持(三)
原文地址:Web 漏洞分析与防御之点击劫持(三) 博客地址:http://www.extlight.com 一.全称 点击劫持,顾名思义,用户点击某个按钮,却触发了不是用户真正意愿的事件. 二.原理 ...
- Spring Cloud Gateway actuator组建对外暴露RCE问题漏洞分析
Spring Cloud gateway是什么? Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关.网关作为流量的,在微服务系统中有着非常作 ...
- PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析
catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/p ...
- Java反序列化漏洞分析
相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...
- FFmpeg任意文件读取漏洞分析
这次的漏洞实际上与之前曝出的一个 CVE 非常之类似,可以说是旧瓶装新酒,老树开新花. 之前漏洞的一篇分析文章: SSRF 和本地文件泄露(CVE-2016-1897/8)http://static. ...
随机推荐
- PromQL全方位解读:监控与性能分析的关键技术
本文全面探索PromQL,从基础语法到高级操作,详细介绍了数据聚合.时间序列分析及内置函数应用,旨在提升用户构建复杂监控策略和性能分析的能力. 关注[TechLeadCloud],分享互联网架构.云服 ...
- Mybatis-plus 中Wrapper的使用
mybatis plus条件构造器关系图 1.上图绿色框为抽象类abstract 2.蓝色框为正常class类,可new对象 3.黄色箭头指向为父子类关系,箭头指向为父类 QueryWrapper 继 ...
- IDEA新手使用教程之使用技巧总结【详解】
IDEA是一款功能强悍.非常好用的Java开发工具,近几年编程开发人员对IDEA情有独钟. 一.IDEA的下载 IDEA下载地址:https://www.jetbrains.com/idea/down ...
- [oeasy]python0019_ 打包和解包_struct_pack_unpack
打包和解包 回忆上次内容 ASCII 由这样几类字符构成 英文大写字符 英文小写字符 数字 符号 电报时代对于英文.数字的编码 使用的是摩斯电码 编辑 这摩斯电码是3进制的编码方式 长短空 怎 ...
- oeasy教您玩转vim - 69 - # 折叠folding入门
折叠入门 回忆上次 上次学习了一种新的容器 tabs选项卡 tabs选项卡 包含多个选项卡tab 可以列两个tab 一个编写文件 一个执行指令 互不影响 每个 tab选项卡 还可以对应多个wind ...
- 数据仓库建模工具之一——Hive学习第四天
Hive的基本操作 1.3HIve的表操作(接着昨天的继续学习) 1.3.2 显示表 show tables; show tables like 'u*'; desc t_person; desc f ...
- FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
<FFmpeg开发实战:从零基础到短视频上线>一书的"第11章 FFmpeg的桌面开发"介绍了如何在Windows环境对Qt结合FFmpeg实现桌面程序,那么Win ...
- 手把手帮助你搭建属于自己的个人博客,使用cervel部署,无需后端
1.项目简介 项目使用了vue+elementUI技术栈,通过读取本地md文件实现博客文章的展示,使用vercel实现自动化部署,纯前端项目,无需后端 第一步:下载源码 仓库地址: github:ht ...
- ABC349
A link 其实,有人赢比赛,就有人输比赛,一加一减,不管进行多少场比赛,最后所有人的分数和一定是\(0\). 那么知道\(n-1\)个人的分数和,就可以知道第\(n\)个人的了. 点击查看代码 # ...
- 制作KubeVirt镜像
目录 制作KubeVirt镜像 1. 准备磁盘文件 2. 编写Dockerfile 3. 构建镜像 4. 上传镜像到仓库(可选) 5. 导出镜像 6. 虚拟机yaml文件 7. 启动虚拟机 8. 启动 ...