CertiK:一朝跌落云端,Yam Finance智能合約漏洞事件分析
紅薯剛種下,就得挖出來了?
今日DeFi領(lǐng)域再次發(fā)生一起魔幻事件,呼聲極高的紅薯項(xiàng)目一經(jīng)上線,流動性礦工們就開始瘋狂涌入。短短8個(gè)小時(shí)內(nèi),Yam Finance中鎖倉總價(jià)值就超過2億美元。COMP挖礦帶動了DeFi產(chǎn)業(yè)出圈,而YAM直接帶動了DeFi頭部項(xiàng)目集體上漲,堪稱“一飛沖天”。
然而短短36小時(shí)內(nèi),眼見它高樓起,高樓塌。數(shù)億美元因?yàn)橐粋€(gè)小小的漏洞,消失于無形。本以為反應(yīng)遲鈍的自己損失了一個(gè)億,沒想到保住了自己的五塊錢。
好好的小紅薯,究竟承受了什么?
事件背景
8月12日,YAM Finance官方宣布他們發(fā)現(xiàn)了一個(gè)智能合約漏洞,并稱該漏洞將生成超出最初設(shè)定數(shù)量的YAM代幣。在這種情況下,大量的保留代幣將造成治理操作所需的代幣數(shù)量過大。這意味著社區(qū)將來將沒有足夠的代幣來執(zhí)行任何治理操作。
智能合約漏洞出現(xiàn)在哪里?
該漏洞發(fā)生在YAM項(xiàng)目智能合約YAM.sol的rebase功能上,如下圖所示:
圖片來源:
https://github.com/yam-finance/yam-protocol/blob/767e3a4a6918b6fb6100ad6bb356164408f5d82f/contracts/token/YAM.sol#L340
上圖中的rebase功能應(yīng)該執(zhí)行rebase,以保持穩(wěn)定的價(jià)格。但是,有一行代碼(已標(biāo)注藍(lán)色)在計(jì)算totalSupply時(shí),給出了錯誤的結(jié)果,這會導(dǎo)致系統(tǒng)保留的代幣數(shù)量過多。
這行代碼的正確代碼/計(jì)算方程形式應(yīng)類似于以下代碼/方程:
- totalSupply =initSupply.mul(yamsScalingFactor).div(BASE);
那么是否可以在截止日期之前通過治理操作來修復(fù)此漏洞?
第二次調(diào)整是在美國東部時(shí)間8月13日凌晨4點(diǎn)。
YAM Finance公開宣布,在美東時(shí)間凌晨3點(diǎn)之前,他們需要約16萬YAM委托要求才能提交治理提案。如果在投票窗口中得到的委托超過40萬YAM,則該提案將允許用戶將YAM自行轉(zhuǎn)移或存入儲備池。
有一個(gè)好消息是,YAM獲得了其社區(qū)的大力支持,并且該提案已成功提交。但是,新提交的提案無法在智能合約中運(yùn)行,所以YAM目前依舊是一個(gè)不可管理的狀態(tài)。
YAM的現(xiàn)狀
YAM Finance目前已經(jīng)失去了治理能力,75%的流動資金已經(jīng)從YAM / yCRV未撥出資金池中移出。但是,其余的流動資金將從儲備庫中刪除。
據(jù)官方消息,Gate.io將為YAM Gitcoin捐贈,捐贈資金將被用于對YAM合約進(jìn)行審計(jì)。審計(jì)完成后,YAM合約將遷移到Y(jié)AM2.0。
如何避免?
所有區(qū)塊鏈項(xiàng)目在正式發(fā)布之前不僅需要使用嚴(yán)格的軟件測試工具來驗(yàn)證項(xiàng)目的代碼安全性,更是應(yīng)該邀請多個(gè)第三方區(qū)塊鏈安全團(tuán)隊(duì),做好對區(qū)塊鏈項(xiàng)目中代碼的驗(yàn)證審計(jì)工作,并在每次更新代碼后進(jìn)行重新審計(jì)。從而設(shè)計(jì)一個(gè)更好的項(xiàng)目管理系統(tǒng),以備進(jìn)行項(xiàng)目緊急更新的需求。
我們絕不僅僅是尋找漏洞,而是要消除哪怕只有0.00000001%被攻擊的可能性。