跳到主要内容

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

事件分析

  • 首先调用了合约的startTrading,在函数内部调用了SwapHelper合约TradingInfo函数,详细代码如下。

    Cover

Cover

上图是tx的调用栈,结合代码可知TradingInfo里面只是一些静态调用,关键问题不在这个函数。继续往下分析,发现调用栈中的approve操作和safeapprove对应上。接着又调用了SwapHelper的swaptoToken函数,结合调用栈发现这是个关键函数,转账交易在这个call里面执行的。通过链上信息发现SwapHelper合约并不开源,具体地址如下:https://bscscan.com/address/0x112f8834cd3db8d2dded90be6ba924a88f56eb4b#code

  • 尝试逆向分析一下。

    1. 首先定位函数签名0x63437561
      Cover
    1. 定位到这个反编译之后的函数,因为看到调用栈触发了转账,所以尝试寻找transfer等关键字。
      Cover
    1. 于是定位到函数的这一分支,首先stor_6_0_19,先把这部分读出来。
      Cover
    1. 此时获得了转账to地址,0x0000000000000000000000005695ef5f2e997b2e142b38837132a6c3ddc463b7, 发现该地址和调用栈的转账to地址一致。
      Cover
    1. 仔细分析这个函数的if和else分支,发现如果走if是正常兑换。因为通过插槽得到stor50x00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e,这个合约是pancakerouter。后门函数在else分支,只要传入的参数和stor7插槽存放的值相等即可触发。
    Cover
    1. 这个函数就是修改插槽7位置的值,而且调用权限只有合约的owner可以。
    Cover

    以上所有分析足以判断这是一个项目方跑路事件。

总结

NUMEN实验室提醒用户投资的时候需要对项目方的合约进行安全审计,未验证的合约中可能存在项目方权限过大或者直接影响用户资产安全的功能。这个项目存在的问题只是整个区块链生态的冰山一角,用户投资和项目方开发项目时一定对代码进行安全审计,NUMEN专注于为web3生态安全保驾护航。