據慢霧區情報,2021 年12 月19 日,Fantom 鏈上Grim Finance 項目遭受攻擊。慢霧安全團隊進行分析後以簡訊的形式分享給大家。 1. 攻擊者通過閃電貸借出WFTM 與BTC 代幣,並在SpiritSwap 中添加流動性獲得SPIRIT-LP 流動性憑證。 2. 隨後攻擊者通過Grim Finance 的GrimBoostVault 合約中的depositFor 函數進行流動性抵押操作,而depositFor 允許用戶指定轉入的token 並通過safeTransferFrom 將用戶指定的代幣轉入GrimBoostVault 中,depositFor 會根據用戶轉賬前後本合約與策略池預期接收代幣(預期接收want 代幣,本次攻擊中應為SPIRIT-LP)的差值為用戶鑄造抵押憑證。 3. 但由於depositFor 函數並未檢查用戶指定轉入的token 的合法性,攻擊者在調用depositFor 函數時傳入了由攻擊者惡意創建的代幣合約地址。當GrimBoostVault 通過safeTransferFrom 函數調用惡意合約的transferFrom 函數時,惡意合約再次重入調用了depositFor 函數。攻擊者進行了多次重入並在最後一次轉入真正的SPIRIT-LP 流動性憑證進行抵押,此操作確保了在重入前後GrimBoostVault 預期接收代幣的差值存在。隨後depositFor 函數根據此差值計算並為攻擊者鑄造對應的抵押憑證。 4. 由於攻擊者對GrimBoostVault 合約重入了多次,因此GrimBoostVault 合約為攻擊者鑄造了遠多於預期的抵押憑證。攻擊者使用此憑證在GrimBoostVault 合約中取出了遠多於之前抵押的SPIRIT-LP 流動性憑證。隨後攻擊者使用此SPIRIT-LP 流動性憑證移除流動性獲得WFTM 與BTC 代幣並歸還閃電貸完成獲利。此次攻擊是由於GrimBoostVault 合約的depositFor 函數未對用戶傳入的token 的合法性進行檢查且無防重入鎖,導致惡意用戶可以傳入惡意代幣地址對depositFor 進行重入獲得遠多於預期的抵押憑證。慢霧安全團隊建議:對於用戶傳入的參數應檢查其是否符合預期,對於函數中的外部調用應控制好外部調用帶來的重入攻擊等風險。