本文由CertiK安全驗證團隊撰稿,授權金色財經首發。
最近小區出現了一些流浪狗,聽說鄰居家有孩子看到狗嚇得就跑,結果反而被狗狂追咬了一口。
還好父母機智,給孩子上了個意外險,幾針狂犬病疫苗下來沒怎麼花錢。
作為幣民如果加密資產不幸被盜,但項目方或者你個人購買了保險,那麼也大可放心讓保險公司償還損失的資產。
可還有最差的一種情況:但是如果連保險公司都出了安全事故,受到攻擊了呢?
北京時間12月28日晚, CertiK安全技術團隊發現Cover Protocol發生代幣無限增發漏洞攻擊。
攻擊者通過反覆對項目智能合約進行質押和取回操作,觸發其中包含鑄造代幣的操作,對Cover代幣進行無限增發,導致Cover代幣價格崩盤。
技術分析主要攻擊分為以下步驟:
1. 攻擊者設置攻擊必要的NOCLAIM代幣。
2. 攻擊者使用NOCLAIM代幣,為Balancer Pool提供流動性:
①總計向Balancer Pool提供了2,573個DAI的流動性
②攻擊者通過向Balancer Pool提供流動性,獲得了約132,688個Balancer流動性證明代幣BPT
3. 攻擊者向Cover Protocal中的Blacksmith.sol智能合約質押(stake)前一步中所得的所有Balancer流動性證明代幣。
質押時,攻擊者調用位於0xe0b94a7bb45dd905c79bb1992c9879f40f1caed5的Blacksmith.sol智能合約中的deposit函數,如圖一所示:
圖一:The deposit() function in blacksmith.sol
通過調用deposit函數,攻擊者將得到的BPT流動性證明質押到cover protocol中。
首先通過圖一中118行將當前流動性證明代幣的pool數據讀取到memory,然後調用121行代碼對當前pool的數據進行更新。
圖二:blacksmith.sol中的updatePool()函數
如圖二第75行所示,在updatePool()函數中修改的當前流動性證明代幣的pool數據是一份存儲在storage中的數據,與在deposit()中存儲在memory中當前流動性證明代幣的pool數據是兩份數據。
在圖二第84行lpTotal的值代表當前合同中總共存入的流動性證明代幣數目,由於該變量數值較小,因此通過84行公式pool.accRewardsPerToken的數值將會增大,更新過的accRewardsPerToken值存儲在storage中。
圖三:blacksmith.sol中的_claimCoverRewards()函數
接下來如圖三中318行所示,deposit()通過調用_claimCoverRewards()函數,向函數調用者(msg.sender)鑄造一定數目的cover代幣。
鑄造cover代幣的數目與pool.accRewardsPerToken, CAL_MULTIPLIER以及miner.rewardWriteoff三個變量相關。
請注意這裡pool.accRewardsPerToken的數值是使用了存放在memory中的pool數據,並非使用圖二中update()函數更新之後的數值。
同時,通過圖1中deposit函數得知,miner.rewardWriteoff的數值更新是在_claimCoverRewards()函數執行完成之後發生。
因此原本設計上應使用更新過的miner.rewardWriteoff的數值計算需要鑄造cover代幣的數目,這裡錯誤的使用了未更新過的miner.rewardWriteoff的數據,導致實際鑄造cover代幣數目比應鑄造代幣數目增多,最終導致了代幣增發。
質押成功之後,攻擊者通過調用blacksmith.sol智能合約中的withdraw()函數,將質押的BPT取回,同時取得額外鑄造的cover代幣,完成攻擊。
通過對比執行deposit()函數和執行withdraw()函數之後的代幣結餘表,我們可以發現通過這一組deposit和withdraw函數調用之後,攻擊者可以獲得約704個COVER代幣。
deposit()之後:
withdraw()之後:
攻擊者通過反覆執行deposit和withdraw函數,可以使Blacksmith函數無限鑄造代幣,並將代幣轉到自己的地址中,由此獲利。
攻擊發生後,截止發稿時,cover官方已經將blacksmith遷移到安全版本:
有漏洞的blacksmith地址:
0xe0b94a7bb45dd905c79bb1992c9879f40f1caed5
臨時修復後的blacksmith地址:
0x1d5fab8a0e88020309e52b77b9c8edf63c519a26
臨時修復後的blacksmith合同臨時禁止了一切質押和取回操作,以此阻止攻擊者繼續實行攻擊。
本次攻擊最初攻擊者共獲利440萬美金,約合人民幣2900萬人民幣。
有其他攻擊者利用該漏洞發動類似攻擊,例如Grap.finance項目官方參與了利用該漏洞的攻擊,獲利4350個ETH代幣。
在攻擊發生後幾個小時,Grap.finance項目官方通過Twitter聲稱對本次攻擊負責,並表示已將所有的獲利退回給了Cover Protocol。
安全建議為了確保數字資產不因任何非技術原因遭受損失,項目方應及時為項目產品購買保險,增加項目方和投資者的安全保障方案,確保其因受到攻擊所造成的損失可以被及時補償。
作為世界頂尖的審計公司,CertiK目前已經進行了超過369次安全審計,審計了超過198,000行代碼,並保護了價值超過100億美元的加密資產。
近期,CeritK推出了CertiKShield去中心化資金保障計劃。
CertiKShield不僅可以為項目及其社區成員提供保障,同時,CertiK作為主營業務為審計的安全公司,我們確保自己的保險項目擁有更高的安全性。
相比於純粹的保險公司,安全技術的背書及團隊對於安全的重視和一系列的保障,CertiKShield是安全領域內構建的保險,並且有著巨大的成長和發展空間。
聲明:本文由入駐金色財經的作者撰寫,觀點僅代表作者本人,絕不代表金色財經贊同其觀點或證實其描述。
提示:投資有風險,入市須謹慎。本資訊不作為投資理財建議。