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参数差值变化如图所示。