背景

OSN 是一种 fee on transfer 代币,会根据用户分红账户的余额对用户发放分红。攻击者利用漏洞增发分红账户的余额,随后触发分红机制完成获利。

OSN:https://bscscan.com/address/0x810f4c6ae97bcc66da5ae6383cc31bd3670f6d13#code

攻击由三笔交易组成:

  1. https://app.blocksec.com/explorer/tx/bsc/0xbf22eabb5db8785642ba17930bddef48d0d1bb94ebd1e03e7faa6f2a3d1a5540
  2. https://app.blocksec.com/explorer/tx/bsc/0x69c64b226f8bf06216cc665ad5e3777ad1b120909326f120f0816ac65a9099c0
  3. 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 时,会执行红框内的三个函数

  1. swapAndSendDividends:将 OSN -> BUSD,然后将 BUSD 发送给 lpDividendTracker,随后调用 lpDividendTracker.distributeDividends函数。
  2. burnPoolToken:burn 掉 pair 中一部分的 OSN 代币。
  3. 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 代币攻击事件:一笔资金伪造多个分红大户的更多相关文章

  1. 【阿菜漏洞复现】DeFi 平台 MonoX Finance 漏洞分析及复现

    前言 2021 年 11 ⽉ 30 ⽇,DeFi 平台 MonoX Finance 遭遇攻击,损失共计约 3100 万美元. 造成本次攻击的漏洞主要有两个: 移除流动性的函数未对调用者进行检测,使得任 ...

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

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

  3. 【漏洞分析】KaoyaSwap 安全事件分析

    相关信息 KaoyaSwap 是 BSC 链上的一个自动做市商 AMM.然后,现在他们的官网 https://www.kaoyaswap.com/ 已经打不开了(如果我打开方式没错的话).所以就直接进 ...

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

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

  5. 分析苹果代充产业链 汇率差+退款造就三线城市千万富翁‍_中新游戏研究_Joynews中新游戏

    分析苹果代充产业链 汇率差+退款造就三线城市千万富翁‍_中新游戏研究_Joynews中新游戏 CNG:近日有媒体曝出8月22日这一天,有一家淘宝店卖出了351张面值4000南非南特的App Store ...

  6. Web 漏洞分析与防御之点击劫持(三)

    原文地址:Web 漏洞分析与防御之点击劫持(三) 博客地址:http://www.extlight.com 一.全称 点击劫持,顾名思义,用户点击某个按钮,却触发了不是用户真正意愿的事件. 二.原理 ...

  7. Spring Cloud Gateway actuator组建对外暴露RCE问题漏洞分析

    Spring Cloud gateway是什么? Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关.网关作为流量的,在微服务系统中有着非常作 ...

  8. PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/p ...

  9. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  10. FFmpeg任意文件读取漏洞分析

    这次的漏洞实际上与之前曝出的一个 CVE 非常之类似,可以说是旧瓶装新酒,老树开新花. 之前漏洞的一篇分析文章: SSRF 和本地文件泄露(CVE-2016-1897/8)http://static. ...

随机推荐

  1. PromQL全方位解读:监控与性能分析的关键技术

    本文全面探索PromQL,从基础语法到高级操作,详细介绍了数据聚合.时间序列分析及内置函数应用,旨在提升用户构建复杂监控策略和性能分析的能力. 关注[TechLeadCloud],分享互联网架构.云服 ...

  2. Mybatis-plus 中Wrapper的使用

    mybatis plus条件构造器关系图 1.上图绿色框为抽象类abstract 2.蓝色框为正常class类,可new对象 3.黄色箭头指向为父子类关系,箭头指向为父类 QueryWrapper 继 ...

  3. IDEA新手使用教程之使用技巧总结【详解】

    IDEA是一款功能强悍.非常好用的Java开发工具,近几年编程开发人员对IDEA情有独钟. 一.IDEA的下载 IDEA下载地址:https://www.jetbrains.com/idea/down ...

  4. [oeasy]python0019_ 打包和解包_struct_pack_unpack

    ​ 打包和解包 回忆上次内容 ASCII 由这样几类字符构成 英文大写字符 英文小写字符 数字 符号 电报时代对于英文.数字的编码 使用的是摩斯电码 ​ 编辑 这摩斯电码是3进制的编码方式 长短空 怎 ...

  5. oeasy教您玩转vim - 69 - # 折叠folding入门

    ​ 折叠入门 回忆上次 上次学习了一种新的容器 tabs选项卡 tabs选项卡 包含多个选项卡tab 可以列两个tab 一个编写文件 一个执行指令 互不影响 每个 tab选项卡 还可以对应多个wind ...

  6. 数据仓库建模工具之一——Hive学习第四天

    Hive的基本操作 1.3HIve的表操作(接着昨天的继续学习) 1.3.2 显示表 show tables; show tables like 'u*'; desc t_person; desc f ...

  7. FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg

    ​<FFmpeg开发实战:从零基础到短视频上线>一书的"第11章  FFmpeg的桌面开发"介绍了如何在Windows环境对Qt结合FFmpeg实现桌面程序,那么Win ...

  8. 手把手帮助你搭建属于自己的个人博客,使用cervel部署,无需后端

    1.项目简介 项目使用了vue+elementUI技术栈,通过读取本地md文件实现博客文章的展示,使用vercel实现自动化部署,纯前端项目,无需后端 第一步:下载源码 仓库地址: github:ht ...

  9. ABC349

    A link 其实,有人赢比赛,就有人输比赛,一加一减,不管进行多少场比赛,最后所有人的分数和一定是\(0\). 那么知道\(n-1\)个人的分数和,就可以知道第\(n\)个人的了. 点击查看代码 # ...

  10. 制作KubeVirt镜像

    目录 制作KubeVirt镜像 1. 准备磁盘文件 2. 编写Dockerfile 3. 构建镜像 4. 上传镜像到仓库(可选) 5. 导出镜像 6. 虚拟机yaml文件 7. 启动虚拟机 8. 启动 ...