作者:Salus Insights
在去中心化金融(DeFi)領域中存在著大量的安全風險,這些風險可能對使用者、平台和整個金融生態系統造成嚴重的危害。我們總結了三種 DeFi 安全風險,並透過分析最近發生的真實安全事件來闡述駭客攻擊的過程以及相應的解決方案。
-
價格操縱風險
-
智能合約漏洞風險
-
使用者操作風險
1. 價格操縱風險
在 DeFi 中,價格操縱風險是指惡意行為者試圖透過操縱資產的價格來獲利或影響市場的行為。這種操縱可能會導致市場價格的不正常變動,對其他參與者造成損失。以下,我們總結了價格操縱風險在 DeFi 中可能出現的三種情況:
-
閃電貸攻擊
-
三明治攻擊
-
預言機攻擊
1.1 閃電貸攻擊
閃電貸攻擊是一種在 DeFi 應用程式中出現的攻擊方式。它利用了閃電貸這種無需提供抵押品即可藉貸的金融操作。攻擊者透過閃電貸借入大量資金,並在同一筆交易中進行一系列操作,以實施詐欺行為。
ShidoGlobal 閃電貸攻擊事件
2023 年 6 月 23 日,在 BSC(幣安智能鏈)上發生了 ShidoGlobal 閃電貸攻擊事件。攻擊者透過鎖定和索取機制,以及兩個池之間的價格差異來實現代幣的套利,成功竊取了 976 個 WBNB。
Attack Tx:
https://explorer.phalcon.xyz/tx/bsc/0x72f8dd2bcfe2c9fbf0d933678170417802ac8a0d8995ff9a56bfbabe3aa712d6
攻擊者如何實施閃電貸攻擊?
-
攻擊者藉了 40 個 WBNB 的閃電貸。
-
攻擊者將 39 個 WBNB 交換成了 10, 436, 972, 685, 676, 390, 697 個 Shido Inu:SHIDO 代幣(小數點後 9 位),並存入了 PancakeSwap V2:SHIDO-WBNB 池中。這一步驟操作增加了 Shido Inu:SHIDO 代幣在該池中的供應量,導致該代幣價格下降。
-
攻擊者接著依序調用了ShidoLock.lockTokens 和ShidoLock.claimTokens,將10, 436, 972, 685.676390697 個Shido Inu:SHIDO 代幣(小數點後9 位元)變成了10, 436, 986, 4938, 3, 10, 436, 986, 493, 383, 10, 436, 986, 49383, 10, 436, 986, 4938 387, 000, 000, 000 個SHIDO 代幣(小數點後18 位)。
當攻擊者呼叫 ShidoLock 合約中的 lockTokens 函數時,他們將 10, 436, 972, 685.676390697 個 Shido Inu:SHIDO 代幣鎖定在合約中。這意味著這些代幣無法被轉移或交易,直到特定的條件滿足為止。透過鎖定代幣,攻擊者可以在一定程度上維持代幣的價格穩定。
攻擊者調用 claimTokens 函數,將鎖定的代幣轉換成了 10, 436, 986, 704, 133, 494, 387, 000, 000, 000 個 SHIDO 代幣。這一步驟實際上是將 SHIDO 代幣的小數位數從 9 位增加到 18 位,增加了代幣的總供應量。
-
透過鎖定和索取機制,PancakeSwap V2:SHIDO-WBNB 池和 PancakeSwap V2:SHIDO 28 池之間存在價格差異。具體來說,由於 SHIDO 代幣在 PancakeSwap V2:SHIDO-WBNB 池中的供應量增加,導致價格下降。而在 PancakeSwap V2:SHIDO 28 池中,由於供應量沒有增加,價格相對較高。攻擊者利用這種價格差異,在兩個池之間進行代幣交換,以更有利的價格將10, 436, 986, 704, 133, 494, 387, 000, 000, 000 個SHIDO 代幣(小數點後18 人)交換成了1, 016 個WBNB。
-
最後,攻擊者償還了 40 個 WBNB 的閃電貸,並獲得了約 976 個 WBNB 的利潤。
限制閃電貸功能
限制閃電貸功能和引入閃電貸手續費是減少閃電貸攻擊和操縱風險的常見方法。
-
限制閃電貸功能:可以對閃電貸功能進行限制,例如設定最小借貸金額、借貸時間限制等。這樣可以減少攻擊者利用閃電貸方進行攻擊的機會。
-
引入閃電貸手續費:可以向借貸者收取一定的手續費。這樣可以增加攻擊的成本,使攻擊者在進行閃電貸攻擊時面臨更高的風險和成本。
在上述範例程式碼中,我們設定了一些限制條件來限制閃電貸功能的使用,例如最小借貸金額、最大借貸金額和借貸時間。在執行閃電貸操作之前,我們先計算並收取一定比例的手續費。
1.2 三明治攻擊
三明治攻擊(Sandwich Attack)是一種在去中心化交易所(DEX)中利用資訊不對稱的攻擊方式。攻擊者透過在兩個交易之間插入惡意交易,從而利用價格差異來獲取利潤。
CurveFinance 三明治攻擊事件
2023 年 8 月 2 日,Hypernative systems 對Curve Finance 發動三明治攻擊。攻擊者透過在添加流動性和移除流動性的兩個交易之間插入惡意交易,賺取 36.8 K USDT。
Attack Tx:
https://explorer.phalcon.xyz/tx/eth/0xd493c73397952049644c531309df3dd4134bf3db1e64eb6f0b68b016ee0bffde
攻擊者如何實施三明治攻擊?
-
攻擊者從多個資金來源獲得巨額閃電貸款,包括 wstETH、WETH 和 USDT。
-
攻擊者向3 pool 提供155, 000, 000 USDT 流動性並獲得3 CRV LP 代幣。 3 CRV 是Curve TriPool(Curve DAI/USDC/USDT 礦池)的LP 代幣,即在該攻擊事件中受到損害的礦池。
-
攻擊者從池中移除(幾乎全部)DAI 和USDC 流動性,並銷毀3 CRV LP 代幣。此時,該池幾乎完全是USDT,這暫時使其比DAI 和USDC 便宜得多。
-
呼叫 UnderlyingBurner 合約 execute()函數,繼續在 Curve DAI/USDC/USDT 礦池中加入流動性。 UnderlyingBurner 主要持有USDT,增加的 DAI:USDC:USDT 數量是 100, 000: 100, 000: 227, 079, 039, 776 。這導致該礦池更加不平衡,USDT 的相對數量更高,價值更低。
-
攻擊者將他持有的DAI 和USDC 添加到 Curve DAI/USDC/USDT 礦池中並享受溢價,這意味著獲得更高數量的3 CRV LP 代幣。
-
攻擊者透過銷毀其3 CRV LP 代幣並提取USDT 流動性。
-
攻擊者償還閃貸並保留36.8 K USDT 的利潤。
在這個過程中,惡意交易指的是攻擊者從Curve DAI/USDC/USDT 礦池中移除大量的DAI 和USDC 流動性,並銷毀3 CRV LP 代幣的交易。這個交易使得該礦池變得非常不平衡,USDT 的相對數量更高,從而導致其價值更低。
另外兩筆交易指的是攻擊者添加流動性和提取流動性的交易。攻擊者利用價格差異,透過添加自己持有的DAI 和USDC 流動性到Curve DAI/USDC/USDT 礦池,並在溢價時將其提取出來,獲得更高數量的3 CRV LP 代幣。
這樣,攻擊者透過三明治攻擊將惡意交易與另外兩筆交易包裝在一起,低價購買USDT 流動性,然後以高價出售獲取利潤。
限制交易順序
當涉及到防止三明治攻擊時,程式碼實作可能涉及複雜的智能合約和交易邏輯。以下是一個簡化的範例,展示如何透過限制交易順序和引入交易延遲來預防三明治攻擊。
在這個例子中,我們假設有一個智能合約SandwichAttackPrevention,用於管理用戶的餘額和交易操作。為了防止三明治攻擊,我們引入了兩個主要的防禦機制。
首先,在allowTransaction 函數中,只有合約的擁有者才能將isTransactionAllowed 設為true,從而允許使用者執行交易。這樣可以確保交易按照正確的順序執行,而不允許攻擊者在兩個交易之間插入惡意交易。
其次,在executeTransaction 函數中,我們引入了交易延遲的概念。只有在當前區塊時間超過設定的延遲時間後,用戶才能執行交易。這樣可以給其他用戶足夠的時間來執行交易並更新價格,從而減少攻擊者利用價格差異的機會。
1.3 預言機攻擊
價格預言機是一種提供加密貨幣即時價格資訊的資料來源。這些資訊對於許多DeFi 協定的正常運作至關重要。預言機攻擊是指攻擊者人為地改變預言機所提供的數據,目的是從基於操縱價格的交易中獲利。
Rodeo Finance 預言機攻擊事件
Rodeo 是一個 DeFi 平台,提供價格預言機服務。 2023 年 7 月 11 日,價格預言機操縱導致駭客從Rodeo 協議中竊取了約472 ETH(約88.8 萬美元)。
Attack Tx:
https://explorer.phalcon.xyz/tx/arbitrum/0xb1be5dee3852c818af742f5dd44def285b497ffc5c2eda0d893af542a09fb25a
物價預言機如何被操縱?
Rodeo Finance 攻擊事件的關鍵在於 Rodeo TWAP Oracle。此預言機用於追蹤ETH 和unshETH 之間的價格比率。
-
分析攻擊交易:攻擊過程始於攻擊者執行一個經過精心規劃的交易。攻擊者利用對平台架構和時間加權平均價格(TWAP)預言機潛在漏洞的深入理解,發動了攻擊。
-
操縱 TWAP 預言機:攻擊者能夠使用與未設定的策略位址相關聯的 earn 函數,強制交換 USDC 為 unshETH。這種操縱有效地繞過了由於有缺陷的 unshETH 價格預言機而導致的滑點控制。實質上,earn 函數被強制從 USDC 換成 WETH,再換成 unshETH。
-
計算 TWAP 價格:TWAP 價格是透過對最後四個更新的價格進行平均計算得出的,每個更新間隔為 45 分鐘。然而,有缺陷的價格預言機返回了一個被操縱的價格,導致智能合約認為該持倉是健康的。
-
開倉槓桿部位:攻擊者透過三明治攻擊操縱 TWAP 預言機,然後透過從投資者合約調用 earn 函數來開設槓桿頭寸。他們藉入了價值 40 萬美元的 USDC。
-
交換資產:攻擊者將借入的資產與底層的 CamelotDEX 池進行交換,同時將其準備好的 unshETH 賣回給池子。
-
繞過執行驗證:合約通常會驗證作業是否有效。然而,由於攻擊者控制了這個策略,他們輕鬆地繞過了這個檢查。這使得攻擊者能夠透過將準備好的 unshETH 賣回給池子來利用被操縱的頭寸,有效地從平台中提取流動性。
-
轉移被盜資金:攻擊者將被盜資金從 Arbitrum 轉移到 Ethereum,將 285 個 ETH 換成 unshETH,然後將它們轉移到 Arbitrum 以繼續攻擊。這部分價值 150 個 ETH 的被盜資金隨後被轉移到了 Tornado Cash,一個專注於隱私的以太坊混幣服務。剩餘的 371.2 個 ETH(約價值 701, 679 美元)仍然由攻擊者控制的地址持有。
這次攻擊的一個重大漏洞是 Rodeo TWAP Oracle 的執行有缺陷。預言機依賴WETH/unshETH 交易對的儲備,該交易對的流動性較低,因此價格波動很大。
基於多支預言機來計算價格
確保價格查詢的可靠性,一個可靠的預言機應該使用多個預言機或聚合餵價來計算價格,而不僅僅依賴代幣對比率。特別是在礦池流動性較差的情況下,這種多樣化的定價資訊來源可以提高價格資料的準確性,並使攻擊者更難操縱資料。
為了實現這一目標,一個可能的解決方案是使用去中心化預言機,例如 Chainlink。 Chainlink 預言機可以從各種數據來源收集數據,並使用區塊鏈技術驗證和確認數據的準確性。透過使用多個資料來源,Chainlink 減少了單點故障的可能性,並且更難以被攻擊者操縱資料。
以下是一個使用 Chainlink 聚合器合約來取得價格資料的範例程式碼:
在上述程式碼中,我們使用了一個AggregatorV3Interface類型的陣列來儲存多個預言機的實例。建構函式接受一個預言機位址陣列作為參數,並將每個位址實例化為一個AggregatorV3Interface物件。
getLatestPrice 函數用於取得多個資料來源的最新價格資料。它遍歷 priceFeeds 數組,並透過呼叫每個預言機的 latestRoundData 函數來獲取價格資料。所有的價格資料都儲存在一個 int 類型的陣列中,並傳回給呼叫者。
透過這種方式,我們可以從多個數據來源獲取價格數據,並確保價格查詢更準確地反映資產價格。
2. 智能合約漏洞風險
智慧合約漏洞智慧合約漏洞是指在以太坊或其他智慧合約平台上編寫的程式碼中存在的安全漏洞或錯誤。 DeFi 的核心是基於智慧合約的金融協議,因此智慧合約漏洞可能導致用戶資金的損失、操縱市場行為或其他惡意行為。
識別這些漏洞至關重要,我們的審計涵蓋了各種潛在問題。這包括但不限於可重入漏洞、存取控制漏洞、整數溢位漏洞和業務邏輯漏洞。我們全面的審計服務旨在加強您的智慧合約的安全性,並保護免受這些風險的影響。
以下,以存取控制漏洞舉例,說明智慧合約漏洞對 DeFi 的影響。
LeetSwap 存取控制漏洞
LeetSwap 遭受了攻擊,損失超過了340 ETH。根本原因在於 LeetSwap V2 Pair 合約有存取控制漏洞, _transferFeesSupportingTaxTokens 函數可見度為 public。
Attack Tx:
https://dashboard.tenderly.co/tx/base/0xbb837d417b76dd237b4418e1695a50941a69259a1c4dee561ea57d982b9f10ec
Vulnerable Contract:
https://basescan.org/address/0x94dac4a3ce998143aa119c05460731da80ad90cf
攻擊者呼叫了_transferFeesSupportingTaxTokens 函數來操縱池子,攻擊流程如下:
-
用WETH 兌換另一個代幣A。
-
呼叫_transferFeesSupportingTaxTokens 函數來轉移代幣A,並隨後調用sync 函數,導致代幣A 的價格上漲。
-
用代幣A 兌換更多的 WETH 並清空池子。
解決方案
為了修復_transferFeesSupportingTaxTokens 函數的存取控制漏洞,應該將函數可見性變更為 private 或 internal。將函數宣告為 private,只有合約內部的其他函數能夠呼叫它。將函數宣告為 internal,可以被繼承該合約的合約存取。其他合約繼承 LeetSwap V2 Pair 合約時,可透過 super 關鍵字呼叫_transferFeesSupportingTaxTokens 函數。而外部用戶無法直接存取該函數,提高了合約的安全性。
需要根據具體的合約邏輯和需求來決定如何更改函數的可見性,確保在提高安全性的同時不影響合約的正常運作。
智能合約審計是識別和預防漏洞的重要步驟。在Salus,我們擁有一支由經驗豐富的智慧合約開發人員和審計專家組成的團隊,可以幫助您增強合約的安全性。我們的專業知識使我們能夠準確定位潛在的弱點,並確保您的專案的安全性和可靠性。
3. 使用者操作風險
在DeFi 領域中,使用者操作風險是指使用者在使用DeFi 平台時,因自身的營運失誤、安全意識不足或不謹慎的行為而導致資金損失的風險。以下是一些常見的使用者操作風險:
-
點擊惡意鏈接:用戶可能會誤點擊惡意鏈接,導致惡意軟體或病毒感染其設備,攻擊者可以利用這些惡意軟體來獲取用戶的敏感資訊或控制其錢包。
-
使用不安全的錢包:如果用戶選擇使用不安全的錢包應用程式或硬體錢包,攻擊者可能會利用這些漏洞來竊取用戶的私鑰或操作權限。
-
洩漏私鑰:用戶如果在未加密的環境中洩漏私鑰,或者將私鑰儲存在不安全的地方,那麼攻擊者可能會輕易獲取用戶的私鑰並進而控制其資金。
-
不謹慎的交易操作:使用者在進行交易時,如果沒有仔細檢查交易細節(如目標地址、交易數量等),可能會導致資金發送到錯誤的地址或發送錯誤的數量。
為了減少使用者操作風險,以下是一些建議:
-
提高安全意識:了解常見的網路釣魚、惡意軟體和詐騙手段,並學習如何識別和避免它們。保持警惕,並仔細檢查與DeFi 相關的連結和應用。
-
使用安全錢包:選擇使用經過安全審計和有良好聲譽的錢包應用程式或硬體錢包。確保錢包應用程式和韌體是最新版本,並遵循最佳的安全實踐。
-
備份和保護私鑰:將私鑰儲存在安全的地方,並使用強密碼加密。定期備份私鑰,並將其儲存在離線、安全的地方,以防止意外資料遺失。
-
仔細檢查交易細節:在執行任何交易之前,仔細檢查交易細節,確保目標地址、交易數量等都是正確的。雙重檢查可以避免因疏忽而導致的資金損失。
4. 總結
請注意,針對以上每一種攻擊和漏洞的解決方案只是簡單的範例,並不能完全防止相對應的攻擊,或修復相對應的漏洞。如果您對智能合約審計感興趣,請聯絡我們,我們將與您合作,為您提供專業的審計服務,確保您的合約安全可靠。我們致力於為您提供優質的服務和全面的技術支持,以確保您的智能合約在安全和可靠的環境中運作。