知名白帽 Sam Sun 撰文詳述 DeFi 為何頻發價格預言機操縱攻擊

買賣虛擬貨幣

讀懂價格預言機的一切,學會如何安全地使用它們。

撰文:Sam Sun,知名白帽,加密風投機構 Paradigm 研究合夥人

編譯:Perry Wang

Paradigm 授權鏈聞翻譯並發表該文章中文版本。

2019 年末,我發表了一篇題為《從抵押不足貸款取樂並牟利》(Taking undercollateralized loans for fun and for profit)的帖子。我在文中描述了依賴於一個或多個代幣的準確價格資料,對以太坊去中心化應用 DApp 的一次經濟攻擊。當前是 2020 年末,不幸的是,許多專案已經出現了非常相似的錯誤,最近的例子是 Harvest Finance 遭駭客攻擊事件,導致協議使用者集體損失 3300 萬美元。

雖然開發者熟悉重入 reentrancy 等漏洞,但他們顯然沒有經常考慮價格預言機遭操縱的問題。相反,多年來基於 reentrancy 的漏洞已經下降,而基於價格預言機操縱的漏洞現在呈上升趨勢。因此,我決定是時候得有人對有關這類操縱給出明確資源以提高安全意識。

本文分為三個部分。對於不熟悉這個主題的讀者,這是一篇關於預言機和預言機操縱介紹的科普文章。那些想要測試知識水平的讀者可以直接跳到案例研究,我們回顧一下過去一些與預言機相關的漏洞和攻擊事件。最後我們總結一些開發者可以應用的技術,以保護他們的專案免受價格預言機操縱途徑的攻擊。

什麼是預言機操縱事件?

打個真實案例比方

2015 年 12 月 1 日,星期三。你的名字叫 David Spargo ,當時正在澳大利亞悉尼觀看澳洲「電音黑馬」Peking Duk 的音樂會。你可能想親眼見到這支樂隊,但兩名安保人員擋住了你前往後臺的去路,他們完全不可能讓一個普通路人大搖大擺走進後臺。

你可能想,如果你表現得像是後臺人員,保安人員會有什麼反應。家庭成員肯定會被允許參觀樂隊後臺,所以你只需要的是說服保安你是樂隊成員的一個親戚。你考慮了一下,想出了一個計劃,可能被稱為天才計劃,也許是極為拙劣。

準備妥當後,你自信地走向保安。你介紹自己叫 David Spargo,Peking Duk 的家人。當保安要求看證據時,你向他們展示無可辯駁的證據——維基百科。

David Spargo 修改了 Peking Duk 的維基百科詞條,在「家庭成員」加上了自己的名字,名場面:https://en.wikipedia.org/w/index.php?title=Peking_Duk&oldid=693419023

保安揮手讓你透過,並讓你等待。一分鐘,兩分鐘。五分鐘後,你想知道在警察露面之前是否該趕緊跑掉。當你正要離開時,樂隊成員之一的 Reuben Styles 走過來做了自我介紹。你和他一起走到後臺休息室,樂隊對你的聰明才智印象深刻,最後和你一起喝了幾杯啤酒。稍後他們還在 Facebook 頁面上分享了所發生的事情。

什麼是價格預言機?

價格預言機,籠統地說,是你諮詢價格資訊的東西。拿美劇《Office》中的劇情打個比方,當 Pam 向 Dwight 詢問 Schrute Buck 的現金價值時,Dwight 則充當了價格預言機的角色。

在以太坊區塊鏈中,一切都是智慧合約,所以也是價格預言機。因此區分價格預言機如何獲取其價格資訊更有用。一種方法是隻需從價格 API 或交易所中收集現有的鏈下價格資料,即可將這些資料引進到鏈上。另一種方法可以透過諮詢鏈上去中心化交易所來計算瞬時價格。

兩種選擇各有優缺點。鏈下資料對波動性的反應通常較慢,根據你嘗試使用它的用途,這可能是好事,也可能是壞事。不過通常需要少數特權使用者將資料推送到鏈上,因此你必須相信他們不會變得邪惡,也不會被迫推送不良資訊。鏈上資料不需要任何特權即可訪問,並且始終是最新的,但這意味著攻擊者很容易操縱它,可能導致災難性故障。

可能會出什麼問題?

簡單看看一些整合不良的價格預言機對 DeFi 專案造成嚴重財務損害的案例。

Synthetix sKRW 預言機誤報

Synthetix 是一個允許使用者接觸到其他貨幣資產的衍生品平臺。為了撮合此類交易,Synthetix (當時)依賴於一個自定義的鏈下價格饋送實現機制,其中按照一組秘密價格饋送來計算彙總價格,按固定的時間間隔在鏈上釋出。然後允許使用者以這些價格對其支援的資產做多或做空頭寸。

2019 年 6 月 25 日,Synthetix 所依賴的價格源之一誤報了韓元的價格,比真實匯率高出 1000 倍。而由於價格預言系統其他地方的其他錯誤,這個價格被系統接受併發布在鏈上,其中一個交易機器人在 SKRW 市場快速進行買賣交易。

這個自動交易機器人最終賺取超過 10 億美元的利潤,雖然 Synthetix 團隊能與交易者談判返還了資金,取而代之給予其糾錯賞金。

Synthetix 正確執行了預言機合同,從多個資料來源引入報價,以防止交易者在鏈上釋出之前預測到價格變化。然而一個上游價格饋送故障的孤立案例,導致了毀滅性的攻擊。這說明了使用鏈下資料價格預言機的風險:你不知道價格是如何計算的,因此必須仔細設計系統,以便能正確處理所有潛在的故障模式。

擔保不足貸款

如前所述,我在 2019 年 9 月發表了一篇帖子,概述了使用鏈上資料的價格預言機的相關風險。雖然我強烈推薦閱讀原貼,不過其中有相當多且複雜的技術細節,可能使其難以消化。因此我在這裡提供一個簡化的解釋。

假設你希望將去中心化貸款引入區塊鏈。使用者可以將資產作為抵押品存入,並借入由其存入的資產價值決定的、一定金額的其他資產。假設使用者希望以 ETH 作為抵押品借入美元,ETH 的當前價格為 400 美元,抵押比率為 150%。

如果使用者存入 375 ETH,相當於存入 15 萬美元的抵押品。他們可以按每抵押 1.5 美元借走 1 美元,所以他們可以從系統中借到不超過 10 萬美元。

當然在區塊鏈中,不像簡單地宣告 1 ETH 價值 400 美元那麼簡單,因為惡意使用者可以簡單地宣告 1 ETH 價值 1000 美元,然後從系統偷走所有的錢。因此對於開發者來說,非常需要最近的價格預言機的介面,如 Uniswap、Kyber,或其他去中心化交易所中的當前現貨價格。

乍一看,這似乎是正確的做法。畢竟,每當你想購買或賣出 ETH 時,Uniswap 的價格總是大致正確的,因為任何偏差都會被套利者迅速糾正。但是事實證明,去中心化交易所的現貨價格在交易期間可能非常錯誤,如下例所示。

考慮一下 Uniswap 留存資產的函式公式。其內部報價是根據儲備持有的資產量計算,但隨著使用者在 ETH 和 USD 之間交易,儲備資產不斷變化。如果惡意使用者在從你的平臺獲得貸款之前和之後執行交易,會怎麼樣?

使用者在你的平臺貸款之前,他們以 200 萬美元買入 5000 ETH。Uniswap 交易所現在計算價格為 1 ETH = 2600 美元。現在,他們的 375 ETH 可以作為抵押品,可以貸走高達 65 萬美元的資產,然後他們用原來的 5000 ETH 換回 200 萬美元,重置 Uniswap 內的價格。你的貸款平臺則損失了 55 萬美元。

這一案例研究說明了使用去中心化交易所作為價格預言機時最常見的錯誤:攻擊者在交易期間幾乎完全控制了價格,要想準確讀取該價格,就像在物品穩定之前讀取重量計的讀數一樣。你可能會得到錯誤的數字,在一定情況下,可能會讓你損失慘重。

Synthetix MKR 操縱

2019 年 12 月,Synthetix 再次遭受價格預言機操縱式攻擊。值得注意的是,此次攻擊突破了鏈上價格資料與鏈下價格資料之間的障礙。

Reddit 使用者 u/MusatheRedGuard 觀察到,攻擊者正在針對 sMKR 和 iMKR (反向 MKR)進行一些非常可疑的交易。攻擊者首先透過買入 sMKR 而間接購買了 MKR 的多頭頭寸,然後從 Uniswap ETH/MKR 交易對購買了大量 MKR。等待了一段時間後,攻擊者售出其 sMKR 換成 iMKR,然後將 MKR 賣回給 Uniswap。然後他們重複了這個過程。

在幕後,攻擊者透過 Uniswap 進行交易,使其可以在 Synthetix 協議中移動 MKR 的價格。這可能是因為 Synthetix 所依賴的鏈下價格饋送實際上依賴於 MKR 的鏈上價格,而且沒有足夠的流動性使套利者推動市場迴歸最佳價格配置。

該事件說明了這樣一個事實,即儘管你認為你使用的是鏈下價格資料,實際上可能仍在使用鏈上價格資料,並且仍然可能面臨使用這些資料所涉及的複雜情況。

bZx 駭客攻擊事件

2020 年 2 月,bZx 協議在幾天內遭到兩次駭客攻擊,被駭客掠走約 100 萬美元。在這裡你可以看到一篇有關兩次駭客攻擊事件的優秀技術分析,但我們本文將只討論第二次駭客攻擊。

在第二次駭客攻擊中,攻擊者首先使用 ETH 購買了 Kyber 協議中幾乎所有的 SUSD。然後攻擊者從 Synthetix 本身購買了第二批 SUSD,並存放在 bZx 上。攻擊者使用 sUSD 作為抵押品,貸取了所能允許的最大金額 ETH。然後他們把 sUSD 賣回給了 Kyber。

如果你一直在關注,你會認識到這基本上是相同的抵押不足貸款攻擊套路,只是使用了不同的抵押品和不同的去中心化交易所。

yVault 漏洞

2020 年 7 月 25 日,我向 yEarn 報告了他們新推出的 yVault 合同中的一個協議漏洞。你可以閱讀關於這一錯誤的官方材料(https://www.palkeo.com/en/projets/ethereum/bzx.html),但我會在下面簡要地總結一下。

yVault 系統允許使用者存入代幣並賺取收益,而無需自己管理代幣。在 yVault 內部,金庫跟蹤 yVault 代幣鑄造的總量以及存入的底層代幣的總金額。單個 yVault 代幣的價值取決於鑄造的代幣與存入代幣的比率。金庫賺取的所有收益都由所有鑄造的 yVault 代幣平分(藉此由所有的 yVault 代幣持有者平分)。

第一個 yVault 允許使用者利用 USDC 向 Balancer 協議中的 MUSD/USDC 流動性池提供流動性來賺取收益。當使用者向 Balancer 池提供流動性時,將獲得 BPT 作為回報,該 BPT 可以兌換流動性池中的一部分資產。因此,yVault 根據可使用 BPT 贖回的 MUSD/USDC 金額計算其持有的價值

這一實施似乎正確無誤,但不幸的是,我們前文提到的危險原則同樣適用:交易期間 Balancer 流動性池的狀態不穩定,其價格無法信任。在這種情況下,由於 Balancer 選擇的聯合曲線,使用者從 USDC 交換到 MUSD 不會得到 1:1 的匯率,但實際上會在流動性池中留下一些 MUSD。這意味著 BPT 的價值可以暫時膨脹,這給了攻擊者惡意操縱價格的漏洞,然後以此抽乾金庫。

這一事件表明,價格預言機並不總是很方便,開發者需要警惕它們正在攝入的資料型別,並考慮這些資料是否可以被非特權使用者輕鬆操縱。

Harvest Finance 駭客事件

2020 年 10 月 26 日,一名未知使用者採用一種你可能已經可以猜到的技術入侵了 Harvest Finance 的流動性池:攻擊者透過執行交易來打壓 Curve 協議流動性池中的 USDC 價格,以降低後的價格進入 Harvest 流動性池,再透過逆向操作先前的交易來恢復價格,然後以更高的價格退出 Harvest 流動性池。這給 Harvest 流動性池造成超過 3300 萬美元的損失。

Harvest Finance 官方事後剖析報告:https://medium.com/harvest-finance/harvest-flashloan-economic-attack-post-mortem-3cf900d65217

我該如何保護自己?

截至目前,我希望你已經學會了識別其共性:它並不總是很明顯,你使用價格預言機,如果你不遵循適當的預防措施,攻擊者可以騙過你的協議,捲走很多錢。雖然沒有一勞永逸的解決方案,但下面是過去一些專案行之有效的解決方案。也許其中一個也適合你。

淺水市場不要冒進

就像跳水落到泳池的淺端一樣,跳入淺水市場也是痛苦的,可能導致大量的開支,並永遠改變你的生活。在考慮計劃使用的特定價格預言機的複雜性之前,請考慮代幣是否足夠具有流動性,足以保證與平臺整合。

一鳥在手,勝過兩鳥在林

Uniswap 上的潛在匯率可能亂花漸欲迷人眼,但在落袋為安之前,那些不過是鏡中花,水中月。同樣,確定兩種資產之間匯率的最佳方法就是直接交換資產。這種方法很棒,因為沒有回收,也沒有不確定因素。但是這種做法對於需要持有原始資產的貸款平臺可能不起作用。

近乎去中心化的預言機

依賴鏈上資料的預言機總結起來一個問題就是它們有點太新。如果是這樣的話,為什麼不人為引進一些延遲呢?編寫一份智慧合約,採用 Uniswap 等去中心化交易所的最新價格進行更新,但僅在少數特權使用者請求時更新。現在即使攻擊者可以操縱價格,他們也無法讓你的協議來實際使用它。

這種方法簡單易用,而且能快速奏效,但還是有一些缺點:在區塊鏈擁堵的時候,你可能無法按期望的速度更新價格,仍然容易受到三明治攻擊。此外你的使用者需要相信,你會實際保持價格更新。

減速帶

操縱價格預言機是一個時間極為敏感的操作,因為套利者時刻在關注,並希望有機會最佳化任何次優市場。如果攻擊者想要將風險降至最低,需要執行在單筆交易中執行操縱價格預言機所需的兩筆交易,這樣套利者就不可能在中間橫插上一腳。作為協議開發者,如果你的系統能支援,則只需在使用者進入和退出系統之間部署短至 1 個區塊的延遲就足以阻擋。

當然這可能會影響協議的可組合性,而礦工與交易者聯手作惡也在不斷增多。將來壞因子有可能在多個交易中執行價格預言機操縱,因為他們知道,他們合作的礦工將保證沒有人可以在中間插入,從其盈利中分一杯羹。

時間加權平均價格 TWAP

Uniswap V2 引入了一個 TWAP 預言機,供鏈上開發者使用。該文件詳細介紹了這一預言機提供的確切安全保證,一般而言,對於長時間沒有區塊鏈擁堵的大型流動性池,TWAP 預言機具有高度的抗預言機操縱攻擊的能力。但是,由於其實施的本質,可能對市場波動性巨大的時刻反應不夠迅速,且只適用於鏈上已有流動代幣的資產。

M-of-N 報價

有時他們說,如果你想做正確的事,最好自己幹。如果你召集 N 個信任的朋友,並請他們提交他們認為正確的鏈上價格,而最好的 M 答案作為當前價格,那會如何呢?

這種方法現在被當前許多大型專案採用:Maker 執行一組由受信任實體操作的價格源,Compound 建立 Open Oracle 及Coinbase 這類特約報價者,Chainlink 聚合來自 Chainlink 運營者的價格資料,並在鏈上公開它。請記住,如果選擇使用這些解決方案之一,你現在已將信任委派給第三方,你的使用者也只能這樣做。要求報價者手動釋出鏈上更新也意味著在市場波動性大和區塊鏈擁堵期間,價格更新可能無法準時到達。

總結

價格預言機對於 DeFi 安全性至關重要,但經常被忽視。安全地使用價格預言機是一道難題,有很多方法同時兼顧你自己和你的使用者。在這篇文章中,我們介紹了曾經發生的價格預言機操縱攻擊案例,並證實在交易過程中讀取價格資訊可能是不安全的,可能導致災難性的財務損失。我們還討論了其他專案用於打擊價格預言機操縱的一些技術。歸根結底,每一種情況都是獨一無二的,你可能會發現自己不確定目前對價格預言機的使用是否正確。如果是這樣的話,請隨時與我們聯絡尋求建議。

特別感謝 Dan Robinson 和 Georgios Konstantopoulos 審閱本文。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;