價格預言機是去中心化金融(DeFi)的重要一環,然而,正是這一環節中可能存在的漏洞,導致很多 DeFi 項目遭受了災難性損失,有的損失甚至達到了數千萬美元。
那麼,這些攻擊到底是怎麼回事?又怎樣去預防它們?在這篇文章中,知名白帽駭客、 Paradigm 研究合夥人 Samczsun 分析了 5 個關於價格預言機攻擊的現實案例,並總結了 6 種抵禦這類攻擊的方法。
2019 年末,我發表了一篇題為「利用低抵押獲利」文章,當中,我描述了一種針對以太坊 dApp 的經濟攻擊,這種攻擊依賴於一個或多個代幣的準確價格數據。現在是 2020 年末,不幸的是,很多項目都犯了類似的錯誤,最近的例子是 Harvest Finance,其遭遇了駭客攻擊,導致協議用戶集體損失達 3300 萬美元。
雖然開發者們已熟悉了可重入等漏洞,但預言機(oracle)操縱顯然不是經常被考慮的問題。事實上,基於可重入漏洞的攻擊,在過去幾年中有所下降,而基於價格預言機操縱的漏洞利用率,現在正在上升。因此,我認為是時候發表一些關於價格預言機操縱的確定性資料了。
這篇文章分為三個部分,在第一部分,我們會對那些不熟悉這一主題的人,對預言機和預言機操縱進行一個簡單介紹。而第二部分,則是一些案例研究(其中我們會回顧過去與預言機相關的漏洞和攻擊事件),那些想要測試自己知識的人,可以跳過它們。最後,我們總結了一些開發者可用來保護他們的項目不受預言機操縱的技術。
現實生活中的預言機操縱
時間回到 2015 年 12 月 1 日(星期三),假設你現在的身份是 David Spargo,現在你正在澳大利亞墨爾本的 Peking Duk 演唱會,你想去後台休息室親自見見這支樂隊的成員,但有兩名保安攔在你的面前,他們不可能讓普通人直接進去。
你想知道,如果你表現得像 Peking Duk 樂隊的親屬,保安會有什麼反應。因為家庭成員肯定會被允許在後台訪問樂隊,所以你所要做的就是讓保安相信你是樂隊的親戚。你想了一會兒,想出了一個計劃,而這個計劃只能被描述為「天才般」或「絕對瘋狂的」。
在迅速安排好一切之後,你自信地走到保安面前。你自我介紹自己是 David Spargo,是 Peking Duk 樂隊的家庭成員,當警衛要求你提供證據時,你給他們看無可辯駁的證據——維基百科。
警衛揮手讓你過去,讓你稍等一下。一分鐘過去了,兩分鐘過去了……五分鐘後,你想知道你是否應該在執法人員出現之前逃跑。就在你準備放棄的時候,Peking Duk 樂隊成員 Reuben Styles 走了過來,然後你和他一起走進休息室,樂隊對你的聰明才智印象深刻,最後你們一起喝了幾杯啤酒,再後來,他們在自己的 Facebook 頁面上分享了當晚發生的事情。
什麼是價格預言機?
價格預言機,大可指你向其諮詢價格資訊的任何東西。當帕姆(Pam)向德懷特(Dwight)詢問一 Schrute 元的現金價值時,德懷特(Dwight)就扮演了一個價格預言機。
在以太坊上,一切都是智能合約,價格預言機也是如此。因此,區分價格預言機獲取價格資訊的方式更為有用。在一種方法中,你可以簡單地從價格 API 或交易所獲取現有的鏈外價格數據,並將其帶到鏈上。而另一類方式,你可以通過諮詢鏈上去中心化交易所(DEX)來計算即時價格。
這兩種選擇各有利弊。鏈外數據對波動性的反應通常較慢,這是好是壞,取決於你試圖使用它的目的,而這種方式通常需要少數特權用戶將數據推送到鏈上,因此你必須相信這些人不會做惡,也不會被迫推送壞的更新。而鏈上數據不需要任何特權訪問,並且總是最新的,但這意味著它很容易被攻擊者操縱,從而導致災難性的失敗。
那可能出現什麼問題?
讓我們來看幾個關於價格預言機集成問題導致 DeFi 項目重大財務損失的例子。
1 、 Synthetix sKRW 預言機故障
Synthetix 是一個衍生品平台,它允許用戶訪問其他貨幣等資產。為了實現這一目標,當時的 Synthetix 依賴於一個定制的鏈外餵價實現,其餵價數據以固定的時間間隔發佈到鏈上。這些價格允許用戶對支持的資產做多或做空。
2019 年 6 月 25 日,Synthetix 依賴的一份餵價報告稱,韓元的價格比真實匯率高出 1000 倍。由於價格預言機系統中其他地方的錯誤,這一價格被系統接受並發佈到鏈上,隨後一個交易機器人迅速進出這個 sKRW 市場。
儘管 Synthetix 團隊能與交易者協商,讓其返還資金(換取漏洞獎勵),但總的來說,這個機器人有能力賺取超過 10 億美元的利潤。
Synthetix 正確地執行了價格預言機,並從多個來源獲取價格,以防止交易者在價格變化發佈到鏈上之前預測價格變化。然而,一個孤立的上游餵價故障導致了一次毀滅性的攻擊。這說明了使用鏈外數據的價格預言機的風險:你不知道價格是如何被計算的,因此你的系統必須經過仔細設計,以便正確處理所有潛在的失敗模式。
低抵押借貸
如上面提到的,我在 2019 年 9 月發表了一篇文章,其中概述了使用鏈上數據價格預言機的相關風險。雖然我強烈建議你閱讀這篇文章,但是它的篇幅很長,技術細節也很繁重,這可能會讓人難以理解。因此,我會在這裡提供一個簡化的解釋。
想像一下,你把去中心化的借貸放到區塊鏈上。用戶可以將資產作為抵押品存放,也可以藉入其他資產,而能夠借入的最高金額由他們存入的資產價值決定。假設一個用戶用 ETH 作為抵押品,然後藉入 USD,目前 ETH 的價格為 400 美元,抵押率為 150% 。
如果用戶存入 375 ETH,則其存入的抵押品價值 15 萬美元,根據每 1.5 美元抵押品可藉入 1 美元的規則,那麼該用戶最多可以從系統那借款 10 萬美元。
當然,在區塊鏈上,這並不像簡單地聲明 1 ETH 值 400 美元那麼簡單,因為惡意的用戶可以簡單地聲明 1 ETH 價值 1000 美元,然後從系統中拿走所有的錢。因此,開發者很容易會去接入像 Uniswap 、 Kyber 或其他去中心化交易所(DEX)的現貨價格。
乍一看,這似乎是正確的做法。畢竟,無論何時你想買或賣出 ETH,Uniwap 的價格總是大致正確的,因為套利者很快就會糾正任何偏差。然而,事實證明,去中心化交易所(DEX)的即期價格在交易期間可能會非常不正確,如下面的示例所示。
思考一下 Uniswap 的存儲功能,價格以儲備資產金額為基礎計算,但由於用戶在 ETH 和 USD 之間交易,儲備所持有的資產會發生變化。如果惡意用戶在從平台貸款之前和之後執行交易,會怎樣?
在用戶貸款之前,他們以 200 萬 USD 的價格購買了 5000 ETH,現在,Uniswap 交易所計算的價格為 1 ETH = 2,600 USD 。現在,他們的 375 個 ETH 可以作為抵押,並藉取最高 65 萬美元的資產。最後,他們將 200 萬美元換回 5000 ETH,這將重置價格,而你的借貸平台則損失了 55 萬美元。
這個案例研究,說明了將去中心化交易所(DEX)用作價格預言機時遇到的最常見的錯誤—— 攻擊者在交易過程中幾乎完全控制了價格,而試圖準確讀取該價格就像在完成結算之前先讀取磅秤上的重量一樣。
你可能會得到錯誤的數字,根據具體情況,這可能會花費你很多錢。
2 、 Synthetix MKR 操縱
2019 年 12 月,Synthetix 再次遭受價格預言機操縱攻擊,值得注意的是,這次攻擊跨越了鏈上數據和鏈外數據的界限。
用戶名為 u/MusaTheRedGuard 的 Reddit 用戶觀察到,一名攻擊者對 sMKR 和 iMKR 進行了一些非常可疑的交易。攻擊者首先通過購買 sMKR 來做多 MKR,然後從 Uniswap ETH/MKR 資產交易對中購買大量 MKR 。在等待了一段時間後,攻擊者將他們的 sMKR 換成了 iMKR 空頭倉位,並將他們的 MKR 賣回 Uniswap 。然後他們重複了這個過程。
在幕後,攻擊者通過 Uniswap 進行的交易,允許他們隨意移動 Synthetix 上 MKR 的價格。這很可能是因為 Synthetix 所依賴的鏈外餵價,實際上依賴於 MKR 的鏈上價格,而且套利者沒有足夠的流動性來將市場重新設置到最佳條件。
這起事件說明了一個事實:即使你認為自己在使用鏈外價格數據,但實際上你可能仍然在使用鏈上價格數據,而且你可能仍然會因為使用這些數據,而遭遇到復雜的攻擊。
3 、 bZx 駭客事件
2020 年 2 月,bZx 在幾天內遭受兩次駭客攻擊,損失價值約為 100 萬美元。你可以這裡找到由 palkeo 編寫的關於兩次駭客攻擊的優秀技術分析文章,但我們在這只關注第二次攻擊。
在第二次駭客攻擊中,攻擊者首先使用 ETH 購買了 Kyber 上幾乎所有的 sUSD,然後,攻擊者從 Synthetix 平台購買了第二批 sUSD,並將其存放在 bZx 上。利用 sUSD 作為抵押品,攻擊者藉用了他們被允許的最大數量的 ETH,然後他們把 sUSD 賣回給了 Kyber 。
如果你注意到了,你會發現,這本質上是同樣的低抵押借貸攻擊,但使用了不同的抵押品和不同的去中心化交易所。
4 、 yVault 漏洞
2020 年 7 月 25 日,我報告了一個關於 yEarn 推出的新 yVault 合約的漏洞,你可以在這裡讀到關於這個漏洞的官方公告,但我將在下面簡要總結一下。
yVault 系統允許用戶在不需要自己管理的情況下存入代幣並賺取收益。在內部,這個金庫跟踪鑄造的 yVault 代幣的總金額以及存放的基礎代幣的總金額。單個 yVault 代幣的價值,由鑄造的代幣與存入的代幣的比率來確定。金庫獲得的任何收益,都會分攤到所有鑄造的 yVault 代幣上(因此,也會分攤到所有的 yVault 代幣持有者)。
第一個 yVault 允許用戶通過向 Balancer MUSD/USDC 儲備池提供流動性來獲得 USDC 收益。當用戶向 Balancer 提供流動性時,他們會收到 BPT 作為憑證(可用於贖回池中的資產)。因此,yVault 根據其 BPT 可贖回的 MUSD/USDC 金額計算其持有的價值。
這似乎是正確的實現,但不幸的是,與前面提到的原理相同—— 交易期間,Balancer 池的狀態是不穩定的,因此不可信任。在這種情況下,由於 Balancer 選擇的聯合曲線,在 USDC 和 MUSD 之間進行交換的用戶將不會獲得 1:1 的匯率,但實際上會在儲備池中留下一些 MUSD 。這意味著 BPT 的值可以暫時膨脹,這使得攻擊者可以隨意操縱價格並隨後耗盡金庫。
這一事件表明,價格預言機並不總是可靠的,開發者需要警惕他們正在攝取什麼樣的數據,並考慮這些數據是否可以被非特權用戶輕易操縱。
5 、 Harvest Finance 駭客攻擊
2020 年 10 月 26 日,一位匿名用戶用一種(現在你可能已猜到的)技術攻擊了 Harvest Finance 儲備池。你可以在這裡閱讀官方的分析報告,但我要再次為你總結下:攻擊者通過執行交易使得 Curve 池中的 USDC 價格降低,然後以降低的價格進入 Harvest 池子,通過逆轉先前的交易恢復價格,並以更高的價格退出 Harvest 池子。這最終導致用戶損失了 3300 萬美元。
如何自我保護?
現在,我希望你了解了價格預言機操縱攻擊,此外,如果你不採取適當的防禦措施,攻擊者可能會欺騙你的協議,讓其乖乖把錢交給他們。雖然目前並沒有適用於所有情況的解決方案,但還是有一些曾在其他項目中奏效的解決方案,也許其中一款也會適合你。
建議 1: 不跳入淺市場
就像跳入游泳池的淺水區一樣,跳入一個淺市場也是痛苦的,這可能會導致巨大的損失,從而永遠改變你的生活。在考慮具體的價格預言機計劃之前,先考慮一下代幣的流動性是否足以保證與你的平台集成。
建議 2:一鳥在手勝過兩鳥在林(意指到手的,才是真實的)
看到 Uniswap 上的潛在匯率可能會讓人著迷,但在你真正點擊「trade」按鈕,並將代幣放到錢包中之前,一切都不會是最終的。同樣,要確定兩種資產之間的匯率,最好的方法就是直接交換資產。這種方法很好,因為沒有撤消,也沒有假設。然而,對於貸款平台這樣的協議來說,它可能不起作用,因為這些協議需要保留原始資產。
建議 3:幾乎去中心化的預言機
總結依賴鏈上數據預言機所存在的一種問題是,它們的更新有點過快。如果是這樣,為什麼不引入一點人為的延遲呢?寫一個合約,用去中心化交易所(例如 Uniswap)的最新價格更新自己,但需要通過少數特權用戶。現在,即使攻擊者可以操縱價格,他們也無法利用這一點。
這種方法實現起來很簡單,而且很容易見效,但它也有一些缺點—— 在區塊鏈擁堵的時候,你可能無法按自己希望地那樣快速更新價格,而且你仍然容易受到三明治攻擊(sandwich attacks)。另外,現在,你的用戶還需要信任你會保持價格的更新。
建議 4: 增加最短延遲
操縱價格預言機是一種對時間敏感的操作,因為套利者總是在觀察,並希望有機會優化任何次優市場。如果攻擊者想把風險降到最低,他們會想在單筆交易中完成操縱價格預言機所需的兩筆交易,這樣套利者就沒有機會跳到中間。作為協議開發者,如果你的系統支持它,那麼只需要在用戶進入和退出系統之間實現一個最短的延遲就足夠了。
當然,這可能會影響可組合性,並且礦工與交易者的合作正在增加。在未來,不良行為者有可能在多筆交易中執行價格預言機操縱,因為他們知道礦工將確保沒有人能夠跳入中間並從中獲利。
建議 5:時間加權平均價格(TWAP)
Uniswap V2 引入了一種時間加權平均價格(TWAP)預言機,以供鏈上開發者使用。這篇文檔詳細地介紹了這種預言機提供的確切安全保證,一般來說,對於長時間沒有鏈擁堵的大型資產池,這種 TWAP 預言機對預言機操縱攻擊具有很強的抵禦能力。然而,由於其實施的性質,它可能無法對市場劇烈波動的時刻做出足夠快的反應,而且它只適用於具有鏈上流動性的代幣資產。
建議 6: M-of-N 報告者機制
有時候人們會說,如果你想把事情做好,就自己去做。那如果你把 N 個值得信賴的朋友集合起來,讓他們提交他們認為正確的鏈上價格,然後取 M 個最好的答案匯聚成當前價格,那會怎麼樣呢?
如今,很多大型項目都在使用這種方法:Maker 運行一組由可信實體操作的餵價,Compound 創建了 Open Oracle,並有像 Coinbase 這樣的預言機報價者,Chainlink 聚合了來自 Chainlink 運營商的價格數據,並在鏈上公開了這些數據。請記住,如果你選擇使用這些解決方案之一,那麼你現在已經將信任委託給了第三方,而你的用戶也必須這樣做。要求報價者在鏈上手動發布最新資訊也意味著,在市場高度波動及區塊鏈擁堵的時期,價格更新可能無法按時完成。
結論
價格預言機對於 DeFi 安全性而言,是一個重要,但經常被忽視的組成部分。安全地使用價格預言機是很困難的,有很多方法可以讓你以及你的用戶都措手不及。在這篇文章中,我們討論了一些價格預言機被操縱的例子,並確定在交易過程中讀取價格資訊可能是不安全的(從而導致可能的災難性財務損失)。我們還討論了其他項目在過去採用的,用於抵禦預言機價格操縱的一些技術。最後,每一種情況都是獨一無二的,你可能會發現自己不確定是否正確地使用了價格預言機。如果是這種情況,請隨時尋求建議。
(以上內容獲合作夥伴 火星財經 授權節錄及轉載,原文鏈接 )
聲明:文章僅代表作者個人觀點意見,不代表區塊客觀點和立場,所有內容及觀點僅供參考,不構成投資建議。投資者應自行決策與交易,對投資者交易形成的直接間接損失作者及區塊客將不承擔任何責任。