如今,隨著人們對DeFi 的興趣日益濃厚,DEX(即去中心化交易所)風靡一時。它們解決了常見的CEX (即中心化交易所)問題,那我們也會問,DEX夠安全嗎?
在上一篇說明了代幣本身的安全問題後(純乾貨分享(一) | DEFI安全問題之基礎篇),現在來聊聊DEX在兌換代幣時可能產生的安全問題。目前DEX主要面臨的安全問題大致可分成兩類:
(1)DEX項目本身存在的安全問題。
重入漏洞
二級標題
Part.1
-Decentralized Exchange
重入漏洞
重入漏洞在上一篇我們也提到過,它屬於需要防範的經典漏洞。與普通代幣的重入相比,Uniswap的重入漏洞的主要表現形式為:攻擊者在一筆兌換交易中利用Uniswap未及時更新價格前發起二次兌換,由於此時Uniswap未更新價格,使得二次兌換可兌出的代幣數量比正常兌換的多。此外,在Uniswap的重入攻擊中,攻擊者利用單筆交易可能只能獲得微小的收益,因此攻擊者往往傾向於使用閃電貸或者循環套利擴大戰果。
圖片描述
圖片描述
圖片描述
圖片描述
圖片描述
圖片描述
圖4 ETH-imBTC事件流程圖
那麼,為什麼在第二次調用tokenToEthSwapInput函數兌換代幣時,發送的ETH會比正常兌換要多呢?我們可以用公式來還原可兌換代幣數量的代碼邏輯:
首先,正常兌換下,getInputPrice函數計算可兌換的ETH數量為:
且正常第二次可兌換的ETH數量為:
但重入後第二次可兌換的ETH數量為:
由此可知,在重入後第二次兌換中只有ETH的儲備量減少,而imBTC儲備量未增加。這樣在分母不增加的情況下,導致了等量的imBTC可以兌換更多的ETH。
二級標題
二級標題
Part.2
-Decentralized Exchange
圖片描述
圖片描述
圖片描述
圖片描述
圖片描述
圖片描述
圖片描述
圖片描述
圖8 合約進行k值校驗的Swap函數
該事件的具體攻擊步驟如下:
1. 在準備階段攻擊者部署了AAA代幣合約,並使用閃電貸借來1000WBNB,兌換65140個項目方的IF代幣。
2. 使用其中一半的IF代幣(32570個)與攻擊者自己部署的AAA代幣構建IF-AAA交易池。
3. 執行AAA-IF-BUSD路徑的代幣兌換,且當Router合約調用AAA代幣合約的transferFrom函數時會執行攻擊者的惡意代碼,重入至IF-BUSD的pair合約,並將另一半IF代幣正常兌換出221897個BUSD。
圖片描述
圖片描述
圖9 事件流程圖
二級標題
二級標題
Part.3
-Decentralized Exchange
通縮代幣未設置pair為分紅例外
圖片描述
圖片描述
圖片描述
圖片描述
圖12 skim函數可以提取大於reserve的部分
針對此類安全問題,成都鏈安建議:
正文
正文
PART.1
詐騙交易池
圖片描述
圖片描述
圖片描述
圖片描述
圖15 TRTC合約的transferFrom函數
PART.2
寫在最後
寫在最後
寫在最後
成都鏈安建議項目方使用鎖倉和多重簽名來控制代幣流動性,避免出現砸盤跑路的情況。投資者不要被天上掉餡餅的事情沖昏頭腦,防範虛假宣傳。