2023年3月13日,我們的系統偵測到 Euler Finance 的借貸池遭受閃電貸攻擊,損失達1.97億美元。我們首先向社群發出警報,隨後提供了分析報告,以協助找出根本原因。
1/ @eulerfinance is attacked. The root cause is due to the lack of liquidity check in the function donateToReserves()https://t.co/stWtPWK900
— BlockSec (@BlockSecTeam) March 13, 2023
See the detailed attack steps below. https://t.co/bm10OJHiXu pic.twitter.com/TDbYuzVWHe
此次事件的根本原因在於 donateToReserves() 函式中缺乏償債能力檢查。具體而言,該漏洞合約提供了一項功能,允許用戶將其抵押品捐贈給協議,卻未檢查用戶頭寸是否具備償債能力。更糟糕的是,為了清除這些不良頭寸,協議為清算人提供了大幅折扣,使其只需支付較少的債務即可完成清算。攻擊者利用此功能建立了一個龐大頭寸,並使其陷入資不抵債的狀態,從而得以折價購回自己的抵押品並從中獲利。
背景
Euler Finance 概述
Euler Finance 是以太坊上的一個借貸協議,允許用戶存入和借出指定代幣。當貸款人向 Euler 的流動性池存款時,系統會鑄造相應數量的 EToken(計息 ERC20 代幣)並發送給他們。這些 EToken 可用於贖回所存入的基礎資產。
另一方面,借款人在獲得流動性後會收到 DToken。這些 DToken 符合 ERC20 標準,但持有人無法自行銷毀它們。具體來說,這些代幣並非允許發送給任何人,而是可以被任何人提取,但接受它們需要事先批准。就基礎資產而言,借款人須負責支付貸款利息,其中一部分利息用於彌補協議上的壞帳。
Euler Finance 的槓桿借款(又稱自我借款)機制與軟清算機制,是兩個幫助我們更好理解此次攻擊成因的關鍵概念。
槓桿借款
Euler Finance 提供槓桿借款功能,使用戶能夠模擬遞迴借款策略。簡單來說,用戶可以存入抵押品並鑄造 EToken,這些 EToken 隨後可作為抵押品再借入更多 EToken。合約同時也會鑄造相應數量的 dToken 作為債務代幣。用戶頭寸的健康狀況根據 EToken 與 dToken 的價值計算。根據 Euler Finance 的文件說明,用戶最高可使用19倍槓桿。槓桿借款功能在此次事件中扮演了關鍵角色——若無此功能的協助,攻擊者將無法獲利。透過槓桿借款,攻擊者將其頭寸規模擴大至閃電貸初始資金的近11倍。
軟清算
如 Euler Finance 的白皮書所述,軟清算機制使清算人能夠靈活地幫助被清算方償還債務,而非像 Compound 和 Aave 等協議採用固定係數進行清算。軟清算意味著頭寸的健康狀況越差,可被清算的抵押品比例越高——根據此次事件的數據,在發生壞帳的情況下最高可達75%。因此,以大幅折扣清算抵押品的機制,使攻擊者得以償還閃電貸並獲取利潤。
漏洞分析
主要漏洞——即缺乏償債能力檢查——存在於 donateToReserves() 函式中,該函式用於讓用戶將其頭寸中的 EToken 作為捐贈轉移至協議的儲備金。對於一般用戶而言,通常沒有執行此操作的動機或誘因。事實上,此漏洞的關鍵在於 donateToReserves() 函式在將 EToken 從用戶頭寸中轉出時,並未執行健康狀況檢查。這使得攻擊者可以直接將透過槓桿借款所建立的大型頭寸中的 EToken 捐出,導致該頭寸的健康因子降至100%以下,進而形成壞帳。

根據設計,Euler Finance 使用動態平倉因子對頭寸執行「軟清算」。簡言之,頭寸的健康狀況越差,該頭寸中可被清算的抵押品比例越高。在發生壞帳的情況下,清算比例最高可達頭寸內抵押品的75%(根據實際攻擊交易計算得出)。因此,被大幅折價清算的大量抵押品,使攻擊者得以償還閃電貸並從中獲利。
攻擊分析
此次攻擊針對不同資金池發起了多筆攻擊交易:
- 0xc310a0affe2169d1f6feec1c63dbc7f7c62a887fa48795d327d4d2da2d6b111d(DAI)
- 0x71a908be0bef6174bccc3d493becdfd28395d8898e355d451cb52f7bac38617(WBTC)
- 0x62bd3d31a7b75c098ccf28bc4d4af8c4a191b4b9e451fab4232258079e8b18c4(wstETH)
- 0x465a6780145f1efe3ab52f94c006065575712d2003d83d85481f3d110ed13d9(USDC)
- 0x3097830e9921e4063d334acb82f6a79374f76f0b1a8f857e89b89bc58df1f311(stETH)
- 0x47ac3527d02e6b9631c77fad1cdee7bfa77a8a7bfd4880dccbda5146ace4088f(WETH)
攻擊步驟如下(以第一筆攻擊交易為例):
- 攻擊者透過 AAVE 閃電貸借入3000萬 DAI。
- 攻擊者存入2000萬 DAI,並獲得2000萬 eDAI。
- 由於 Euler Finance 提供槓桿借款功能,攻擊者鑄造了1.95億 eDAI 和2億 dDAI。此時攻擊者持有2.15億 eDAI 和2億 dDAI。
- 接續上步驟,攻擊者償還了1000萬債務,以便鑄造更多 eDAI。此時攻擊者持有2.15億 eDAI 和1.9億 dDAI。
- 重複步驟3。此時攻擊者持有4.1億 eDAI 和3.9億 dDAI。
- 攻擊者呼叫
donateToReserve函式捐出1億 eDAI,然而在此過程中並未檢查攻擊者的健康因子。此時該頭寸已可被清算(3.1億 eDAI 對應3.9億 dDAI),從而為攻擊者創造了獲利機會。 - 攻擊者透過另一個地址合約作為清算人(0xa0b3...)對該頭寸進行清算。清算人(0xa0b3...)獲得3.1億 eDAI 和2.59億 dDAI。
- 攻擊者在清算人頭寸(0xa0b3...)中銷毀3890萬 eDAI,提取3890萬 DAI(因償債能力檢查而無法提取更多)。
- 攻擊者償還閃電貸。
關鍵攻擊步驟2至7已在交易追蹤圖中標註。

總結
這是2023年規模最大的駭客事件,創紀錄地盜取了1.97億美元資金,犯案者是一名20歲的阿根廷人 Federico Jaime,他向媒體提供了「一個迂迴曲折、有時令人困惑甚至自相矛盾的說法」。儘管如此,「所有可追回的資金」後來均已歸還至 Euler Finance 的國庫地址。然而,有一小部分資金(約20萬美元)被「無意中」轉入 Lazarus Group——一個被指控為受北韓國家支持、並遭美國財政部制裁的犯罪集團。您可以參閱以下連結,即link2和link2,以了解這個詳細而有趣的故事。
此次事件的根本原因在於缺乏償債能力檢查,這為我們提供了深刻的教訓。事實上,對於借貸協議而言,評估是否應針對任何可能影響用戶頭寸的操作實施頭寸健康狀況檢查至關重要。此外,項目團隊應主動監控其借貸協議中的重大清算活動,並建立有效的警報系統,以便及時偵測和應對此類事件。
閱讀本系列其他文章:
- 導言:2023年十大「精彩」安全事件
- #1:利用 Flashbots Relay 漏洞收割 MEV 機器人
- #3:KyberSwap 事件:以極其精妙的計算對捨入誤差實施高超利用
- #4:Curve 事件:編譯器錯誤從無害原始碼生成錯誤位元組碼
- #5:Platypus Finance:憑藉一絲幸運在三次攻擊中倖存
- #6:Hundred Finance 事件:催化存在漏洞的分叉協議中一波精度相關漏洞利用浪潮
- #7:ParaSpace 事件:與時間賽跑,挫敗業界迄今最關鍵的攻擊
- #8:SushiSwap 事件:笨拙的救援嘗試引發一系列仿冒攻擊
- #9:MEV 機器人 0xd61492:從捕食者淪為獵物的精巧漏洞利用
- #10:ThirdWeb 事件:受信任模組間的不相容性揭露漏洞



