原文標題:《 2 億美金損失,Euler Finance 黑客攻擊溯源 》
原文作者:0xNorman
本篇文章主要對 2023.3.13 日發生的 Euler Finance 被攻擊事件進行分析和溯源。希望對項目方,投資者,安全工程師以及整個區塊鏈行業起到警示和反思的作用。
造成 Euler Finance 被攻擊的關鍵因素在於健康分數(healthScore)這一變量上。這是用來衡量用戶資產健康水平的一個變量。在一般的 transferFrom()函數方程裏,這個變量會被用作限制以防壞賬。但是在eIP-14引入的 donateToReserves() 函數裏,並沒有這樣的限制。這意味着用戶可以隨意給 Euler 捐款,並且使自己的賬戶產生壞賬。
此外,Euler 的清算過程包括清算折扣 (liquidation discount)。當清算人對一個資不抵債的賬戶進行清算時,會根據該賬戶的健康評分進行折扣。健康分數越低,折扣就越大。
如果資不抵債情況嚴重,那麼清算者就可能在不支付任何債務的情況下得到抵押品。
溯源在Etoken.donateToReserves()缺少健康分數審覈,導致用戶可以造成資不抵債的情況。

在liquidate()裏用健康評分來作清算折扣的設計使得任何人都可以對資不抵債的賬戶清算,並且在不償還債務的情況下得到抵押品並轉換成現金。

攻擊者的交易細節可以在Etherscan上查看,以下是還原。
第一步:製造一個資不抵債的賬戶
將 2 千萬 DAI 存爲 eDAI
用 2 千萬 eDAI 作爲抵押,借出 2 億 eDAI
償還 1 千萬 DAI(用來提高健康分數並且再次借款)
再借出 2 億 eDAI
捐贈 1 億 eDAI,這樣資產和債務就分別是 3.2 億 eDAI 以及 3.9 億 dDAI.
攻擊者在這裏先是創造一個擁有巨大抵押和欠債的賬戶,抵押是 4.2 億 eDAI(存入了 2 千萬,借了兩次 2 億),欠債是 3.9 億 dDAI(借了 4 億,還了 1 千萬)。
然後攻擊者捐了 1 億 eDAI 出去,導致了 7 千萬的壞賬(3.2 億 eDAI-3.9 億 dDAI),目前賬戶是資不抵債的狀態。
第二步:清算該賬戶
調用 Liquidation.liquidate() 函數
RiskManager.computeLiquidity() 被調用來計算清算折扣
由於破產賬戶深陷債務,有效清算折扣爲 20%。
通過承擔 2.54 億的 dDAI 債務,清算者得到 3.17 億的 eDAI(2.54/3.17==0.8)。
清算者提取了 3890 萬 eDAI(能提取的最大金額),並未償還債務。
通過清算,破產賬戶的抵押和負債就轉移到了清算者賬戶裏,但是負債打了折扣,而抵押卻沒有。如此一來七千萬的壞賬就變成了六千萬的利潤。當然,是以 Euler finance 的損失爲代價的。
攻擊者用其他類型的代幣發起了幾次相同的攻擊,最終使得 Euler finance 損失慘重。
這次的攻擊主要是因爲捐贈函數在設計上沒有考慮到健康分數,讓攻擊者有機可乘製造了壞賬賬戶,還給負債打了友情價。可謂是一筆打賞打垮了 Euler finance 系統。
從去中心化協議設計角度來說,在引入新的代碼和商業邏輯時就應該考慮到與之前的代碼的契合度,否則僅是看似無害的捐款也能變成高危漏洞。
從安全的角度來說,新引入的代碼被 Sherlock 平臺最頂尖的幾位安全工程師審計過。但審計不代表沒有漏洞,即使是最厲害的專家也不例外。因此,筆者建議項目方在開發和升級項目的時候與安全審計公司一直保持合作,同時監控合約有無異常行爲。如果能設置常態的漏洞賞金則更好。多一雙眼睛,就多一份安全。
Make this world a better place by one commit each time
原文鏈接
歡迎加入律動 BlockBeats 官方社群:
Telegram 訂閱群:https://t.me/theblockbeats
Telegram 交流群:https://t.me/BlockBeats_App
Twitter 官方帳號:https://twitter.com/BlockBeatsAsia