Uniswap/Lendf.Me 攻擊事件是由於imBTC採用ERC777標準,ERC777標準中原生地支持hook(鉤子)機制的運行,而在imBTC實現過程中,並未在相應函數間加入互斥鎖,從而出現了重入攻擊漏洞。黑客正是利用該漏洞對Uniswap與Lendf.Me發起攻擊,以幾乎接近於0的成本獲得了巨額的數字資產。
UTC時間2020年4月18日上午12:58:19發生了一起針對Uniswap imBTC流動池的重入漏洞攻擊。大約24小時後,UTC時間2020年4月19日上午12:58:43 Lendf.Me上也發生了類似的黑客攻擊事件。
從技術上講,這兩起事件背後的主要邏輯是,兼容ERC777的「transferFrom()」的實現有一個回調機制。
「transferFrom()」操作的「from」地址註冊成為「implementer」,這個from參數其實是攻擊者參數(比如該參數可以向Lendf.ME提供imBTC),第二個參數是一個常數,即「keccak256('ERC777TokensSender')」。在1056行的代碼中,「implementer」中定義的「tokensToSend()」函數被調用了,這使得攻擊者可以通過填入其他惡意執行代碼來黑進相應交易。
下圖所示為Uniswap的惡意攻擊,內嵌的「tokenToEthSwapInput()」又被調用了一次,這意味著攻擊者又進行了一次將imBTC兌換成ETH的交易(當兌換比率被攻擊者操縱至對其有利的水平時)。
攻擊者利用該漏洞耗盡了Uniswap流動性池中的ETH-imBTC(約有1278個ETH)。
下圖為Lendf.Me的惡意攻擊,由於在存入函數中,Lendf.Me中的「supply()」函數被嵌入一個額外的提現(withdraw())函數鉤子(hook),這導致攻擊者可以在不實際存入資產的情況下,偽造其imBTC抵押品餘額的內部記錄。
攻擊者首先向Lendf.Me提供了確定數量的imBTC(即289.999999999 imBTC)。然而在第二個「supply()」中,攻擊者僅實際提供了0.000000001個imBTC,並且其後來通過「withdraw()」的鉤子又取出了290 imBTC(攻擊者黑入了「dotransferIn()」中「imBTC:transferFrom()」的調用——1583行)。從而使得290imBTC在鉤子函數「withdraw()」中從攻擊者的餘額中成功扣除。然而,當代碼又回執至「supply」時,餘額又被重置為290imBTC(1599行)。這就是攻擊者如何在lendf.Me中操縱imBTC抵押品餘額數量的內在邏輯。通過多次上述操作,攻擊者將其在Lendf.Me中的imBTC內部記錄刷到了足夠從多個流動池(總資產價值為25,236,849.44美元)中借出可用的10多種資產。
Lendf.Me黑客事件對於當前的DeFi社區而言確實是一個打擊。在下面的圖片中我們收集了在該事件中各項資產的損失額數據。
聲明:本文由入駐金色財經的作者撰寫,觀點僅代表作者本人,絕不代表金色財經贊同其觀點或證實其描述。
提示:投資有風險,入市須謹慎。本資訊不作為投資理財建議。