OnChain Transaction Debugging: 6. Analysis for CirculateBUSD Project Rugpull, Loss of $2.27 Million!
Author: Numen Cyber Technology
前言
根据NUMEN链上监控显示,新加坡时间2023年1月12日下午 14:22:39 ,CirculateBUSD项目跑路,损失金额227万美金。该项目资金转移主要是管理员调用CirculateBUSD.startTrading
,并且在startTrading里面的主要判断参数是由管理员设置的未开源合约SwapHelper.TradingInfo
返回的数值,之后调用SwapHelper.swaptoToken
转走资金。
![Cover](https://user-images.githubusercontent.com/107821372/212806617-33a2e763-754b-4682-baef-d78bccdbcbaa.png)
事件分析
首先调用了合约的
startTrading
,在函数内部调用了SwapHelper合约的TradingInfo
函数,详细代码如下。
![Cover](https://user-images.githubusercontent.com/107821372/212807682-d99be725-a9a9-41a9-a380-329413af4b2f.png)
上图是tx的调用栈,结合代码可知TradingInfo
里面只是一些静态调用,关键问题不在这个函数。继续往下分析,发现调用栈中的approve
操作和safeapprove
对应上。接着又调用了SwapHelper的swaptoToken
函数,结合调用栈发现这是个关键函数,转账交易在这个call
里面执行的。通过链上信息发现SwapHelper
合约并不开源,具体地址如下:https://bscscan.com/address/0x112f8834cd3db8d2dded90be6ba924a88f56eb4b#code
尝试逆向分析一下。
- 首先定位函数签名
0x63437561
。
- 定位到这个反编译之后的函数,因为看到调用栈触发了转账,所以尝试寻找
transfer
等关键字。
- 于是定位到函数的这一分支,首先
stor_6_0_19
,先把这部分读出来。
- 此时获得了转账
to
地址,0x0000000000000000000000005695ef5f2e997b2e142b38837132a6c3ddc463b7
, 发现该地址和调用栈的转账to
地址一致。
- 仔细分析这个函数的if和else分支,发现如果走if是正常兑换。因为通过插槽得到
stor5
是0x00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e
,这个合约是pancakerouter
。后门函数在else
分支,只要传入的参数和stor7
插槽存放的值相等即可触发。
- 这个函数就是修改插槽7位置的值,而且调用权限只有合约的owner可以。
以上所有分析足以判断这是一个项目方跑路事件。
- 首先定位函数签名
总结
NUMEN实验室提醒用户投资的时候需要对项目方的合约进行安全审计,未验证的合约中可能存在项目方权限过大或者直接影响用户资产安全的功能。这个项目存在的问题只是整个区块链生态的冰山一角,用户投资和项目方开发项目时一定对代码进行安全审计,NUMEN专注于为web3生态安全保驾护航。