來(lái)源:深圳零時(shí)科技
監(jiān)測(cè)到針對(duì)DualPools的鏈上攻擊事件:
https://bscscan.com/tx/0x90f374ca33fbd5aaa0d01f5fcf5dee4c7af49a98dc56b47459d8b7ad52ef1e93
DualPools (https://dualpools.com)?是基于VenusProtocol (https://venus.io/)?修改,是一個(gè)DeFi項(xiàng)目,提供了Swap, Lend, Borrow等服務(wù)。
其運(yùn)行模式如下圖:
DualPools是一個(gè)去中心化借貸平臺(tái),用戶通過(guò)deposti存入underlyingAssets(標(biāo)的資產(chǎn)),獲得對(duì)應(yīng)的dToken;反之,通過(guò)Redeem取出underlyingAssets時(shí),銷毀對(duì)應(yīng)的dToken。
其中,underlyingAssets標(biāo)的資產(chǎn)和dToken的兌換比例是通過(guò)exchangeRate(流動(dòng)性指數(shù))來(lái)控制的,簡(jiǎn)單來(lái)講exchangeRate就是dToken的價(jià)值。
exchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply
簡(jiǎn)單來(lái)講,攻擊分為兩部分:
1. 黑客通過(guò)DualPools新交易池流動(dòng)性不足(流動(dòng)性為0),大幅抬高dLINK的價(jià)格,通過(guò)borrow掏空其他交易池的標(biāo)的資產(chǎn)(WBNB, BTCB,ETH, ADA, BUSD)。
2. 利用精度截?cái)嗟膯?wèn)題,取回前期投入的所有LINK。
攻擊者通過(guò)DODO Private Pool和PancakeSwapV3進(jìn)行借貸,獲取BNB和BUSD作為初始攻擊資金,如下圖:
隨后,通過(guò)VenusProtocol抵押BNB和BUSD,并借出11500 LINK來(lái)進(jìn)行針對(duì)DualPools的攻擊。
首先,攻擊者通過(guò)再交易池dLINK-LINK?mint獲得2個(gè)最小單位的dLINK,隨后,向交易池中轉(zhuǎn)賬11499999999999999999998個(gè)單位的LINK。
由于該交易池并未初始化,所以沒有任何流動(dòng)性。且exchangeRate的計(jì)算方式如下:
exchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply
此時(shí)totalCash為交易池中LINK的余額,為11499999999999999999998+2=11500000000000000000000,totalBorrows和totalReserves均為0,totalSupply為2(因?yàn)椋诳屯ㄟ^(guò)mint獲得了2個(gè)最小單位的dLINK)。所以,此時(shí)的exchangeRate為5750000000000000000000(將dLINK的價(jià)值拉高了575倍)。由于攻擊者擁有的2個(gè)dLINK,且價(jià)值足夠高,所以,黑客從其他池子中通過(guò)borrow借走了50 BNB, 0.17 BTCB, 3.99 ETH, 6378 ADA, 911 BUSD。
攻擊者通過(guò)redeemUnderlying將之前mint的2個(gè)最小單位dLINK兌換為11499999999999999999898個(gè)單位的LINK。因?yàn)椋琫xchangeRate被攻擊者操縱為5750000000000000000000。所以,兌換11499999999999999999898個(gè)最小單位的LINK需要的dLINK為 11499999999999999999898 / 5750000000000000000000 = 1.999999999999999?即1.999999個(gè)最小單位的dLINK,但是由于數(shù)據(jù)精度截?cái)啵瑢?dǎo)致只需要1個(gè)最小單位的dLINK。
至此,攻擊者取出了之前投入的 11499999999999999999898?個(gè)單位的LINK。隨后,將從VenusProtocol, PancakeSwapV3, DODO Private Pool的借款歸還,完成攻擊。
攻擊者利用DualPools新交易池流動(dòng)性差的原因,操縱標(biāo)的資產(chǎn)的exchangeRate,導(dǎo)致標(biāo)的資產(chǎn)對(duì)應(yīng)的dToken價(jià)格失真,從而可以以極小的dToken作為抵押借出大量的其他標(biāo)的資產(chǎn)。隨后,利用智能合約除法的截?cái)鄦?wèn)題,取回之前攻擊時(shí)投入的資產(chǎn)。至此,完成對(duì)DeFi項(xiàng)目DualPools的攻擊。