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