four.meme是一个BinanceAcademy孵化的一个类似于pump.fun的memecoinlaunchpad。
我们监测到平台上的memecoinsnowboard(https://four.meme/token/0x4abfd9a204344bd81a276c075ef89412c9fd2f64)遭受黑客攻击。损失约15,000USD。攻击交易为:https://bscscan.com/tx/0x2902f93a0e0e32893b6d5c907ee7bb5dabc459093efa6dbc6e6ba49f85c27f61
攻击及事件分析four.meme技术原理
four.meme是一个在bnbsmartchain上的类似于pump.fun的memecoinlaunchpad。类似的launchpad平台主要有三个阶段:
•阶段1:用户在平台自定义名称、logo、描述、社交账户(可选)等创建memecoin
•阶段2:其他用户在平台上可以买卖该memecoin
•阶段3:当该memecoin市值到达一定阈值时(24BNB),将其迁移到DEX(PancakeSwap)上
下面,我们详细了解一下每个阶段的具体技术细节。
阶段1
用户在launchpad平台上,通过接口填写需要创建的memecoin的具体信息。
填写完成后,支付手续费便完成memecoin的链上合约创建。当然这个合约是由launchpad官方的合约创建的,所以创建后的ERC-20Token的owner也是launchpad官方合约。下面我们可以看一下four.meme的一个memecoin创建的例子:
首先,由用户支付手续费,launchpad官方合约完成memecoin的ERC-20Token合约部署,并mint1,000,000,000初始资金(该memecoin预计的虚拟池总量为30BNB),
随后,我们看到创建好的Token的owner同样也是launchpad官网的智能合约。
这也就说明虽然在launchpad上,memecoin是该用户创建的,但实际上链上的ERC-20合约的owner并不是该用户,这样做的可以防止用户自行mint等一些恶意行为出现。该memecoin智能合约在链上部署完成就就进入第二阶段,平台上的所有用户进行买卖。
阶段2
平台上其他用户可以通过平台进行买卖,但是,买卖后的token没法通过transfer转给其他用户,我们可以看一下链上ERC-20Token的源代码,
其中在_beforeTokenTransfer通过参数_mode对转账进行了限制
此时,我们可以看到阶段2的Token对应的_mode为1,也就是MODE_TRANSFER_RESTRICTED,限制转账第三方。
此举是这是为了防止场外OTC对价格的影响。当买卖时,four.meme合约通过先将_mode设置为2后利用transfer给用户转账,转账完成后再将_mode设置为1,限制其他用户转账。来完成购买后memecoin的转账。
阶段3
当该memecoin的市值到达24BNB时,此时BondingCurveProcess达到100%。launchpad官方就会将剩下的20%memecoin和24BNB迁移到DEXPancakeSwap上。至此,阶段3正式完成。下面的交易就是launchpad官方将memecoin迁移到PancakeSwap上的交易。
我们可以看到,首先launchpad官方将memecoin的_mode设置为0,即MODE_NORMAL,允许用户进行场外交易。接着,launchpad官方创建了一个memecoin和WBNB的交易对,最后将23.5BNB(其中0.5BNB为fee)和2亿memecoin的流动性添加到了该交易对中。添加流动性的价格为sqrtPriceX96=27169599998237907265358521。因为sqrtPriceX96的计算公式如下:
所以,添加流动性时的该memecoin价格为0.0000001175WBNB,也可以通过23.5WBNB除以2亿memecoin得到,所以每个币迁移到DEX的价格都时相同的。均为0.0000001175WBNB。
攻击原理
在了解完整个memecoin在four.meme的生命周期后,我们再来详细看一下攻击流程。首先,攻击者提前创建了一个已经初始化的DEX交易对。并且,将交易对的sqrtPriceX96设置为10000000000000000000000000000000000000000,比正常值大了368058418256012倍。
当该memecoin的bondcvureprocess到达100%时,launchpad将该memecoin迁移到DEX时,使用createAndInitializePoolIfNecessary来创建交易对。由于该交易对在之前已经被攻击者创建并初始化。所以就按照创建时攻击者初始化的价格添加了流动性。相当于莫名拉高了该memecoin的价格。
此时,该launchpad使用1个memecoin和23.5WBNB添加了流动性。随后,疑似攻击者使用了1600memecoin将交易对中的23.4WBNB兑换完成,至此攻击结束。
总结本次漏洞的成因是在Four.meme在内盘的bondingcurveprocess为100%,向DEX进行迁移时。使用createAndInitializePoolIfNecessary创建PancakeSwap交易对。没有考虑到交易对已经被提前创建的情况,因为错误的使用了攻击者提前创建并初始化完成的交易对,利用攻击者设置的错误的价格添加了流动性。导致迁移后该memecoin的价格暴增,随后攻击者利用手中的memecoin将池子中的WBNB掏空完成攻击。建议项目方在设计经济模型和代码运行逻辑时要多方验证,合约上线前审计时尽量选择多个审计公司交叉审计。