時(shí)間:2023-08-05|瀏覽:216
據(jù)慢霧區(qū)情報(bào),2020年11月17日,以太坊DeFi項(xiàng)目OUSD遭受閃電貸攻擊。慢霧安全團(tuán)隊(duì)于第一時(shí)間跟進(jìn)并進(jìn)行相關(guān)分析。1支持。
攻擊流程簡析 1.攻擊者使用dydx閃電貸借出70000個(gè)ETH,隨后通過Uniswap將其兌換為USDT和DAI。
2.攻擊者調(diào)用OUSDVault的mint函數(shù),Vault會(huì)先進(jìn)行一次rebase將之前積累的獎(jiǎng)勵(lì)進(jìn)行分配,隨后將750萬USDT從攻擊者合約轉(zhuǎn)入OUSDVault中。此時(shí)OUSD合約會(huì)鑄出等量的750萬OUSD代幣給攻擊合約,最后通過allocate來結(jié)算當(dāng)前的收益。
3.在攻擊者轉(zhuǎn)入750萬之前,Vault的價(jià)值約為7018138美元。攻擊者轉(zhuǎn)入750萬USDT后將占Vault總價(jià)值的一半以上。
4.隨后攻擊合約利用mintMultiple函數(shù)傳入DAI合約地址與攻擊合約的地址,同樣是先進(jìn)行一次rebase,將之前累計(jì)的收益進(jìn)行分配(包含先前轉(zhuǎn)入的750萬USDT部分),再通過transferFrom先將攻擊合約的2050萬DAI轉(zhuǎn)入Vault中。隨后將調(diào)用攻擊合約的transferFrom函數(shù),攻擊者在攻擊合約的transferFrom函數(shù)中構(gòu)造再次調(diào)用Vault合約mint函數(shù)的邏輯來實(shí)現(xiàn)重入攻擊。
5.在上一步驟中轉(zhuǎn)入2050萬DAI后通過攻擊合約的transferFrom函數(shù)再次調(diào)用Vault的mint函數(shù)。由于重入時(shí)傳入2000USDT符合判斷是否調(diào)用rebase的條件,此時(shí)將進(jìn)行一次rebase,而由于rebase需要Vault中的資產(chǎn)總價(jià)值和OUSD的總鑄幣數(shù)有差值才能觸發(fā)。按照原本的業(yè)務(wù)場景是進(jìn)行allocate結(jié)算收益后改變Vault中的資產(chǎn)總價(jià)值然后通過rebase進(jìn)行分配。而由于重入原因并沒有先通過oUSD.mint進(jìn)行鑄幣操作,且攻擊者已先將2050萬的DAI轉(zhuǎn)入Vault中,所以Vault中的資產(chǎn)總價(jià)值仍然增加了,導(dǎo)致合約中的資產(chǎn)總價(jià)值大于OUSD的總鑄幣量。因此Vault會(huì)將增加的2050萬DAI當(dāng)成收益部分進(jìn)行rebase分配。在步驟3中由于攻擊者資產(chǎn)已占Vault總價(jià)值的一半以上,所以此時(shí)攻擊者將憑空獲得超過價(jià)值1025萬的收益分配。
6.隨后將通過oUSD.mint鑄出2000OUSD,并通過allocate結(jié)算重入時(shí)2000USDT的收益(從上一步驟可以看出攻擊合約傳入的2000USDT只是為了滿足調(diào)用rebase的條件,觸發(fā)收益分配而已)。重入結(jié)束后仍將通過oUSD.mint鑄出之前轉(zhuǎn)入的2050萬DAI等值的OUSD代幣。
7.最后Vault的總價(jià)值約為3501萬美元,但攻擊者所擁有的價(jià)值超過3825萬美元,因此攻擊者用大部分的OUSD去Vault進(jìn)行贖回操作,將Vault基本提空,而其余的OUSD是通過Uniswap和Sushiswap的OUSD-USDT池將OUSD換成USDT來增加收益。
總結(jié) 此次攻擊關(guān)鍵在于調(diào)用外部合約造成的重入問題與Vault的rebase收益分配機(jī)制相結(jié)合,導(dǎo)致攻擊者可以通過重入來憑空獲得巨額的收益分配。針對此類情況,慢霧安全團(tuán)隊(duì)建議對傳入資產(chǎn)進(jìn)行檢查后,對不在白名單內(nèi)的資產(chǎn)直接進(jìn)行回滾,并使用防重入鎖以避免重入攻擊。
相關(guān)鏈接: (1)參考攻擊交易: 0xe1c76241dda7c5fcf1988454c621142495640e708e3f8377982f55f8cf2a8401