事件背景
零時科技區塊鏈安全情報平台監控到消息,北京時間2022年10月15日,DeFi 投資工具Earning.Farm 遭受閃電貸攻擊,黑客獲利超34 萬美元,攻擊者地址為0xdf31f4c8dc9548eb4c416af26dc396a25fde4d5f,零時科技安全團隊及時對此安全事件進行分析。
攻擊步驟
1. 調用閃電貸借出560 ETH
2. 調用receiveFlashloan函數,根據userData傳入參數調用_withdraw函數計算獲利資金為833 stETH
3. 歸還閃電貸資金560ETH,此時合約中仍有資金約273stETH
4. 調用withdraw函數取出合約中資金
5. 攻擊者共獲利268.7ETH
漏洞核心
合約正常邏輯為通過調用withdraw函數,判斷用戶持有的ef_token數量後計算用戶獲得的收益,之後通過閃電貸還款後剩餘的資金就是用戶獲得的收益。
但是在Vault合約中對於調用閃電貸的地址沒有進行判斷,因此攻擊者可以自行調用閃電貸合約,將閃電貸的接受者設置為EFLevelValue的地址,並且傳入的參數由用戶控制,攻擊者可以自行設置userData的數據。
在receiveFlashLoan函數中可以看到當傳入參數哈希值與“0x2”哈希值相等時執行_withdraw函數
攻擊者傳入參數userData為307832,通過進制轉換可知為字符串0x2
在_withdraw()函數中根據傳入的amount將stETH從AAVE中取出後兌換為WETH,之後歸還閃電貸資金,剩餘資金存在合約中。
在withdraw()函數中轉賬數量計算時沒有對於用戶應收的資金進行判斷,而是將合約中剩餘資金全部轉出。
因此攻擊者通過正常調用withdraw函數,可以使用少量的ef_token將合約中的資金全部轉出。
資金來源及去向
攻擊者初始資金來源於跨鏈合約
後續攻擊者將部分資金轉移至Tornado.cash混幣平台,部分資金轉移至地址0xDa08116d1e36CaDe5dE91bc6892FB0fAF00eBf15後通過multichain款連合約轉出
總結及建議
此次攻擊主要是由於在閃電貸合約中沒有對閃電貸合約發起者進行判斷使得攻擊者可以直接調用閃電貸將閃電貸接收者設置為被攻擊合約進行計算獎勵的操作,並且在提取獎勵時沒有對用戶應獲得的獎勵進行判斷,直接將合約剩餘資金全部轉出,因此攻擊者可以使用少量的ef_token將攻擊獲得資金全部轉移。
安全建議
- 建議在閃電貸時對發起閃電貸地址進行判斷,避免攻擊者惡意調用合約
- 建議項目方上線前進行多次審計,避免出現審計步驟缺失