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

撰文: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 的家人。當保安要求看證據時,你向他們展示無可辯駁的證據—— 維基百科

知名白帽 Sam Sun 撰文詳述 DeFi 爲何頻發價格預言機操縱攻擊David Spargo 修改了 Peking Duk 的維基百科詞條,在「家庭成員」加上了自己的名字,名場面

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

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

什麼是價格預言機?

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

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

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

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

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

可能會出什麼問題?

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

Synthetix sKRW 預言機誤報

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

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

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

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

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

擔保不足貸款

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

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

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

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

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

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

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

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

用戶在你的平臺貸款之前,他們以 200 萬美元買入 5000 ETH。Uniswap 交易所現在計算價格爲 1 ETH = 1733.33 美元。現在,他們的 375 ETH 可以作爲抵押品,可以貸走 高達 43.3333 萬美元 的資產,然後他們用原來的 5000 ETH 換回 200 萬美元,重置 Uniswap 內的價格。結果是你的貸款平臺同意該用戶多借出了 33.3333 萬美元的無抵押貸款 。

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

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

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 的鏈上價格 ,而且沒有足夠的流動性使套利者推動市場迴歸最佳價格配置。

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

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

bZx 黑客攻擊事件

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

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

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

yVault 漏洞

2020 年 7 月 25 日,我向 yEarn 報告了他們新推出的 yVault 合同中的一個協議漏洞。你可以閱讀關於這一錯誤的 官方材料,但我會在下面簡要地總結一下。

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 的價值可以 暫時膨脹 ,這給了攻擊者惡意操縱價格的漏洞,然後以此抽乾金庫。

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

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

Harvest Finance 黑客事件

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

Harvest Finance 官方 事後剖析報告

我該如何保護自己?

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

淺水市場不要冒進

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

一鳥在手,勝過兩鳥在林

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 審閱本文。

來源鏈接:samczsun.com