如今,隨著人們對 DeFi 的興趣日益濃厚,DEX(即去中心化交易所)風靡一時。它們解決了常見的 CEX (即中心化交易所)問題,那我們也會問,DEX夠安全嗎?
在上一篇說明了代幣本身的安全問題后(純干貨分享(一) | DEFI安全問題之基礎篇),現在來聊聊DEX在兌換代幣時可能產生的安全問題。目前DEX主要面臨的安全問題大致可分成兩類:
(1)DEX項目本身存在的安全問題。
(2)作為第三方協議,與其他DEFI項目交互時產生的安全問題。
本文將對第一類安全問題進行介紹。
重入漏洞
重入漏洞在上一篇我們也提到過,它屬于需要防范的經典漏洞。與普通代幣的重入相比,Uniswap的重入漏洞的主要表現形式為:攻擊者在一筆兌換交易中利用Uniswap未及時更新價格前發起二次兌換,由于此時Uniswap未更新價格,使得二次兌換可兌出的代幣數量比正常兌換的多。此外,在Uniswap的重入攻擊中,攻擊者利用單筆交易可能只能獲得微小的收益,因此攻擊者往往傾向于使用閃電貸或者循環套利擴大戰果。
以imBTC攻擊事件為例,該事件是由于Uniswap V1在調用ERC777系列代幣時,未充分考慮合約回調的情況。
具體表現為:攻擊者使用imBTC代幣兌換ETH時(如圖1),合約先通過self.getInputPrice函數計算正確的ETH數額并將ETH發送到目標地址,然后調用self.token.transferFrom函數時,會調用imBTC合約的_callTokensToSend函數(如圖2),而_callTokensToSend函數會調用用戶指定存儲imBTC代幣的合約。因此,如果攻擊者部署存儲合約,并改寫其中TokensToSend函數,那么當兌換代幣時,pair(兩種代幣組成的交易對)合約調用攻擊者部署的存儲合約,就可以回調pair進行二次兌換,而二次兌換時pair合約賬本還未更新,使得計算的ETH數額比正常兌換要多,以此來獲利。
鏈游 DeFi Kingdoms 宣布推出其子網絡 DeFi Kingdoms 鏈:3月9日消息,鏈游 DeFi Kingdoms 宣布推出與 Ava Labs 聯合研發的子網絡 DeFi Kingdoms 區塊鏈(DFK Chain)。同時,官方表明JEWEL將被賦予權力,除作為Serendale Governance代幣外,還被用于支付DFK Chain的網絡gas費。
此外,DeFi Kingdoms 與 Avalanche 基金會合作,將通過新一輪1500萬美元的 Avalanche Multiverse 激勵措施,促進 Crystalvale 在 DFK 鏈上啟動的早期階段。[2022/3/9 13:46:12]
圖1?Uniswap的tokenToEthInput函數
圖2 imBTC的transferFrom函數
圖3 imBTC的__callTokensToSend函數
詳細攻擊流程如下:
DeFIL平臺FIL存入量達166萬枚:DeFIL平臺數據顯示,當前FIL存入量為166.4萬枚,資產總值約2.5億美金,已借出FIL為118.6萬枚。defil是基于Ethereum的Filecoin去中心化借貸協議,用戶參與存FIL可獲取利息收益以及獲取平臺治理通證DFL,且DFL可繼續進行Staking挖礦。
目前,DeFIL已獲得由IPFS生態基金、分布式資本、FBG資本、以及Gate Labs、ZB Capital等機構的陸續投資。[2021/5/10 21:43:35]
圖4 ETH-imBTC事件流程圖
那么,為什么在第二次調用tokenToEthSwapInput函數兌換代幣時,發送的ETH會比正常兌換要多呢?我們可以用公式來還原可兌換代幣數量的代碼邏輯:
首先,正常兌換下,getInputPrice函數計算可兌換的ETH數量為:
且正常第二次可兌換的ETH數量為:
但重入后第二次可兌換的ETH數量為:
DeFi生態聚合器Booster與FilDA達成戰略合作:據官方消息,DeFi生態聚合器Booster與FilDA正式達成戰略合作,Booster所有存款全部存入FILDA,并實現存款雙挖(BOO+FILDA),更加安全可靠。Booster與FilDA將攜手共同開拓DeFi領域深度合作,一同為用戶提供全面專業的數字金融體驗。
FilDA是基于HECO的跨鏈借貸DeFi項目,并通過跨鏈橋連通了以太坊、NEO和Elastos等多條公鏈資產,實現了跨鏈質押借貸。
Booster致力于成為一站式服務平臺,用戶可在Booster完成存款、借款、杠桿挖礦、復投、跨鏈挖礦等一些列DeFi行為。Booster由靈蹤安全、慢霧科技完成審計,目前已開通多幣種存款及合成資產質押挖礦,及BOO/USD等十多種幣對的LP Token流動性挖礦,最高可享受8倍杠桿。Booster將于4月16日14:00在火幣生態鏈Heco開啟頭礦。[2021/4/17 20:30:46]
由此可知,在重入后第二次兌換中只有ETH的儲備量減少,而imBTC儲備量未增加。這樣在分母不增加的情況下,導致了等量的imBTC可以兌換更多的ETH。
針對此類安全問題,成都鏈安建議:
當合約涉及到資產轉移時,使用“檢查-生效-交互”模式來處理邏輯,對關鍵的業務操作可以使用OpenZeppelin官方的ReentrancyGuard進行修飾。
swap函數未對K值進行校驗
Uniswap的核心是常量乘積模型K=x*y,其中的K值是該pair合約持有代幣數量的乘積,且要求之后的每一筆交易完成后K值必須增加(考慮手續費)。因此如果不進行K值校驗,將很容易成為攻擊點。
DeFiBox安全提醒:Basis Diamond(BDC)項目或存在風險 需謹慎參與:DeFi 門戶網站DeFiBox.com項目監測發現,今日上線火幣生態鏈Heco的自動挖礦協議項目Basis Diamond (BDC)代碼未開源,存在未經審計的安全問題。
有用戶反映,其投入質押池中的10%本金可直接被劃走。由于該項目設計了48小時鎖倉機制,用戶質押Token時無法直接發現劃轉操作,DeFiBox.com提醒廣大用戶謹慎參與此項目。[2021/1/23 13:18:03]
圖5 Uniswap的價格波動
以Impossible Finance事件為例,該項目是Uniswap的仿盤,實現了兩種兌換代幣的函數:cheapSwap和swap。其中cheapSwap函數少了k值校驗(如圖6),但是項目方知道缺少K值校驗的后果,專門為cheapSwap函數增加了onlyIFRouter做修飾,來限制cheapSwap函數只能被指定的Router合約調用。
圖6?合約未檢查k值的cheapSwap函數
正常情況下,當用戶使用Router合約兌換代幣時,首先會使用getAmountsOut函數來計算正確的代幣數量amounts;然后調用safeTransferFrom將用戶的兌換消耗代幣轉入目標pair合約;最后,通過內部調用_swap函數來執行cheapSwap函數將兌換代幣轉至目標地址。
以太坊上DeFi總鎖倉金額164.8億美元:據歐科云鏈OKLink數據顯示,截至今日11時30分,以太坊上DeFi協議總鎖倉金額約合164.8億美元,環比下降3.21%。
當前鎖倉金額排名前三的協議分別是Maker 24.7億美元(-3.56%),WBTC 20.8億美元(-3.74%)以及Compound 15.9億美元(-1.96%)。[2020/12/11 14:54:07]
圖7?Router01合約的swapExactTokensForTokens函數
但是,由于cheapSwap函數缺少了K值檢驗,如果攻擊者部署惡意代幣合約,在Router合約調用safeTransferFrom函數時,回調正常的pair合約進行同種兌換,由于,回調后的兌換使用的amounts仍是未更新之前的數據,已不符合改變賬本狀態之后的校驗,那么攻擊會導致以錯誤的價格兌換出目標代幣,以此獲利。
圖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。
4. 回歸到AAA-IF-BUSD路徑的兌換,將之前計算的amounts值傳入_Swap函數中執行這筆兌換,用一半的IF又兌換了2521897個BUSBD。
5. 歸還閃電貸,完成攻擊。
圖9?事件流程圖
在關鍵的兌換函數中必須做k值校驗,不要為了節省gas和代碼量就將K值校驗和安全驗證依賴外部驗證,做到自身功能完善。
Decentralized Exchange
通縮代幣未設置pair為分紅例外
通縮代幣在交易時會產生額外的分紅與手續費。如果交易合約中包含了此類代幣,且沒有進行特殊處理,那么,就可能導致交易對合約記錄的代幣儲量與實際的代幣可用余額不一致。
以XSquid事件為例,XSquid是一種通縮代幣,未將其與WHT代幣組成的pair合約地址添加獎勵例外列表,造成了pair合約除了正常代幣兌換和流動性存儲外,還存有多余的XSquid分紅獎勵代幣。因此,攻擊者就可以調用Swap函數將pair合約多余的XSquid代幣轉換為WHT提取(如圖11),或者通過skim函數將多余的XSquid代幣直接提取(如圖12)。
圖10?XSquid交易對合約未添加獎勵例外
圖11?Swap函數可以兌換多余的WHT代幣
圖12?skim函數可以提取大于reserve的部分
DEX在添加通縮分紅型代幣時多注意手續費以及分紅的處理情況。在創建通縮分紅型代幣交易對時,可以添加獎勵例外來避免此類代幣的分紅問題。
此外,以下兩類不屬于DEX本身的安全問題,但是被項目方借助了DEX的特性實施詐騙,所以將其寫在文章末尾。
詐騙交易池?
這類問題主要是指項目方在自己發行的代幣里留有后門,創建與主流代幣的交易池,誘使投資者使用手里存在價值的代幣買入項目方代幣,并且不斷拉盤對投資者進行投資欺騙。
以下面的TRTC項目方為例,項目方創建了ETH-TRTC的交易池。但是在TRTC的代幣合約對transferFrom函數做了相關限制,要求代幣的轉出方為owner(管理員)或者為Uniswap。因此對于投資者,僅可以通過Uniswap買入TRTC代幣,而不能賣出TRTC代幣。最后由項目方把投資者投入的ETH提走跑路,給投資者帶來了巨大的損失。
圖13?TRTC合約的transfer函數
圖14?TRTC合約的ensure修飾
圖15?TRTC合約的transferFrom函數
項目方Rug Pull?
Rug Pull是指項目方卷走投資者資金跑路的行為,目前已成為DeFi生態系統的最大騙局類型,項目方刻意制造代幣價格暴漲的假象、許諾為提供流動性的投資者提供高回報等方式來大量聚集資金,一旦時機成熟就移除池子里的流動性或將代幣卷走。這樣的例子在DeFi屢見不鮮,AnubisDAO、Meerkat Finance、TurtleDEX、Squid token魷魚幣等都是在卷款跑路之后,注銷網站和社交媒體銷聲匿跡,導致投資者承擔了巨大的損失。
?寫在最后?
成都鏈安建議項目方使用鎖倉和多重簽名來控制代幣流動性,避免出現砸盤跑路的情況。投資者不要被天上掉餡餅的事情沖昏頭腦,防范虛假宣傳。
Multicoin Capital 可能是有史以來表現最好的風險基金。這位加密投資者通過對 Solana、Helium、The Graph 等進行高度集中、非共識性的賭注,贏得了巨大的勝利.
1900/1/1 0:00:00區塊鏈索引服務依賴于合約事件來幫助歸檔數據,并在一個漂亮的用戶界面中給我們提供交易記錄,其通常被稱為“區塊瀏覽器”,比如Etherscan.
1900/1/1 0:00:00在本文中,我們將論述關于以太坊上的 staking (押注) 有多么去中心化,以及對收益無止境的追求正在如何使這種向去中心化 staking 的轉變有利可圖.
1900/1/1 0:00:00目前,伴隨著“元宇宙”概念的火爆,NFT(國內一般稱為:數字藏品)這一概念也隨之走入大眾視野。3月3日中午12點,一款來自上海交響樂團的NFT產品引發了一場小小的“搶購風暴”,限量發行的一萬份產.
1900/1/1 0:00:00從比特幣成為薩爾瓦多法定貨幣到加密資產卷入俄烏沖突……伴隨著加密市場日趨火熱以及比特幣在傳統金融機構中的高關注度,近兩年來,針對加密業的監管動作也隨之增加.
1900/1/1 0:00:00太陽底下沒有新鮮事兒。 NFT在國內至少火了一年了,基礎概念相信大家不會陌生。簡而言之,NFT用區塊鏈技術記載的數字化內容(比如圖片、視頻、虛擬手辦).
1900/1/1 0:00:00