Harvest.Finance攻擊事件分析

買賣虛擬貨幣
流動性挖礦(Yield Farming)是近期DeFi領域中的最熱話題,以各種食物為主題的流動性挖礦似乎每日都能湊成一桌饕餮盛宴,大爆炸式地將新的DeFi概念灌輸給投資者與使用者。每天新的流動性挖礦專案都會出現,同時舊專案也在退出人們的視野。對於這些專案“新人哪聞舊人哭”的快速交替,身為以建立區塊鏈健康安全生態為己任的CertiK,希望給大家帶來更有價值的問題和答案:當我們在討論流動性挖礦專案安全性的時候,討論點和關注點都應該是什麼?安全這個話題難以簡單概述,非細緻的講解不能窺探一二。本文在此以Harvest.Finance為例,分析作為流動性挖礦專案其存在的安全風險。Harvest.Finance,它的名字非常直觀的說明了其設計意圖 ——流動性挖礦。該專案的程式碼已經開源,網站社羣等也一應俱全。儘管Harvest.Finance的審計報告已公佈,其專案中被審計部分的安全性目前可以被信任,但是這並不能說明Harvest.Finance的整體安全性得到了保障。

CertiK安全研究團隊從該專案智慧合約出發,發現了該專案中存在與其他類似流動性挖礦專案同樣的問題:治理中心化,即許多關鍵操作只允許專案管理者來進行,沒有任何對專案限制者的限制手段,例如:

參考連結:
https://github.com/harvest-finance/harvest/blob/master/contracts/DelayMinter.sol

參考連結:
https://github.com/harvest-finance/harvest/blob/master/contracts/Governable.sol

參考連結:
https://github.com/harvest-finance/harvest/blob/master/contracts/Storage.sol

圖1中第102行起的函式executeMint()的功能是進行鑄幣操作,由於onlyGovernance的限制,使得只有於onlyGovernance許可的地址可以執行該函式,而onlyGovernance的定義來自於圖2中14行與圖3中27行的程式碼,最終從圖3的28行可以看到所謂的“Governance”其實僅是指專案擁有者本身,並不是如名稱所暗示指代一個管理委員會。

透過觀察程式碼可以瞭解到,該專案的治理與重要操作的控制權都被專案管理者據有,中心化程度極高,而這一點明顯違背了以去中心化為基本的流動性挖礦專案的本質。

即便專案管理者加入了一個延遲操作的功能,並設定了每一個鑄幣操作都需要提前公佈給社羣,這依舊無法從根本上解決問題。尤其是當Harvest.Finance專案把延遲的時間期限設定為12個小時,這也違背了大部分人的作息規律。

除了專案的治理中心化程度過高的通病,流動性挖礦專案同樣存在被套利攻擊的風險。

套利攻擊是利用價格差進行低買高賣完成的以獲利為目的的交易行為。已經發生過套利攻擊的著名專案有Balancer和bZx。

10月26日Harvest.Finance專案也發生了套利攻擊事件,損失超3380萬美元。

對於此類攻擊,需要弄清兩個問題:

1. 發生套利攻擊的條件是什麼?
2. 為什麼Harvest.Finance專案滿足了這些條件?

發生套利事件需要的條件其實非常直觀:可以完成低買高賣。

簡化來說就是可以透過自己的交易或者操作來影響交易物的價格。

這種交易影響價格的手段可以是直接改變,也可以是改變交易物的數目來間接的影響價格。

流動性挖礦專案自身透過交易來鑄幣或者燃燒幣的操作,十分容易滿足改變交易物的操作要求。

一旦套利攻擊者發現了可利用的攻擊點,可以在沒有風險的情況下當即利用閃電貸借取大額資金,將套利攻擊的獲利擴大。

參考連結:
https://etherscan.io/tx/0x35f8d2f572fceaac9288e5d462117850ef2694786992a8c3f6d02612277b0877

圖4所示交易是在此次發生於Harvest.Finance專案的套利攻擊的其中一筆交易,攻擊者透過檢視該專案智慧合約中控制鑄造fUSDC代幣數目的函式,發現鑄造的代幣數目依賴於其參考的Curve專案的計算公式,繼而依靠閃電貸獲得大量初始資金進行套利攻擊。

攻擊者的執行交易的流程大致如下:

1. 閃電貸借貸得到大筆USDC和USDT;
2. 利用借貸所得USDT透過Curve轉換為USDC,提高USDC價格 ;
3. 將獲得的USDC存入Harvest.Finance專案的USDC儲藏室(vault)中, 同時Harvest.Finance會為該存入的行為攻擊者鑄造一定數目的fUSDC(鑄造的數目受Curve影響);
4. 將初始借貸所得的USDC透過Curve轉換為USDT,提高USDT的價格,同時USDC價格降低 ;
5. 最終攻擊者將持有額所有fUSDC轉換回USDC,此時因為Curve中的USDC價格降低,導致影響了兌換回USDC的數目增加。

最終攻擊者利用類似操作,完成了14筆利用針對USDC的套利交易,然後利用同樣的思路,針對USDT完成了另外13筆套利交易。

根據官方報告,計算了攻擊者返還給專案的1300萬USDC和11萬USDT之後,總損失超過2億人民幣。

在Harvest.Finance這次的套利攻擊事件中,攻擊者透過影響USDC、USDT代幣的價格來進行套利。

因此,專案代幣價格不能簡單的依賴於其相對數目,而應該穩定建立於實時、有效、可靠的價格提供系統之上。例如目前的chainlink的價格預言機便可以一定程度上解決此類隱患。

當討論一個流動性挖礦專案的安全性時,不應僅僅簡單的檢視程式程式碼、智慧合約的安全,而需要檢視更加深層的、邏輯性的漏洞,例如治理中心化以及代幣價格控制邏輯可能導致的套利攻擊風險。

傳統的程式碼審計並不適合包括流動性挖礦在內的區塊鏈專案。

面對此類專案,需要有經驗豐富的區塊鏈專案專業審計人員,從傳統程式碼審計、邏輯審計、金融模型審計等多角度對專案的安全進行逐步且完備的稽覈,才可確保專案的安全。

迄今為止,CertiK已為超過200名機構使用者提供了優質服務,保護了超過80億美元的數字資產與軟體系統免受安全損失。

免責聲明:

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

推荐阅读

;