CertiK:賣意外險的保險公司也遭受了意外? Cover Protocol漏洞分析
最近小區出現了一些流浪狗,聽說鄰居家有孩子看到狗嚇得就跑,結果反而被狗狂追咬了一口。
還好父母機智,給孩子上了個意外險,幾針狂犬病疫苗下來沒怎麼花錢。
作為幣民如果加密資產不幸被盜,但項目方或者你個人購買了保險,那麼也大可放心讓保險公司償還損失的資產。
技術分析

技術分析
技術分析
技術分析
主要攻擊分為以下步驟:
①總計向Balancer Pool提供了2,573個DAI的流動性
②攻擊者通過向Balancer Pool提供流動性,獲得了約132,688個Balancer流動性證明代幣BPT
圖一:The deposit() function in blacksmith.sol
通過調用deposit函數,攻擊者將得到的BPT流動性證明質押到cover protocol中。
首先通過圖一中118行將當前流動性證明代幣的pool數據讀取到memory,然後調用121行代碼對當前pool的數據進行更新。

接下來如圖三中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()之後:
有漏洞的blacksmith地址:
有漏洞的blacksmith地址:
0xe0b94a7bb45dd905c79bb1992c9879f40f1caed5
臨時修復後的blacksmith地址:
0x1d5fab8a0e88020309e52b77b9c8edf63c519a26
臨時修復後的blacksmith合同臨時禁止了一切質押和取回操作,以此阻止攻擊者繼續實行攻擊。
本次攻擊最初攻擊者共獲利440萬美金,約合人民幣2900萬人民幣。
安全建議
安全建議
安全建議
進入CertiK foundation官網訪問更多CertiK安全產品相關信息!


