2021 年08 月30 日,據慢霧區消息,DeFi 抵押借貸平台Cream Finance 遭受閃電貸攻擊,損失約1800 萬美元。慢霧安全團隊第一時間介入分析,並將簡要分析結果分享如下:
攻擊流程
1. 攻擊者從Uniswap 閃電貸借出500 ETH;
2. 將500 ETH 抵押到crETH 合約中,獲得crETH 憑證;
3. 從crAMP 合約借出19,480,000 AMP;
-> 借貸時,cToken 合約會先通過doTransferOut 函數將AMP 代幣轉移給攻擊者,再記錄攻擊者的借貸數量到accountBorrows 中;
-> 但AMP 代幣的transfer 函數會通過鉤子(_callPostTransferHooks) 函數回調攻擊者合約的tokensReceived 函數;
-> 攻擊者合約在tokensReceived 函數中再次調用了crETH 合約,借出355 個ETH;
-> 由於第一次借貸的合約是crAMP 合約,第二次重入調用借貸的是crETH 合約,所以borrow 函數的防重入修飾器(nonReentrant) 不起作用;
-> 並且borrow 函數是在給用戶轉賬後再修改的借貸記錄(accountBorrows),導致攻擊者可以進行超額借貸;
4. 隨後攻擊者使用另外一個合約(0x0ec3) 對已經爆倉的合約(0x38c4) 進行清算,使得不會因為超額借貸而導致交易失敗;
5. 之後攻擊合約(0x38c4) 將crETH 憑證轉給0x0ec3 合約,0x0ec3 合約使用這些憑證贖回了約187.58 個ETH;
6. 最後在這筆交易中攻擊者獲得了約542.58(187.58 + 355) 個ETH 與9,740,000 個AMP 代幣;
7. 最後攻擊者歸還閃電貸,獲利走人。其他攻擊交易類似。
總結
本次攻擊是由於Cream 借貸模型與AMP 代幣不兼容導致的。由於AMP 代幣轉賬時會使用鉤子函數回調目標地址,且Cream cToken 合約是在藉貸轉賬後才記錄借貸數量,最終造成了超額借貸的問題。
參考攻擊交易:
https://etherscan.io/tx/0xa9a1b8ea288eb9ad315088f17f7c7386b9989c95b4d13c81b69d5ddad7ffe61e