Cover 协议攻击时间分析:黑客利用accRewardsPerToken实现代币增发_VER:Neverend Ecentralization Could Exange

12月29日,针对Cover协议遭受攻击一事,慢雾安全团队对整个流程进行了简要分析,如下:

1.在Cover协议的Blacksmith合约中,用户可以通过deposit函数抵押BPT代币;

2.攻击者在第一次进行deposit-withdraw后将通过updatePool函数来更新池子,并使用accRewardsPerToken来记录累计奖励;

Cover Protocol官方提醒用户警惕网站:Cover Protocol官方发推提醒用户警惕网站。“请不要上当受,也不要给任何联系您的人发送金钱/加密货币。Cover Protocol团队永远不会先给您发消息,也不会要求您发送COVER代币或ETH来换取更多的COVER代币。”[2021/1/25 13:26:18]

3.之后将通过_claimCoverRewards函数来分配奖励并使用rewardWriteoff参数进行记录;

Gate.io完成COVER代币新合约更换并恢复充提服务:据官方公告,Gate.io已完成COVER代币新合约部署更换,并且通过链上新合约完成新代币Claim赎回操作。Gate.io已经为用户按照1: 1 分发新的COVER代币,平台将承担敞口损失。老的COVER代币命名为 COVER_OLD,用户可以随时提现。新的COVER代币将保持COVER交易符号,并保持当前交易市场,目前已经开放充值提现服务。[2021/1/6 16:31:55]

4.在攻击者第一次withdraw后还留有一小部分的BPT进行抵押;

Gate.io 完成为用户分发COVER代币:据官方公告,Gate.io已经完成按照2020年12月30日12:00(UTC+8)快照为用户分发代币,老的COVER代币将命名为 COVER_OLD,用户可在账单明细中查看,可以随时提现。未来新的COVER代币将保持COVER交易符号,并保持当前交易市场,待新合约上线后将开放充值提现服务。会确保给所有用户1比1兑换,平台将承担敞口损失。[2021/1/4 16:22:56]

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参数差值变化如下图:

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金智博客

[0:15ms0-8:173ms