2023 年 3 月 13 日,我們的系統偵測到 Euler Finance 的借貸池遭受閃電貸攻擊,導致 1.97 億美元的損失。我們首先通知了社群,隨後提供了分析報告以協助釐清根本原因。
1/ @eulerfinance 遭到攻擊。根本原因是 donateToReserves() 函式中缺乏流動性檢查https://t.co/stWtPWK900
— BlockSec (@BlockSecTeam) 2023年3月13日
請參閱下方的詳細攻擊步驟。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。合約將鑄造相應數量的 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。
- 攻擊者銷毀了 3890 萬 eDAI 以提取 3890 萬 DAI(由於償付能力檢查,無法提取更多),存於清算人(0xa0b3...)的倉位中。
- 攻擊者償還了閃電貸。
關鍵攻擊步驟 2-7 已在交易軌跡中標示。

總結
這是 2023 年規模最大的駭客攻擊事件,被盜資金高達 1.97 億美元,創下紀錄。駭客是一名 20 歲的阿根廷人 Federico Jaime,他向媒體提供了一種「曲折、有時令人困惑甚至自相矛盾的敘述」。儘管如此,「所有可追回的資金」後來都被歸還給了 Euler Finance 的金庫位址。然而,其中一小部分(約 20 萬美元)「無意中」被發送給了被美國財政部制裁的北韓國家支持的犯罪集團——Lazarus Group。您可以參考這些連結,即 連結 1 和 連結 2 以了解詳細且引人入勝的故事。
此事件的根本原因是缺乏償付能力檢查,這給我們上了寶貴的一課。事實上,對於借貸協議來說,至關重要的是評估是否應針對任何可能影響用戶倉位的程序實施倉位健康度檢查。此外,專案團隊應主動監控其借貸協議是否有異常的大規模清算,並建立有效的警報系統,以便及時偵測並應對此類事件。
閱讀本系列的其他文章:
- 導言:2023 年十大「精彩」安全事件
- #1:利用 Flashbots 中繼器漏洞收割 MEV 機器人
- #3:KyberSwap 事件:精妙利用捨入誤差與極度微妙的計算進行攻擊
- #4:Curve 事件:編譯器錯誤導致無辜原始碼產生錯誤位元組碼
- #5:Platypus Finance:憑藉運氣倖存的三次攻擊
- #6:Hundred Finance 事件:引發易受攻擊的分叉協議中一系列精度相關漏洞的利用浪潮
- #7:ParaSpace 事件:與時間賽跑,阻止業界最嚴重的攻擊
- #8:SushiSwap 事件:笨拙的救援嘗試導致一系列效仿攻擊
- #9:MEV Bot 0xd61492:在精巧利用中由捕食者變為獵物
- #10:ThirdWeb 事件:受信任模組之間的不相容性暴露了漏洞



