By : Kong@慢霧安全團隊
據慢霧區情報,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參數差值變化如下圖: