CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析

北京時間 2023 年 10 月 18 日 19: 48: 59 ,Hope.money 的借貸池受到了基於閃電貸實施的攻擊。

Hope.money 構建了包括 HopeLend 借貸平臺、HopeSwap 去中心化交易所、穩定幣$HOPE、治理代幣$LT,為使用者提供去中心化金融全棧服務。

本次攻擊涉及的協定是 HopeLend,是一個去中心化借貸平臺,使用者可以為協定提供流動性或者超額抵押借貸賺取收益。

事件始末

在 HopeLend 的代碼實現中,借貸池存在可被利用的漏洞,由於在銷毀存款憑證時,出現了錯誤的整數除法問題,導致小數點部分被截斷,實現了銷毀比預期少的憑證數量,獲得和預期一致的價值代幣。

攻擊者利用這個缺陷掏空了 Hope.money 上存在資金的多種借貸池。

其中 hEthWbtc 借貸池於 73 天前部署,但是其中沒有資金,因此駭客通過往該借貸池注入大量資金來達到讓貼現率戲劇性地暴漲,從而實現了在一個區塊交易內快速掏空了所有其他借貸池子的資金。

更戲劇性的是,實現利用的駭客沒有獲得漏洞利用的資金,他的攻擊交易被搶跑者發現,搶跑者模仿其攻擊行為並成功搶走了所有攻擊收益資金(527 ETH),最終有 50% 的攻擊收益資金( 263 ETH)被搶跑者用於賄賂打包區塊的礦工(payload)。

發現漏洞的初始駭客,在區塊 18377039 創建了攻擊合約,並在區塊 18377042 進行了攻擊合約的調用,此時搶跑者監控到記憶體池裡的交易,並將其攻擊合約進行類比,作為搶跑合約的輸入,在同樣的 18377042 區塊進行利用,而初始駭客在 18377042 區塊的交易由於排序在搶跑者後面,從而執行失敗了。

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22020909/vgmwbfe1izd6m7c3.png!webp)

資金去向

搶跑者在獲得收益后的一小時,將資金轉移到:0x9a9122Ef3C4B33cAe7902EDFCD5F5a486792Bc3A

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22020909/xs8c5jce3oyl7qj1.png!webp)

在 10 月 20 日 13: 30: 23 ,疑似官方團隊聯繫了該地址,允許搶跑者留下 26 ETH(10% 的獲利)作為獎勵,並得到搶跑者的答覆。

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22020909/2k6prrcrl8b9ynve.png!webp)

最終資金在溝通一個小時后,轉移到 GnosisSafe 的多簽金庫中。

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22020909/to197jlp4ce8qoq1.png!webp)

下面我們將展示真實的漏洞和駭客進行利用的細節。

前置資訊

*HopeLend 的借貸協議實現 Fork 自 Aave,因此涉及到漏洞相關的核心業務邏輯參考自 Aave 的白皮書。

0x00 存款和借貸

Aave 是一個純粹的 DeFi,借貸業務通過流動性池實現,使用者在 Aave 存款提供流動性時,期望獲得借貸所獲得的收益。

貸款收益並不會完全分配給使用者,有少部分利息收入會被計入風險儲備金,此部分比例較少,大部分貸款收益會分發給提供流動性的使用者。

在 Aave 中進行存款放貸時,Aave 是通過貼現的方式,將不同時間點的存款數量轉化成流動性池初始時間點的存款數量份額,因此每數量份額的底層資產對應的本息和,就可以直接用 amount(份額) * index(貼現率)算出來,大大方便了計算和理解。

可以理解為類似購買基金的過程,基金的初始凈值是 1 ,使用者投入 100 塊錢獲得 100 的份額,假設經過一段時間獲得收益,凈值變成 1.03 ,此時使用者再次投入 100 塊錢,獲得的份額是 97 ,使用者的總份額是 197 。

這其實是將該資產按照 index(凈值)進行貼現處理。 之所以這麼處理,是因為用戶實際的本息和是用 balance 去乘以當前的 index。 當第二次存款的時候,使用者正確的本息和應該是 100 * 1.03 + 100 = 203 ,如果不做貼現處理,第二次使用者存入 100 后的本息和就變成了( 100+ 100) * 1.03 = 206 ,是錯誤的,如果進行了貼現,本息和就變成了(100 + 100 / 1.03) * 1.03 = 103 + 100 = 203 , 203 的結果是正確的。

攻擊過程

0x25126...403907(hETHWBTC 池)

0x5a63e...... 844e74(攻擊合約-套現)

攻擊者:

1. 借出初始閃電貸資金,進行質押

攻擊者首先從 Aave 閃電貸借入 2300 WBTC,將其中 2000 枚 WBTC 質押(deposit)到 HopeLend,資金將會被轉移至 HopeLend 的 hEthWbtc 合約( 0x251 ... 907),同時獲取相應的 2000 枚 hETHWBTC。

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22020909/anso762vnbov1zr2.png!webp)

2. 借助空借貸池操縱初始貼現率(liquidityIndex)

從 HopeLend 進行閃電貸借入 2000 枚 WBTC。

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22021102/74cv8ydz0ubnh1dd.png!webp)

目前的價值是 1 hETHWBTC = 1 WBTC。

按照正常的存取ETHWBTC換回WBTC的操作,是不會影響兌換比例(只有當收入了利息才會影響兌換比例, 1 hETHWBTC 會獲得更多WBTC)。

此時駭客開始通過一系列複雜操作,操縱貼現率:

• 駭客直接又將得到的 2000 枚 WBTC 通過直接轉帳(transfer)的方式轉移資金至 HopeLend 的 hEthWbtc 合約( 0x 251 ... 907),這一步並不是還貸。

• 駭客隨後取出(withdraw)之前步驟 1 中質押(deposit)的絕大部分 WBTC(1999.999 ... ),所以上一步才需要轉回 WBTC 以補充池子內的資產。

• 最後駭客手上僅保留最小單位( 1 e-8)的 hEthWbtc,這裡不能完全提完,是因為需要留下一點點,作為計算貼現率(liquidityIndex)時,會基於現有的加上新增的,如果清零的話,導致貼現率(liquidityIndex)變成 0 ,就不能讓池子裡的比例失衡。

• 把上一步銷毀掉絕大部分 hEthWbtc 換回來的 wBTC,加上之前閃電貸剩餘的 wBTC,歸還向 HopeLend 池子借出的閃電貸,共支付 2001.8 枚 WBTC(其中包含利息 1.8 枚 wBTC)。

• 上面的過程銷毀掉大部分的 hEthWbtc,只留下 1 最小單位(1 e-8)的 hEthWbtc 在駭客帳戶,這樣一來 hETHWBTC 總量就減少了,而借貸池裡卻有 2001.8 枚 wBTC,此時的貼現率(liquidityIndex)達到驚人的 126, 000, 000 。 這裡涉及到一個知識,存款使用者的利息根本上來自池中流動性的增長,借貸池會根據存款率和使用率,動態調節借款和存款利率。

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22021101/5iww6yvocq828lnk.png!webp)

此處,當池子從閃電貸利息( 1.8 WBTC)獲得額外流動性時,百分之七十( 126, 000, 000)被計入 liquidityIndex(liquidityIndex),這個數值用來計算每單位存款(hEthWbt)的貼現價值。

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22021101/0y2avv1q0k0d6dvq.png!webp)

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22021101/he1rfuj0gcks7icu.png!webp)

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22021101/z8wqinijs1xrxj4q.png!webp)

由於池子在駭客操作前為空,還款后 totalLiquidity 僅為 1 ,amount 是 126000000 ,初始 liquidityIndex 為 1 ,得出結果為 126000001 。

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22021225/4obpc8c6fmseyxxt.png!webp)

3. 繼續放大貼現率

駭客繼續從 HopeLend 進行閃電貸借入 2000 枚 WBTC,並每次歸還額外的 1.8 枚 WBTC,使得每次 LiquidityIndex 得以累加 126, 000, 000 。

駭客重複執行了 60 次該過程,最終 liquidityIndex 達到 7, 560, 000, 001 ,攻擊者持有的 1 個最小單位的 hEthWBTC 貼現價值可達 75.6 WBTC(約為 214 萬美元)。

這也就使得駭客操控了 hEthWBTC,使之價值失真。

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22021225/6c3vhd5dzcqouduz.png!webp)

4. 掏空其他存在資金的借貸池,形成收益

攻擊者接著將 1 個最小單位的 hEthWBTC 為抵押,從 HopeLend 的其他五個代幣池借出了大量資產。

包括:

  • 175.4 - 韋斯
  • 145, 522.220985 - USDT
  • 123, 406.134999 - USDC
  • 844, 282.284002229528476039 - 希望
  • 220, 617.821736563540747967 - stHOPE

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22021225/xloltizb5ua2puhd.png!webp)

這些代幣被作為收益通過 Uniswap 兌換為 WBTC 和 WETH,扣除各種費用後,最終駭客獲利為約 263 枚 WETH(除去賄賂 payload 的 263.9 枚 WETH)。

為什麼駭客可以從其他池子借走大量資金:

借款或取走存款時,借貸合約會檢驗使用者的抵押資產狀況,確保借出不超過抵押。

由於之前貼現率已被駭客操縱且貼現率會以 normalizedIncome 乘數計入抵押價值計算,其手中的一單位 hEthWBTC 抵押價值高達 75.6 WBTC。

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22021225/l92lr3astj8pxwg6.png!webp)

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22021225/fz7hdciyi6ismgwr.png!webp)

每一次從其他池借款,駭客都輕鬆通過了抵押資產校驗。

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22021356/8n7rgjpvl64lytjz.png!webp)

此時, 攻擊者總共在 HopeLend 投入了 2000+ 1.8* 60 枚 WBTC 用於操縱 liquidityIndex,只留存了 1 單位的 hEtthWBTC。

5. 利用關鍵漏洞點(整數除法錯誤)套現

為了取出之前的投入 wBTC,攻擊者部署了另一個攻擊合約:0x 5 a 63 e...... 844 e 74 ,並調用其中的withdrawAllBtc()方法

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22021356/gxsep176zr1ulz6y.png!webp)

漏洞過程如下:

(1) 首先存入 151.20000002 枚 wBTC,根據當前的 liquidityIndex( 1 最小單位 hEthWBTC= 75.6 wBTC),攻擊者獲得 2 個最小單位的 hEthWBTC。

(2) 取出(withdraw) 113.4 個 wBTC,反算出其對應的 hEthWBTC 份額,對 hEthWBTC 進行 burn 操作。

(3) 113.4 個 wBTC 需要銷毀 1.9999999998 最小單位的的 hEthWBTC,但是由於 div 函數精度問題,僅一個最小單位的 hEthWBTC 被銷毀,因此變成可被利用的漏洞,駭客仍可保留 1 個最小單位的 hEthWBTC。

關鍵漏洞

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22021356/i8sobsuj4gkdna0o.png!webp)

hEthWBTC 的 burn 方法調用了高精度除法 rayDiv。

! [CertiK:去中心化借貸平臺HopeLend遭受借貸攻擊事件分析] (https://piccdn.0daily.com/202310/22021356/xw84ns4thoyh5i1g.png!webp)

此處:

a= 11340000000(打算取出的 WBTC)

b=7560000001000000000000000009655610336(貼現率)

雖然(a* 1e27+b/2)/b = 1.9999999998 ,solidity 自帶的 div 方法截斷返回 1, 相當於 11340000000 / 7560000001 除法后小數位被截斷了。

0x5a63(攻擊合約-套現)繼續存入 75.600000001 WBTC 恰好又獲得 1 個最小單位 hEthWBTC,從而繼續持有 2 個最小單位 hEthWBTC。

如此迴圈取出 113.40000000 wBTC,存入 75.60000001 wBTC 的操作,每次攻擊者可以憑空獲取 37.8 枚 wBTC。

迴圈 58 次後,攻擊者取出了所有前期投入的 wBTC ,並順利歸還 Aave 的閃電貸。

結論

由於 hEthWBTC 借貸池未被初始化,攻擊者得以輕易操縱 liquidityIndex,將其增至極大,提現率作為除數極大放大后,由於整數除法的截斷誤差,使得取出之前的投入更容易在一個區塊內實現。

在運轉良好的借貸池中,由於池中已有流動性,不容易因為少量的貸款利息增加而極大增加貼現率。

查看原文
此頁面可能包含第三方內容,僅供參考(非陳述或保證),不應被視為 Gate 認可其觀點表述,也不得被視為財務或專業建議。詳見聲明
  • 讚賞
  • 留言
  • 分享
留言
0/400
暫無留言
交易,隨時隨地
qrCode
掃碼下載 Gate APP
社群列表
繁體中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)