背景介紹

four.meme是一個Binance Academy 孵化的一個類似pump.fun 的memecoin launchpad 。

我們監測到平台上的memecoin snowboard( https://four.meme/token/0x4abfd9a204344bd81a276c075ef89412c9fd2f64 )遭受駭客攻擊。損失約15, 000 USD 。攻擊交易為: https://bscscan.com/tx/0x2902f93a0e0e32893b6d5c907ee7bb5dabc459093efa6dbc6e6ba49f85c27f61

攻擊及事件分析

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 的特定資訊。

帥不過三秒,Four.meme攻擊事件分析

填寫完成後,支付手續費便完成memecoin 的鏈上合約創建。當然這個合約是由launchpad 官方的合約創建的,所以創建後的ERC-20 Token 的owner 也是launchpad 官方合約。下面我們可以來看看four.meme 的一個memecoin 所建立的範例:

首先,由用戶支付手續費, launchpad 官方合約完成memecoin 的ERC-20 Token 合約部署,並mint 1,000,000,000 初始資金(該memecoin 預計的虛擬池總量為30 BNB ),

帥不過三秒,Four.meme攻擊事件分析

隨後,我們看到創建好的Token 的owner 同樣也是launchpad 官網的智能合約。

帥不過三秒,Four.meme攻擊事件分析

這也說明雖然在launchpad 上, memecoin 是該用戶創建的,但實際上鏈上的ERC-20 合約的owner 並不是該用戶,這樣做的可以防止用戶自行mint 等一些惡意行為出現。該memecoin 智能合約在鏈上部署完成就進入第二階段,平台上的所有用戶進行買賣。

階段2

平台上其他用戶可以透過平台進行買賣,但是,買賣後的token 沒辦法透過transfer 轉給其他用戶,我們可以看看鏈上ERC-20 Token 的源代碼,

帥不過三秒,Four.meme攻擊事件分析

其中在_beforeTokenTransfer 透過參數_mode 對轉帳進行了限制

帥不過三秒,Four.meme攻擊事件分析

此時,我們可以看到階段2的Token 對應的_mode 為1,也就是MODE_TRANSFER_RESTRICTED ,限制轉帳第三方。

帥不過三秒,Four.meme攻擊事件分析

此舉是這是為了防止場外OTC 對價格的影響。當買賣時, four.meme 合約透過先將_mode 設定為2 後利用transfer 給用戶轉賬,轉帳完成後再將_mode 設定為1 ,限制其他用戶轉帳。來完成購買後memecoin 的轉帳。

帥不過三秒,Four.meme攻擊事件分析

階段3

當這個memecoin 的市值到達24 BNB 時,此時Bonding Curve Process 達到100% 。 launchpad 官方就會將剩下的20% memecoin 和24 BNB 遷移到DEX PancakeSwap 上。至此,階段3正式完成。下面的交易就是launchpad 官方將memecoin 移轉到PancakeSwap 上的交易。

帥不過三秒,Four.meme攻擊事件分析

帥不過三秒,Four.meme攻擊事件分析

我們可以看到,首先launchpad 官方將memecoin 的_mode 設定為0 ,即MODE_NORMAL ,允許使用者進行場外交易。接著,launchpad 官方創建了一個memecoin 和WBNB 的交易對,最後將23.5BNB (其中0.5 BNB 為fee )和2億memecoin 的流動性添加到了該交易對中。添加流動性的價格為sqrtPriceX96 = 27169599998237907265358521 。因為sqrtPriceX96 的計算公式如下:

帥不過三秒,Four.meme攻擊事件分析

所以,添加流動性時的該memecoin 價格為0.0000001175 WBNB ,也可以透過23.5 WBNB 除以2億memecoin 得到,所以每個幣遷移到DEX的價格都時相同的。均為0.0000001175 WBNB 。

攻擊原理

在了解完整個memecoin 在four.meme 的生命週期後,我們再來詳細看一下攻擊流程。首先,攻擊者提前創建了一個已經初始化的DEX交易對。並且,將交易對的sqrtPriceX96 設定為1000000000000000000000000000000000000000 ,比正常值大了368058418256012 倍。

帥不過三秒,Four.meme攻擊事件分析

當該memecoin 的bond cvure process 到達100% 時, launchpad 將該memecoin 移轉到DEX 時,使用createAndInitializePoolIfNecessary 來建立交易對。由於該交易對在之前已經被攻擊者創建並初始化。所以就按照創建時攻擊者初始化的價格添加了流動性。相當於莫名拉高了該memecoin 的價格。

帥不過三秒,Four.meme攻擊事件分析

此時,該launchpad 使用1 個memecoin 和23.5 WBNB 添加了流動性。隨後,疑似攻擊者使用了1600 memecoin 將交易對中的23.4 WBNB 兌換完成,至此攻​​擊結束。

帥不過三秒,Four.meme攻擊事件分析

總結

本次漏洞的成因是在Four.meme 在內盤的bonding curve process 為100%,向DEX進行遷移時。使用createAndInitializePoolIfNecessary 建立PancakeSwap 交易對。沒有考慮到交易對已經提前創建的情況,因為錯誤的使用了攻擊者提前創建並初始化完成的交易對,利用攻擊者設定的錯誤的價格添加了流動性。導致遷移後該memecoin 的價格暴增,隨後攻擊者利用手中的memecoin 將池子中的WBNB 掏空完成攻擊。建議專案方在設計經濟模型和程式碼運作邏輯時要多方驗證,合約上線前審計時盡量選擇多個審計公司交叉審計。