yearn被攻擊過程解說
準備踏入牛年,幣市的大新聞除了ETH牛氣充天之外,相信就是yearn日前被攻擊而損失11M美金。我粗略讀了一些專家的分析,有一個大概的理解,想嘗試用比較淺白的文字解釋給各位(如有錯漏請指正)。
背景:先了解AMM資金池
先講一講背景,加密貨幣自動交易所(Automatic Market Maker, AMM)能夠做到貨幣兌換,是依靠用戶將特定貨幣存入至流動資金池。例如今次的主角 Curve 3pool,能處理 DAI / USDC / USDT 三種貨幣之間的兌換,背後就是靠用户存入這三種貨幣。(註:用户會存進去是因為兌換的手續費會攤分給提供流動資金的人)
AMM一般都有應付貨幣比例失衡的機制,透過存款獎賞及提款收費來鼓勵資金提供者積極維持資金池的平衡。當資金池的某種貨幣比例降低,存入此貨幣會有額外手續費回報,而提取此貨幣則會被扣掉一點點(slippage)。今次攻擊就是利用這個機制,製造巨大比例失衡,令yearn蝕錢給Curve,而攻擊者則透過Curve來賺取(或者叫搶走)yearn的資金。
攻擊手法解說
整個攻擊大概可以分三階段:
(為了簡潔,下文省略實際數字,如果想詳細了解,可以參考文末的參考資料)
準備
- 到dydx及Aave借閃電貸(Flash Loan),短暫借取大量ETH
- 到Compound將ETH抵押為DAI及USDC
- 將部份DAI及全部USDC存入Curve
攻擊
- 由Curve提取大量USDT,形成貨幣比例失衡(DAI及USDC遠高於USDT)
- 將手上剩餘的DAI存入yearn(yearn會轉存入Curve)
- 在Curve存入大量USDT,反轉貨幣比例(DAI及USDC遠低於USDT)
- 由yearn提取DAI,由於Curve上DAI比例極低,所以出現嚴重slippage,Curve實際能提取的DAI變少了
- 重複上述四步,讓yearn蝕錢給Curve
收割
- 攻擊五次後,從Curve提取USDC及DAI,其中DAI比最初存入為多,因為包含yearn蝕給Curve的DAI
- 到Compound償還DAI及USDC
- 到dydx及Aave償還ETH閃電貸
- 償還後剩下的DAI就是攻擊者的收獲
或許你已經發現,根據上述的攻擊原理,yearn損失的11M美金並非全部落入攻擊者手中。是的,根據 twitter 用户 @FrankResearcher 的分析,攻擊者的收獲大概為2.7M,只佔yearn損失的大約四份一,其餘其實用作支付Curve手續費以及償還Aave閃電貸利息。
為何攻擊能成立?
這個攻擊能夠成事,時間是相當重要。攻擊者上面的一大堆動作,究竟花了多長時間呢?答案是一刹那,一個交易,就已經完成。智能合約能夠將多項交易合併為一個交易,例如提款、兌換然後轉帳可以「一take過」,以一個交易完成。這次攻擊者就將上面那堆繁複的交易全部合併在一起,一次過執行,整個過程瞬間完成。
整個攻擊以借閃電貸開始,又以還閃電貸結束,究竟甚麼是閃電貸(Flash Loan)呢?就是利用智能合約能合併交易的能力,在一次交易內先借再還。過去在加密貨幣的世界,要借貸就必需提供抵押品,例如抵押ETH借出DAI。但閃電貸由於資金在借出的一瞬間就立刻歸還,所以是毋須抵押品,可以說是憑空變出龐大資金。閃電貸這發不單是用來攻擊他人,亦有其他場合的應用,有興趣可以參考更多網上資料。
不得不提,還有另兩個讓這次攻擊能成事的條件。第一是剛好遇着yearn從v1過渡至v2,暫時豁免v1提款手續費,攻擊者才會肆意多次大額提取,從yearn刮取資金。第二是Curve平台沒有設立slippage上限,令資金池嚴重失衡時出現極高slippage,形成此漏洞。
被攻擊後yearn怎樣處理?
我在BB班一直強調,任何投資都有其風險。yearn就有如虛擬投資經理,每一個vault背後有一套投資策略幫用户獲得較高回報,yearn亦一直提醒參與者注意風險(所以BB班系列最終亦沒有推介yearn)。今次的事件就有如投資經理失誤,如果是發生在傳統金融機構,或許是由投資公司承擔損失,或者是要訴諸法庭。而yearn是一個由社群共同管理的組織,首先在問題發生後大約十分鐘立即把漏洞堵塞了,之後社群在管治論壇上商討處理手法,究竟如何協助受影響的用户,同時平衡其他參與者的利益。用戶應該繼續保持持有yDAI,等待社群的決定。如果提款回DAI,那麼損失就無可挽回了。受影響的用戶,建議多加留意管治論壇上的最新討論,並積極參與。
參考資料
- 完全攻擊流程:https://twitter.com/FrankResearcher/status/1357464851531116544
- 關鍵攻擊流程解說:https://twitter.com/bkiepuszewski/status/1357483610652213249
- yearn流失資金分佈:https://twitter.com/FrankResearcher/status/1357639434380992512
舊文:加密貨幣走資賺息BB班
1. 大圍吹水篇
2. 銀包及找換店篇
3. 兌換加密貨幣篇
4. 穩定幣及找換店篇
5. 保守型存款生息篇(上)
6. 保守型存款生息篇(下)
7. 埋尾畢業篇
原文連結死火手記