爆料全文:Curve 被曝存在預言機操縱漏洞
作者:Daniel Von Fange
編譯:angelilu,Foresight News
昨日,獨立研究員 Daniel Von Fange 在 X 平台發文披露 Curve 存在預言機操縱風險,並且該風險在攻擊時很難被檢測出。預言機操縱行為會導致預言機報告關於外部事件或真實世界的錯誤數據,使接入預言機的協議也面臨操縱風險。Daniel Von Fange 表示已經通知可能受影響的相關團隊。
Curve 創始人 Michael Egorov 在社群中對該問題進行了回覆,稱「該風險可能存在於舊版本的池子,crvusd 中不使用舊版本的池,也不建議使用預言機。」還言論確認了 Daniel Von Fange 披露的風險確實存在。
但 Curve 貢獻者 fiddy 對於這名獨立研究者未經討論就公開發布這些信息的方式表示不滿,並發布澄清,稱 Daniel Von Fange 披露的漏洞此前他們已經私下討論過,但其認為攻擊者為了提高精度而增加 Gas 費成本較高,外部審計也將這一點歸類為低影響。並且該研究員披露的這個漏洞與 Curve 較舊的 cryptoswap 算法有關,該算法使用了 last_price 價格,但較新的 cryptoswap-ng 實現使用 AMM 狀態價格,可解決此類問題。除此之外,yAuditDAO 確實發現了一些預言機的錯誤,目前正在修復中,沒有人使用這些預言機,且這些穩定幣交易池中的 LP(流動性提供者)不受影響。
但已經有團隊根據其披露的風險開始對協議進行調整,增強安全性。Yearn Finance 開發者 @storming0x 也對 Daniel Von Fange 披露的風險做出回應,稱「Yearn 合約不受影響,除了一個使用了 Chainlink 的冗餘機制來減輕潛在攻擊路徑的合約。出於謹慎考慮,Yearn 開發團隊決定重新部署新版本。」
以下為 Daniel Von Fange 披露 Curve 預言機價格操縱風險的全文:
過去兩週,我深入研究了 Curve 的價格預言機,發現了一些極其異常的行為。
這些預言機的運作方式並非如你所想,它們比預期更容易被操縱,並且在正常情況下也可能出錯。
簡要概述:在大多數池中,攻擊者只需在一個區塊,就能將 Curve 的價格預言機操縱至高出正常價格 10 倍至 500 倍。並且這種操縱可以被隱藏起來,以至於查看池子時根本無法發現其被操縱的跡象。
Curve 池子數量居多,目前還沒有人能準確統計出不同池子代碼庫的數量。
我所寫的內容可能適用於某些特定池子,也可能不適用。不同的池子有不同的漏洞。或許有些池子沒有任何漏洞。
Curve 團隊在接收報告、討論時表現出色,並在幾分鐘內確認了 CrvUSD 不受這些問題影響。
我還檢查了主網上大約 100 個使用 Curve 價格預言機的合約,並酌情通知了相關團隊。
該漏洞的一個關鍵問題是,當價格不接近 1:1 或者手續費較高時,last_price 可能被錯誤計算。
首先,手續費沒有包含在 last_price 計算中,這使得它使用的數字與實際交易或池子餘額的數字不同。
EMA 價格預言機受 lastprice 驅動。當 lastprice 出錯時,價格預言機將開始朝錯誤的目標價格移動。
在正常交易中,我見過價格預言機定位的價格比池中的實際當前價格偏離超過百分之一。最壞情況可能會更糟(圖表中的標準化化價格)。
根據池子的不同,這種漂移誤差可能高於或低於實際價格。
最大的问题是,在操縱期間,last_price 誤差可能比實際操縱的價格高出一個數量級,使池預言機被有效操縱的可能性提高大大提高。
哪怕是一筆極小的交易,也能糾正最後價格 / 預言機價格中的偏差,導致了一些荒謬情況。
由於大幅價格波動和 last_price 計算錯誤的疊加效應,攻擊者可以在下一個區塊中操縱 EMA 價格預言機,且不需要耗費巨大成本在數十個區塊中維持高價來對抗套利者。
理論上,攻擊者可以控制兩個連續區塊的挖掘,這對於實現這一操作是必需的。攻擊者需要有足夠的資本進行這種價格攻擊,但許多過去的攻擊者手中都有數千萬美元的資金。
接下來,讓我們來談談常見的防禦 Curve 價格預言機操縱的策略,以及它們的效果。
Curve v1 池子有四個數字可以用來嘗試檢測操縱,實際價格、價格預言機、lastprice 和 EMA 價格。不幸的是,一次操縱之後,對操縱 priceoracle 價格的單筆交易可以將所有這些重置為相同的數字。
Curve v2 池子的 pricescale 比價格預言機更難操縱。它的變化速度更慢,需要實際的交易費用成本才能移動。如果這個快速價格預言機和慢速 pricescale 匹配,那麼情況就穩定了,對嗎?
不!核心攻擊問題是使三個數字,實際價格、快速預言機和慢速規模對齊。實際價格很容易控制,因為它可以立即被操縱。那麼問題就變成了在其他兩者之間設計一個交點。
攻擊者將價格短暫抬高,然後在下一個區塊恢復正常,並等待幾個區塊進行攻擊,直到下降的價格預言機遇到上升的 pricescale。實際價格只需在一個區塊中被維持在高位,就足以擾亂預言機,而 pricescale 則會跟隨。
許多預言機使用上限,將它們從 Curve 預言機價格中使用的價格限制在為 1:1 的最高值。這很好,並且排除了愚蠢的高值。但請注意,如果資產實際脫鉤,攻擊者可以低價購買資產,然後通過操縱使其看起來重新掛鉤。
協議有時會設定一個最低限度,如果 Curve 價格預言機的響應低於掛鉤的一定百分比,就會忽略它。但如果在資產真正脫鉤時忽略價格,那就會失去擁有價格預言機的全部目的。
另一種常見策略是將另一個 AMM 系統的價格混合進來。這在很大程度上取決於其他池子的質量和操縱特性。如果它的流動性較低、更易於操縱,那麼就沒有達到目的。
糟糕 + 糟糕=糟糕。
用於穩定幣 / 穩定幣交易對的新型 Curve 池內部限制了 lastprice 到 1:1 值的 2 倍。這可以阻止一次區塊攻擊,因為 lastprice 不能被推到愚蠢高的值,從而使 EMA 超載。
但如果錯誤資產合法脫鉤,那就錯了。
如果你想使用 Curve 池來定價抵押資產,你可能不應該這樣做。
新型池子通常有更高的攻擊成本。如果被操縱的池對市場影響較小(可能只是為了保護收益分配),並且針對池模擬的攻擊成本很高,那麼就可以選擇使用。
最後,作者建議這對使用的池子進行實際攻擊模擬,不要基於假設或理論來預判價格預言機的行為,而應該在實際使用的池上進行詳細的模擬測試。通過模擬操縱攻擊,可以更好地了解池子在不同情況下的表現。
下圖是過去 90 天 Curve 預言機使用量增加的圖表:
有些 Curve 池子擁有表現出色的價格預言機,我無法讓它們表現出任何奇怪的行為,它們完全符合良好表現的 EMA 所應有的預期。但仍需要去檢查……