2020年12月29日,慢霧安全團隊對整個Cover協議被攻擊流程進行了簡要分析。 1.在Cover協議的Blacksmith合約中,用戶可以通過deposit函數抵押BPT代幣; 2.攻擊者在第一次進行deposit-withdraw後將通過updatePool函數來更新池子,並使用accRewardsPerToken來記錄累計獎勵; 3 .之後將通過_claimCoverRewards函數來分配獎勵並使用rewardWriteoff參數進行記錄; 4.在攻擊者第一次withdraw後還留有一小部分的BPT進行抵押; 5.此時攻擊者將第二次進行deposit,並通過claimRewards提取獎勵; 6.問題出在rewardWriteoff的具體計算,在攻擊者第二次進行deposit-claimRewards時取的Pool值定義為memory,此時memory中獲取的Pool是攻擊者第一次withdraw進行updatePool時更新的值; 7.由於memory中獲取的Pool值是舊的,其對應記錄的accRewardsPerToken也是舊的會賦值到miner; 8.之後再進行新的一次updatePool時,由於攻擊者在第一次進行withdraw後池子中的lpTotal已經變小,所以最後獲得的accRewardsPerToken將變大; 9.此時攻擊者被賦值的accRewardsPerToken是舊的是一個較小值,在進行rewardWriteoff計算時獲得的值也將偏小,但攻擊者在進行claimRewards時用的卻是池子更新後的accRewardsPerToken值; 10.因此在進行具體獎勵計算時由於這個新舊參數之前差值,會導致計算出一個偏大的數值; 11.所以最後在根據計算結果給攻擊者鑄造獎勵時就會額外鑄造出更多的COVER代幣,導致COVER代幣增發。具體accRewardsPerToken參數差值變化如圖所示。