事件背景
零時科技區塊鏈安全情報平台監控到消息,北京時間2022年10月27日,BSC鏈上Victor the Fortune 合約受到黑客閃電貸攻擊,攻擊者已獲利約5.8萬美元,耗盡了流動資金池,攻擊者地址為0x57c112cf4f1e4e381158735b12aaf8384b60e1ce,零時科技安全團隊及時對此安全事件進行分析。
攻擊步驟
1. 攻擊者通過閃電貸借出約100,000 USDT
2. 將藉出的USDT兌換為77,853 VTF
3. 調用updateUserBalance()函數計算獲得獎勵
4. 調用transfer函數將資金全部轉移至地址0x1dd557415a0ddea7d3e56f49c78d54ebbf31f569
5. 調用updateUserBalance()函數獲得獎勵
6. 重複執行第四步和第五步,最後共獲得499,803,157 VTF
7. 將獲得的VTF兌換獲得158,450 USDT
8. 歸還閃電貸後共獲利58,450 USDT
漏洞核心
攻擊者通過調用transfer函數進行轉賬,在轉賬函數中調用了updateUserBalance()函數,由於此時userBalanceTime[user]為0會將當前時間賦值給userBalanceTime[user]。
之後調用updateUserBalance(),當userBalanceTime大於0時會調用getUserCanMint函數計算獎勵值
在getUserCanMint函數中計算返回值是用戶的餘額除以常數乘當前時間與用戶開始時間的時間差,由於沒有設置最小時間差,因此在很短時間調用函數也可以獲得獎勵。
由於調用一次updateUserBalance()函數後會更新時間,攻擊者通過調用transfer函數將資金轉移至一個新的地址,再次調用updateUserBalance()函數可以繼續獲利,並且當攻擊者地址資金增加時獲得的獎勵也隨著增加,攻擊者通過重複以上步驟獲得獎勵逐漸增加直到將池子掏空。
總結及建議
此次攻擊是由於合約中的計算獎勵函數的算法只與用戶地址餘額和時間差有關,攻擊者通過先調用轉賬獲得用戶初始時間,之後調用獲得獎勵的函數,通過這兩個函數調用過程中的時間差計算獲得獎勵。通過多次轉賬計算獲得獎勵使得資金累加,最後將池子中代幣幾乎掏空。
安全建議
- 建議對於計算獲得獎勵時設置最小時間差,避免攻擊者通過短時間多次調用函數獲利。
- 建議項目方上線前進行多次審計,避免出現審計步驟缺失