太空哥斯拉(SpaceGodzilla)攻击事件分析

  • 时间:
  • 浏览:54
  • 来源:区块链技术网

背景

SpaceGodzilla是一个ERC20代币,项目没有官方网站,官方只在twitter上进行维护,项目介绍是“哥斯拉吸收了地球上所有的核能,向月球飞去!”,然后官方twitter头图是张哥斯拉乘着火箭去月球的图片,目前官方有300人关注……..

就在前天,这个项目被黑客攻击了。此次黑客利用未授权的函数,扰乱了正常的Godzilla币与USDT的流动池,最终攻击大约套利了2.6万的USDT。

漏洞原因

一句话总结漏洞的原因是:函数权限设置不当。swapAndLiquifyStepv1用来向LP流动池中添加流动性,本只应该在向LP池转账时,应该设置成只能internal调用。但在实际代码中,却设置成了public属性,导致黑客swapAndLiquifyStepv1后,导致LP流动池中token数量混乱,产生了套利空间..

漏洞合约地址https://bscscan.com/address/0x2287c04a15bb11ad1358ba5702c1c95e2d13a5e0

猜测下为什么这个函数的权限没有设置呢?

从函数名称swapAndLiquifyStepv1看,该函数是v1版本的函数,该函数在开发过程中应该为第一版本的函数方法,更像是一个本该废弃并删除的函数。因为代码中还存在另外一个有相似功能且有调用逻辑存在的函数function swapAndLiquify() public

攻击过程分析

黑客攻击的调用链非常非常非常非常长,但大部分的调用都是进行闪电贷和归还闪电贷的过程。

真实的漏洞利用过程就在下面的代码调用片段中,我们从闪电贷获得了295.2万的USDT开始分析漏洞利用过程。

黑客的漏洞利用过程

  1. 通过闪电贷和交换等获得了295.2万的USDT,此为初始的攻击资本。
  2. 将295.2万的USDT,在GodzillaUSDT的流动池中换出73,775,430,786,944,730,258,898,675,433,018个Godzilla币
  3. 调用swapAndLiquifyStepv1漏洞函数,将LP流动池中的Godzilla与USDT的兑换比例完全打乱
  4. LP流动池中的比例已经打乱,此时用使用71,562,167,863,336,388,351,131,715,170,010个Godzilla币兑换出297.8万的USDT,净套利2.6万USDT。

我们可以分析下套利的过程(假设AMM中的X为Godzilla,Y为USDT),初始的资金为295.2万

  1. 在调用swapAndLiquifyStepv1漏洞函数之前。

    可以看到GodzillaUSDT流动池中的Godzilla与USDT的数量分别为(两者数量之比为:8.4亿:1): X=76041697635825849047705725848735 Y=90478604689102338898952

    K = XY = 6.8810^54

    根据公式(X-DX)(Y+DY)=K 和公式XY = K,可以计算出此时,黑客可以兑换出的Godzilla大约为(对应着公式中的DX) 73780928010061370325334249251641

    由公式推导出DX=X-(K/(Y+DY)),其中的
    X =  76041697635825849047705725848735 
    Y = 90478604689102338898952
    DY = 2952797730003166405412733   这就是初始的USDT的资金
    计算得到的DX为73780928010061370325334249251641,与实际兑换出的73775430786944730258898675433018相差无几。
  2. 在调用swapAndLiquifyStepv1漏洞函数之后,可以看到

    GodzillaUSDT流动池中的Godzilla与USDT的数量分别为(两者数量之比为:74万:1,与漏洞之前的8.4亿:1相距甚大):

    2,288,901,594,081,170,758,102,038,305,061  3,073,671,601,005,728,817,436,539

    可以看到调用了swapAndLiquifyStepv1函数严重改变了LP流动池中的兑换比例

    此时的K值变成了K’= 7.0310^54(相比之前的K 6.8810^54大约增加了1.5*10^53)

  3. 在新的K’下,将1中的Godzilla换回USDT。

    (X-DX)*(Y+DY)=K

    相当于已知X’, Y’, DX为要兑换的Godzilla,根据公式X’Y’=K’ , (X'+ DX)(Y'-DY)=K', 求DY。

    由公式推导出DY    =Y' - K'/(x'+DX),其中的
    K' = 7035331827224036947372569921877688319008790342490023879
    X' =  2288901594081170758102038305061 
    Y' = 3073671601005728817436539
    DX =  71562167863336388351131715170010
    
    计算得到2978407823799623479865461,与2978176485325154862214560(这就是最终黑客执行套利后的USDT的数量)
    相差无几。

细心的可能会发现,在1中将闪电贷换出了73780928010061370325334249251641 Godzilla,在3中将Godzilla再换成USDT时的Godzilla的数量是71562167863336388351131715170010,为什么这两个数字不同

这是因为Godzilla在_transfer过程中会收取%3的takeFee,两个数字之间的差额就是被Godzallia合约收走的takeFee,这个takeFee是在_transfer中被收取的,因此在LP的swap函数的返回中还是7378..这个数,而HackContract到手的Godzallia币就只有7156…这个数了。

对于没有正确设置权限的swapAndLiquifyStepv1()函数,功能就是把Godzilla合约中的USDT和Godzilla币一起充到LP中,正是这个充值到LP的行为导致了套利的出现。

// 0x55d398326f99059fF775485246999027B3197955 为USDT的地址,虽然代码中定义为ETH变量....
address _baseToken = address(0x55d398326f99059fF775485246999027B3197955);
ETH = IERC20(_baseToken);
function swapAndLiquifyStepv1() public {
        uint256 ethBalance = ETH.balanceOf(address(this));
        uint256 tokenBalance = balanceOf(address(this));
        addLiquidityUsdt(tokenBalance, ethBalance);
    }

总结

合约中不用的函数、测试的函数在发布前都删掉吧….……

参考

https://mobile.twitter.com/BlockSecTeam/status/1547456617414660096

https://mp.weixin.qq.com/s/JF4bvVoHbOZkjbO2YwGiWw

https://versatile.blocksecteam.com/tx/bsc/0x7f183df11f1a0225b5eb5bb2296b5dc51c0f3570e8cc15f0754de8e6f8b4cca4

https://www.haomeili.net/Math/BigMath?Method=Multiply

猜你喜欢

重入漏洞分析-基于hardhat、solidity0.8环境

1.重入漏洞简介1.1漏洞定义重入,顾名思义是指重复进入,也就是“递归”的含义,本质是循环调用缺陷。重入漏洞(或者叫做重入攻击),是产生的根源是由于solidity智能合约的特

2022-07-30

MetaMask 浏览器扩展钱包 Clickjacking 漏洞分析

By:Thinking@慢雾安全团队背景概述2022年6月3日,MetaMask(MM)公开了白帽子发现的一个严重的Clickjacking漏洞,这个漏洞可以造成的影响是:在用

2022-07-30

dapp安全总结与典型安全事件

以太坊以及EVM的诞生使得Dapp这种新的业务形态成为可能。总的来说,EVM实现了一个全局的状态机,为所有的Dapp提供了统一的状态空间;实现了图灵完备,并抽象出了账户模型,账

2022-07-30

XCarnival NFT 借贷协议漏洞分析

By:九九@慢雾安全团队2022年06月27日,据慢雾区消息,XCarnival项目被曝出严重漏洞遭黑客攻击并盗走3,087个ETH(约380万美元)。XCarnival是一个

2022-07-30

区块链入门030:安全事件频出中心化交易所,为何还未取代

参与区块链投资,免不了要和交易所打交道。我们经常能听到中心化交易所和去中心化交易所。它们有什么区别呢?今天我们就来介绍一下中心化交易和去中心化交易所以及它们各自的特点。01中心

2022-02-13