0x1 事件背景
零時科技區塊鏈安全情報平臺監控到消息,北京時間 2022年5月16日 BNB Chain 和 Ethereum 鏈上 FEGtoken 遭到閃電貸攻擊。損失資金價值超過130萬美元,零時科技安全團隊及時對此安全事件進行分析。
0x2 攻擊者信息
0x73b359d5da488EB2E97990619976F2f004e9fF7C
0x9a843bb125a3c03f496cb44653741f2cef82f445
https://etherscan.io/tx/0x1e769a59a5a9dabec0cb7f21a3e346f55ae1972bb18ae5eeacdaa0bc3424abd2(Ethereum)
https://bscscan.com/tx/0x77cf448ceaf8f66e06d1537ef83218725670d3a509583ea0d161533fda56c063(BNB?Chain )
https://etherscan.io/address/0xf2bda964ec2D2fcB1610c886eD4831bf58f64948#code(Ethereum)
https://bscscan.com/address/0x818e2013dd7d9bf4547aaabf6b617c1262578bc7#code(BNB?Chain )
0x3 攻擊分析
通過分析攻擊者在BNB Chain和 Ethereum 兩條鏈上的多筆攻擊交易,每筆攻擊交易流程大致如下:
1.攻擊者通過閃電貸或者已獲利的資金作為攻擊交易的初始資金。
2.將獲取的一部分初始資金質押后,從FEG Wrapped BNB合約中獲取 fWrapped 代幣,例如BNB質押獲取fBNB。
3.攻擊者通過攻擊合約繼續創建10個新的合約地址,為后續調用做準備。
4.攻擊者將獲取的 fWrapped 代幣通過 FEGexPRO.depositInternal 進行存款,此時攻擊者在 FEGexPRO 合約有存款資金。
5.攻擊者將自己創建的10個合約地址逐一作為path傳入“
FEGexPRO.swapToSwap方法,通過FEGexPRO.depositInternal 和FEGexPRO.swapToSwap多次循環調用,最終10個合約均獲得轉移合約資金權限。
FEGexPRO.swapToSwap
FEGexPRO.depositInternal
6.攻擊者調用轉賬方法獲取授權給合約資金,成功獲利(部分交易歸還閃電貸)。
0x4 漏洞細節
通過攻擊交易流程可以發現,攻擊者成功獲利的主要操作是通過上述步驟五循環調用FEGexPRO.depositInternal和FEGexPRO.swapToSwap 兩個方法獲取合約的授權資金。這里跟進以上兩個方法:
FEGexPRO.swapToSwap 方法
通過之前的交易流程可以明確,攻擊者通過一步正常調用 depositInternal 方法存款后,調用swapToSwap方法傳入的path參數為攻擊者創建的合約地址。由于path正常情況下為兌換路徑,swapToSwap方法邏輯中會給當前路徑進行approve授權操作,方便后續兌換資金轉移。但由于攻擊者傳入的path為自己創建的合約地址,所以這里swapToSwap方法邏輯中也會給攻擊者傳入的合約地址授權,但在后續path調用中,該資金并未轉移,也就是用戶余額減少了,但該合約地址中資金并未減少。(此時攻擊者并未獲利)
隨后攻擊者繼續調用depositInternal 方法,繼續跟進:
FEGexPRO.depositInternal 方法
該方法中,傳入的可控值只有amt,也就是存款金額。由于第一次正常調用depositInternal方法已經進行了存款,并且攻擊者調用swapToSwap方法也給自己的合約進行了授權操作,唯一與正常邏輯不符合的是,FEGexPRO合約地址的余額未及時減除,此步驟正好給了攻擊者可乘之機。
當攻擊者調用swapToSwap方法后,FEGexPRO合約余額未減除時,攻擊者繼續調用depositInternal方法進行存款,由于存款時會先獲得之前的代幣余額,之后進行轉賬,隨后獲取FEGexPRO合約地址余額,所以當攻擊者此時轉入很小的資金,并不會對合約資金有大的影響,但由于之前的FEGexPRO合約地址余額未通過swapToSwap方法減除,所以這里攻擊者依然能夠獲取與第一次等量的存款。
之后攻擊者通過swapToSwap與depositInternal循環調用,獲取了FEGexPRO合約的所有資金。
0x5 資金來源及去向
BNB Chain 和 Ethereum 鏈上攻擊者資金來源均來自 Tornado.Cash 混幣平臺,數量分別為1枚 ETH 和 1 枚 BNB。目前兩條鏈上獲利資金 144.8 枚ETH 和 3278.1 枚BNB 均未轉移。
0x6 總結
通過此次攻擊事件來看,FEGexPRO.swapToSwap合約未對傳入的path路徑參數進行嚴格校驗,導致攻擊者可以通過多個攻擊合約多次循環授權,取走合約中所有資金。對于該合約代碼的校驗缺失風險,完全可以通過代碼安全審計避免風險發生。
0x7 安全建議
來源:安全客