0x1 事件背景
Grim Finance是一個智慧收益最佳化平臺,允許使用者將AMMs(自動做市商)發行的LP-Tokens押在Grim Vaults中,這些LP-Tokens會自動收穫並將其獎勵重新押在LP-Tokens上,以獲得複合效應,幫助使用者收穫更多的獎勵。
零時科技區塊鏈安全情報平臺監控到訊息,北京時間2021年12月19日,Grim Finance官方發推文稱平臺被外部攻擊者利用,攻擊者盜幣價值超過3000萬美元,零時科技安全團隊及時對該安全事件進行復盤分析。
0x2 攻擊者資訊
零時科技安全團隊透過初步追蹤分析,此次攻擊發生在Fantom鏈,主要攻擊資訊如下:
- 攻擊者錢包地址
https://ftmscan.com/address/0xdefc385d7038f391eb0063c2f7c238cfb55b206c
- 攻擊者合約地址
https://ftmscan.com/address/0xb08ccb39741d746dd1818641900f182448eb5e41#code
- 攻擊交易
https://ftmscan.com/tx/0x19315e5b150d0a83e797203bb9c957ec1fa8a6f404f4f761d970cb29a74a5dd6
- GrimBoostVault合約
https://ftmscan.com/address/0x660184ce8af80e0b1e5a1172a16168b15f4136bf#code
0x3 攻擊分析
以下將拆解攻擊者交易,方便讀者更清晰地瞭解攻擊過程。
第一步:攻擊者閃電貸借款30枚BTC和92萬枚WFTM,並透過PancakePair將借款新增流動性獲取0.0476枚Spirit LP。
第二步:將獲取的Spirit LP質押後獲得GB-BTC-FTM。
第三步:透過多次質押存款獲取GB-BTC-FTM(攻擊的主要部分,透過未驗證的Token不斷質押,提高質押獎勵的差值)。
第四步:將獲取的GB-BTC-FTM歸還,獲得0.0663枚Spirit LP(已透過多次質押差值獲利)。
第五步:解除流動性獲取41枚BTC和128萬枚WFTM,並歸還閃電貸借款及手續費,隨後將獲利的11枚BTC和36萬枚WFTM轉至攻擊者錢包地址。
攻擊者透過同樣的攻擊手法繼續進行了8次攻擊,如下圖
至此
攻擊者透過9筆攻擊交易共獲取累計獲取26萬枚BTC,1865萬枚,75萬枚DAI,75萬枚USDC,13萬枚BOO,價值約3000萬美元。
下來透過合約程式碼瞭解漏洞發生的原因。
0x4 漏洞細節
透過查詢交易詳情可以找出本次攻擊中使用的合約方法主要有兩個:
GrimBoostVault.depositFor方法,使用者質押資金並返回相應的證明代幣。
GrimBoostVault.withdrawAll方法,使用者歸還證明代幣獲取對應的質押資金。
透過交易分析我們可以得知,攻擊者成功的第三步主要是由於多次運轉depositFor方法造成,首先來分析該方法,通讀depositFor方法流程,主要是判斷使用者將資金質押轉入合約後,計算合約餘額差值,隨後將差值進行計算後傳送給使用者相應的質押證明代幣。乍一看貌似沒有安全問題,但細心的同學會發現,這裡的token地址並沒有做固定限制,該token地址是由使用者傳入,由於depositFor方法中會用到token合約地址中的safeTransferFrom方法,token合約地址為使用者可控後,safeTransferFrom方法隨之可控。
現在可明確攻擊者的攻擊路徑,首先建立Token合約,並在合約中的safeTransferFrom方法中寫入重新呼叫GrimBoostVault.depositFor方法的邏輯,在進行多次重入後最後傳入一筆正常的Token代幣質押,之後雖然會進入到正常流程,但是由於之前的多次重入,導致獲取合約餘額的前後差值過大,最終鑄造了大量的證明代幣。
例如:攻擊者進行了6次重入,最後一次傳入資金為100,那麼最終得到的差值就是100*6,鑄幣時的計算值也是600。
重入成功後,攻擊者呼叫withdrawAll方法歸還重入獲取的大量證明代幣獲取對應的質押資金,完成獲利。
目前,Grim Finance官方已暫停所有金庫,並提醒使用者儘快提取自身所有資金,暫未宣告合約修改方案和補償方案。
0x5 總結
透過此次攻擊事件來看,攻擊者主要利用GrimBoostVault合約depositFor方法未進行Token地址檢查,透過多次重入造成巨大的合約餘額差值,鑄造大量資金,隨後透過withdrawAll方法取走獲利的資金,DeFi專案中類似的攻擊事件居多,為何還會頻頻發生,對於DeFi專案而言,合約程式碼的安全,代幣價格的相對穩定,方法傳參的可控性,舊版本的及時更新都是保證專案安全極其重要的部分,任何細節的馬虎都可能導致專案及使用者資金受到損失。對於此類閃電貸攻擊事件,零時科技安全團隊給出以下建議。
0x6 安全建議
- 對於合約程式碼安全,可找多家安全審計公司進行審計。
- 對於涉及資金轉賬的方法,應進行嚴格的許可權控制。
- 對敏感性較強的程式碼,要做到及時更新完善。