背景介紹
近期,我們監控到一起針對BnbSmartChain 上的專案DCFToken的鏈上攻擊事件,
https://bscscan.com/tx/0xa88b907960c3c5a9dfcfd28aff12136359034653e34fa6d7bb9a6ef9c7a0532f
被攻擊的項目為DCFToken ,攻擊者透過此攻擊獲利約為8800 USD 。
攻擊及事件分析
首先,攻擊者創建了一個新的合約,然後呼叫了該合約,
接著,該合約從PancakeSwapV3Pool 中利用flash 貸款了2,750,000 BUSDT 。
隨後,攻擊者利用flash 貸來的初始資金開始針對進行針對DCFToken 的攻擊。第一步,攻擊者利用專案的未開源合約的兌換功能( BUSDT 兌換DUSD )將該合約的所有DUSD 使用BUSDT 兌換,該函數的簽名為0xabb81c12 。
透過反編譯我們得到該函數的具體實現如下:
第一步:
從代碼中可以看出BUSDT 和DUSD 的兌換比例由stor_5 控制,由於攻擊時stor_5 為1000 ,所以BUSDT和DUSD 兌換比例為1:1 。因此,攻擊者使用了10,927 BUSDT 將該合約中的DUSD 全部兌換。
第二步:
利用DUSD 購買DCFToken ,該函數的簽章為0x62ee2f14 。透過反編譯我們可以看到具體的實現如下:
簡單來說,該函數實現了使用DUSD 購買DCFToken 的功能,其中購買價格由PancakeSwapV2 的BUSDT 和DCFToken 的價格決定。也意味著在該函數的邏輯中, DUSD 和BUSDT 的價格為1:1 。
接著,會將購買的DCFToken 的1% 轉入系統位址中。
攻擊者隨後利用第一步驟中購買的所有DUSD 購買DCFToken 。
接著,攻擊者重複上述的步驟,直到將項目方用於兌換DUSD 和DCFToken 的合約中的DCF 買空。隨後,攻擊者利用PancakeSwapV2 的兌換功能,將手中的DCFToken 兌換為BUSDT ,來操縱DCFToken 的價格,經過此次兌換,DCFToken 的價格由1 BUSDT = 126 DCFToken 拉升到了1BUSDT = 3 DCFToken 。
兌換前:
兌換後:
第三步:
攻擊者再掏空專案方合約中的DCFToken 後,使用該合約的DCFToken 兌換DUSD ,該函數的簽名為0xd5088d27 ,與第二步驟中使用DUSD 購買DCFToken 類似。同樣的,購買價格由PancakeSwapV2 的BUSDT 和DCFToken 的價格決定。也意味著在該函數的邏輯中,DUSD 和BUSDT 的價格為1:1 。接著,會將購買的DUSD 的1% 轉入系統位址中。
第四步:
攻擊者再利用項目方合約中的DUSD 兌換BUSDT 的功能,該函數的簽章為0xfea1cdc9 ,兌換比例為1:1 ,但是1% 的BUSDT 會轉入項目方位址中。
攻擊者繼續重複第三和第四步,直到掏空專案方合約中的BUSDT 。
最後,攻擊者使用剩餘的DCFToken ,利用PancakeSwapV2 全部兌換為了BUSDT ,再歸還flash 的貸款和利息後,獲利8,763 BUSDT 。
簡單來講,該專案的漏洞出現在兌換的價格計算上。 DCFToken 的價格依賴PancakeSwap ,但是,使用專案方合約兌換又不影響DCFToken 的價格。因此攻擊者先使用BUSDT 兌換DUSD 再兌換DCF(99%) 掏空DCFToken ,再利用PancakeSwap 的swap 拉升DCFToken 的價格,最後使用DCFToken 兌換DUSD(99%) 再兌換BUSDT(99%) 來完成獲利。
總結
這次漏洞成因主要是因為DCFToken 專案方合約在取得DCFToken 的價格時,透過單一來源PancakeSwapV2 來計算,導致價格被攻擊者操縱,最後利用價差套利。建議專案方在設計經濟模型、價格電腦制和程式碼運作邏輯時要多方驗證,合約上線前審計時盡量選擇多個審計公司交叉審計。