去中心化借貸平臺HopeLend遭受借貸攻擊事件分析
北京時間 2023 年 10 月 18 日 19:48:59,Hope.money 的借貸池受到了基于閃電貸實施的攻擊。
Hope.money 包括了借貸平臺 HopeLend、去中心化交易所 HopeSwap、穩(wěn)定幣 HOPE 和治理代幣 LT,為用戶提供去中心化金融全棧服務(wù)。
本次攻擊涉及的協(xié)議是 HopeLend,是一個去中心化借貸平臺,用戶可以為協(xié)議提供流動性或者超額抵押借貸賺取收益。
事件始末
在 HopeLend 的代碼實現(xiàn)中,借貸池存在可被利用的漏洞,由于在銷毀存款憑證時,出現(xiàn)了錯誤的整數(shù)除法問題,導(dǎo)致小數(shù)點部分被截斷,實現(xiàn)了銷毀比預(yù)期少的憑證數(shù)量,獲得和預(yù)期一致的價值代幣。
攻擊者利用這個缺陷掏空了 Hope.money 上存在資金的多種借貸池。
其中 hEthWbtc 借貸池于 73 天前部署,但是其中沒有資金,因此黑客通過往該借貸池注入大量資金來達(dá)到讓貼現(xiàn)率戲劇性地暴漲,從而實現(xiàn)了在一個區(qū)塊交易內(nèi)快速掏空了所有其他借貸池子的資金。
更戲劇性的是,實現(xiàn)利用的黑客沒有獲得漏洞利用的資金,他的攻擊交易被搶跑者發(fā)現(xiàn),搶跑者模仿其攻擊行為并成功搶走了所有攻擊收益資金(527 ETH),最終有 50% 的攻擊收益資金 (263 ETH) 被搶跑者用于賄賂打包區(qū)塊的礦工(payload)。
發(fā)現(xiàn)漏洞的初始黑客,在區(qū)塊 18377039 創(chuàng)建了攻擊合約,并在區(qū)塊 18377042 進(jìn)行了攻擊合約的調(diào)用,此時搶跑者監(jiān)控到內(nèi)存池里的交易,并將其攻擊合約進(jìn)行模擬,作為搶跑合約的輸入,在同樣的 18377042 區(qū)塊進(jìn)行利用,而初始黑客在 18377042 區(qū)塊的交易由于排序在搶跑者后面,從而執(zhí)行失敗了。
資金去向
搶跑者在獲得收益后的一小時,將資金轉(zhuǎn)移到:0x9a9122Ef3C4B33cAe7902EDFCD5F5a486792Bc3A
在 10 月 20 日 13:30:23,疑似官方團(tuán)隊聯(lián)系了該地址,允許搶跑者留下 26 ETH(10% 的獲利)作為獎勵,并得到搶跑者的答復(fù)。
最終資金在溝通一個小時后,轉(zhuǎn)移到 Gnosis Safe 的多簽金庫中。
下面我們將展示真實的漏洞和黑客進(jìn)行利用的細(xì)節(jié)。
前置信息
HopeLend 的借貸協(xié)議實現(xiàn) Fork 自 Aave,因此涉及到漏洞相關(guān)的核心業(yè)務(wù)邏輯參考自 Aave 的白皮書。
0×00 存款和借貸
Aave 是一個純粹的 DeFi,借貸業(yè)務(wù)通過流動性池實現(xiàn),用戶在 Aave 存款提供流動性時,期望獲得借貸所獲得的收益。
貸款收益并不會完全分配給用戶,有少部分利息收入會被計入風(fēng)險儲備金,此部分比例較少,大部分貸款收益會分發(fā)給提供流動性的用戶。
在 Aave 中進(jìn)行存款放貸時,Aave 是通過貼現(xiàn)的方式,將不同時間點的存款數(shù)量轉(zhuǎn)化成流動性池初始時間點的存款數(shù)量份額,因此每數(shù)量份額的底層資產(chǎn)對應(yīng)的本息和,就可以直接用 amount(份額) * index(貼現(xiàn)率)算出來,大大方便了計算和理解。
可以理解為類似購買基金的過程,基金的初始凈值是 1,用戶投入 100 塊錢獲得 100 的份額,假設(shè)經(jīng)過一段時間獲得收益,凈值變成 1.03,此時用戶再次投入 100 塊錢,獲得的份額是 97,用戶的總份額是 197。
這其實是將該資產(chǎn)按照 index(凈值)進(jìn)行貼現(xiàn)處理。之所以這么處理,是因為用戶實際的本息和是用 balance 去乘以當(dāng)前的 index。當(dāng)?shù)诙未婵畹臅r候,用戶正確的本息和應(yīng)該是 100 * 1.03 + 100 = 203,如果不做貼現(xiàn)處理,第二次用戶存入 100 后的本息和就變成了 (100+100) * 1.03 = 206,是錯誤的,如果進(jìn)行了貼現(xiàn),本息和就變成了(100 + 100 / 1.03) * 1.03 = 103 + 100 = 203,203 的結(jié)果是正確的。
攻擊過程
0×25126……403907(hETHWBTC pool)
0x5a63e……844e74(攻擊合約 – 套現(xiàn))
借出初始閃電貸資金,進(jìn)行質(zhì)押
攻擊者首先從 Aave 閃電貸借入 2300WBTC,將其中 2000 枚 WBTC 質(zhì)押(deposit)到 HopeLend,資金將會被轉(zhuǎn)移至 HopeLend 的 hEthWbtc 合約(0×251…907),同時獲取相應(yīng)的 2000 枚 hETHWBTC。
借助空借貸池操縱初始貼現(xiàn)率(liquidityIndex)
從 HopeLend 進(jìn)行閃電貸借入 2000 枚 WBTC。
目前的價值是 1 hETHWBTC = 1 WBTC。
按照正常的存取 ETHWBTC 換回 WBTC 的操作,是不會影響兌換比例(只有當(dāng)收入了利息才會影響兌換比例,1 hETHWBTC 會獲得更多 WBTC)。
此時黑客開始通過一系列復(fù)雜操作,操縱貼現(xiàn)率:
黑客直接又將得到的 2000 枚 WBTC 通過直接轉(zhuǎn)賬(transfer)的方式轉(zhuǎn)移資金至 HopeLend 的 hEthWbtc 合約 ( 0×251…907),這一步并不是還貸。
黑客隨后取出(withdraw)之前步驟 1 中質(zhì)押(deposit)的絕大部分 WBTC(1999.999…),所以上一步才需要轉(zhuǎn)回 WBTC 以補充池子內(nèi)的資產(chǎn)。
最后黑客手上僅保留最小單位 (1e-8) 的 hEthWbtc,這里不能完全提完,是因為需要留下一點點,作為計算貼現(xiàn)率(liquidityIndex)時,會基于現(xiàn)有的加上新增的,如果清零的話,導(dǎo)致貼現(xiàn)率(liquidityIndex)變成 0,就不能讓池子里的比例失衡。
把上一步銷毀掉絕大部分 hEthWbtc 換回來的 wBTC,加上之前閃電貸剩余的 wBTC,歸還向 HopeLend 池子借出的閃電貸,共支付 2001.8 枚 WBTC( 其中包含利息 1.8 枚 wBTC)。
上面的過程銷毀掉大部分的 hEthWbtc,只留下 1 最小單位(1e-8)的 hEthWbtc 在黑客賬戶,這樣一來 hETHWBTC 總量就減少了,而借貸池里卻有 2001.8 枚 wBTC,此時的貼現(xiàn)率(liquidityIndex)達(dá)到驚人的 126,000,000。
這里涉及到一個知識,存款用戶的利息根本上來自池中流動性的增長,借貸池會根據(jù)存款率和使用率,動態(tài)調(diào)節(jié)借款和存款利率。
此處,當(dāng)池子從閃電貸利息 (1.8WBTC) 獲得額外流動性時,百分之七十 (126,000,000) 被計入 liquidityIndex(liquidityIndex),這個數(shù)值用來計算每單位存款 (hEthWbt) 的貼現(xiàn)價值。
由于池子在黑客操作前為空,還款后 totalLiquidity 僅為 1,amount 是 126000000,初始 liquidityIndex 為 1,得出結(jié)果為 126000001。
繼續(xù)放大貼現(xiàn)率
黑客繼續(xù)從 HopeLend 進(jìn)行閃電貸借入 2000 枚 WBTC,并每次歸還額外的 1.8 枚 WBTC,使得每次 LiquidityIndex 得以累加 126,000,000。
黑客重復(fù)執(zhí)行了 60 次該過程,最終 liquidityIndex 達(dá)到 7,560,000,001,攻擊者持有的 1 個最小單位的 hEthWBTC 貼現(xiàn)價值可達(dá) 75.6WBTC(約為 214 萬美元)。
這也就使得黑客操控了 hEthWBTC,使之價值失真。
掏空其他存在資金的借貸池,形成收益
攻擊者接著將 1 個最小單位的 hEthWBTC 為抵押,從 HopeLend 的其他五個代幣池借出了大量資產(chǎn)。
包括:
175.4 – WETH
145,522.220985 – USDT
123,406.134999 – USDC
844,282.284002229528476039 – HOPE
220,617.821736563540747967 – stHOPE
這些代幣被作為收益通過 Uniswap 兌換為 WBTC 和 WETH,扣除各種費用后,最終黑客獲利為約 263 枚 WETH(除去賄賂 payload 的 263.9 枚 WETH)。
為什么黑客可以從其他池子借走大量資金:
借款或取走存款時,借貸合約會檢驗用戶的抵押資產(chǎn)狀況,確保借出不超過抵押。
由于之前貼現(xiàn)率已被黑客操縱且貼現(xiàn)率會以 normalizedIncome 乘數(shù)計入抵押價值計算,其手中的一單位 hEthWBTC 抵押價值高達(dá) 75.6WBTC。
每一次從其他池借款,黑客都輕松通過了抵押資產(chǎn)校驗。
此時, 攻擊者總共在 HopeLend 投入了 2000+1.8*60 枚 WBTC 用于操縱 liquidityIndex,只留存了 1 單位的 hEtthWBTC。
利用關(guān)鍵漏洞點(整數(shù)除法錯誤)套現(xiàn)
為了取出之前的投入 wBTC,攻擊者部署了另一個攻擊合約:0x5a63e……844e74,并調(diào)用其中的 withdrawAllBtc() 方法:
漏洞過程如下:
首先存入 151.20000002 枚 wBTC,根據(jù)當(dāng)前的 liquidityIndex(1 最小單位 hEthWBTC=75.6wBTC),攻擊者獲得 2 個最小單位的 hEthWBTC。
取出(withdraw)113.4 個 wBTC,反算出其對應(yīng)的 hEthWBTC 份額,對 hEthWBTC 進(jìn)行 burn 操作。
113.4 個 wBTC 需要銷毀 1.9999999998 最小單位的的 hEthWBTC,但是由于 div 函數(shù)精度問題,僅一個最小單位的 hEthWBTC 被銷毀,因此變成可被利用的漏洞,黑客仍可保留 1 個最小單位的 hEthWBTC。
關(guān)鍵漏洞
hEthWBTC 的 burn 方法調(diào)用了高精度除法 rayDiv。
此處:
a=11340000000(打算取出的 WBTC)
b=7560000001000000000000000009655610336(貼現(xiàn)率)
雖然 (a*1e27+b/2)/b = 1.9999999998,solidity 自帶的 div 方法截斷返回 1, 相當(dāng)于 11340000000 / 7560000001 除法后小數(shù)位被截斷了。
0x5a63( 攻擊合約 – 套現(xiàn) ) 繼續(xù)存入 75.60000001WBTC 恰好又獲得 1 個最小單位 hEthWBTC,從而繼續(xù)持有 2 個最小單位 hEthWBTC。
如此循環(huán)取出 113.40000000wBTC,存入 75.60000001wBTC 的操作,每次攻擊者可以憑空獲取 37.8 枚 wBTC。
循環(huán) 58 次后,攻擊者取出了所有前期投入的 wBTC ,并順利歸還 Aave 的閃電貸。
結(jié)論
由于 hEthWBTC 借貸池未被初始化,攻擊者得以輕易操縱 liquidityIndex,將其增至極大,提現(xiàn)率作為除數(shù)極大放大后,由于整數(shù)除法的截斷誤差,使得取出之前的投入更容易在一個區(qū)塊內(nèi)實現(xiàn)。
在運轉(zhuǎn)良好的借貸池中,由于池中已有流動性,不容易因為少量的貸款利息增加而極大增加貼現(xiàn)率。
你可能感興趣的文章
-
a16z:穩(wěn)定幣的崛起的原因解讀
如果你最近沒有關(guān)注過穩(wěn)定幣的最新數(shù)據(jù),可能會感到驚訝,在過去12個月里,穩(wěn)定幣的交易量達(dá)到了33萬億美元,持續(xù)創(chuàng)下歷史新高,更多詳細(xì)資訊請看下面正文…
2025-06-06 -
瑞士首次批準(zhǔn)與74個國家共享加密貨幣稅 務(wù)信息
瑞士聯(lián)邦委員會預(yù)計將在2026年底前實施與74個國家自動交換加密貨幣信息的法案,首次交換預(yù)計在2027年進(jìn)行,更多詳細(xì)資訊請看下面正文 …
2025-06-06 -
巴黎圣日耳曼歐冠奪冠!但官方球迷代幣PSG反而下跌解讀
巴黎圣日耳曼歐冠奪冠,官方球迷代幣$PSG反而下跌,揭示加密市場「賣事實」現(xiàn)象與球迷代幣波動特性。…
2025-06-06 -
一文了解歐盟MiCA目光轉(zhuǎn)向DeFi的原因!但去中心化定義成難題
全球首部針對加密資產(chǎn)市場的全面性法規(guī)——歐盟的《加密資產(chǎn)市場監(jiān)管規(guī)范》(Marketsin Crypto-Assets Regulation,MiCA),已于2024年底正式生效,為快速發(fā)展的加密產(chǎn)業(yè)帶來…
2025-06-06 -
SharpLink囤以太坊有風(fēng)險嗎?SharpLink為何效仿微策略買以太坊?
今天我們來講下以太坊,最近有個重大 事件,就是美國上市公司SharpLink Gaming(納斯達(dá)克代碼:SBET)宣布計劃通過私募融資(PIPE)方式,以每股6.15美元的價格發(fā)行6910萬…
2025-06-06 -
比特幣(BTC)挖礦難度創(chuàng)歷史新高,成功斬獲33萬美元區(qū)塊獎勵
一位獨立比特幣礦工成功挖出了第899,826個區(qū)塊,獲得了價值330,386美元的獎勵,在當(dāng)前創(chuàng)紀(jì)錄高網(wǎng)絡(luò)難度下實屬罕見壯舉,根據(jù)mempool.space數(shù)據(jù)顯示,該區(qū)塊于6月5日世界標(biāo)準(zhǔn)…
2025-06-06 -
Pi Network 的 GCV 是什么?為什么大家都在談?wù)撍?/h3>
Pi Network 的 GCV 是什么?為什么大家都在談?wù)撍???Pi Network 社區(qū)中,GCV 代表“全球共識價值”,這是 Pi 愛好者提出的一個概念,旨在為 Pi 幣設(shè)定一個固定價值,一些…
2025-06-06 -
山寨幣持續(xù)疲軟?或許正醞釀結(jié)構(gòu)性轉(zhuǎn)折
市場正在做它最擅長的事:考驗?zāi)愕男拍?山寨幣對 BTC 持續(xù)下跌,BTC 主導(dǎo)率接近周期高點,市場情緒分 裂,一部分人冷眼旁觀,另一部分人在低市值幣上激進(jìn)做多,下面我們就來簡…
2025-06-06 -
Pi幣跌破0.6美元,究竟是金坑還是陷阱?一文分析
Pi幣跌破0.6美元,究竟是金坑還是陷阱?最近加密圈又熱鬧了一陣,不是因為比特幣,也不是哪個新項目融資破億,而是一個“沉默已久”的熟面孔:$Pi,又跌破0.6美元了,這不是…
2025-06-06 -
Layer1公鏈Stable橫空出世!背靠Tether及Bitfinex交易所 USDT是原生代
日前一條Layer1公鏈Stable橫空出世,該公鏈表示背靠Bitfinex交易所及全球最大穩(wěn)定幣USDT,Tether執(zhí)行長兼Bitfinex技術(shù)長Paolo Ardoino為該鏈提供幫助,Stable主打USDT就是原…
2025-06-06