织梦CMS - 轻松建站从此开始!

我的网站

当前位置: 主页 > 区块链

卖意外险的保险公司也遭受了意外?Cover Protocol漏洞分析

时间:2020-12-29 10:29来源:未知 作者:admin 点击:
作为币民如果加密资产不幸被盗,但项目方或者你个人购买了保险,那么也大可放心让保险公司偿还损失的资产。 可还有最差的一种情况:但是如果连保险公司都出了安全事故,受到攻
作为币民如果加密资产不幸被盗,但项目方或者你个人购买了保险,那么也大可放心让保险公司偿还损失的资产。 可还有最差的一种情况:但是如果连保险公司都出了安全事故,受到攻击了呢? 北京时间12月28日晚, CertiK安全技术团队发现Cover Protocol发生代币无限增发漏洞攻击。 攻击者通过反复对项目智能合约进行质押和取回操作,触发其中包含铸造代币的操作,对Cover代币进行无限增发,导致Cover代币价格崩盘。 技术分析 主要攻击分为以下步骤: 1. 攻击者设置攻击必要的假代币。 2. 攻击者使用假代币,为Balancer Pool提供流动性: ①总计向Balancer Pool提供了2,573个DAI的流动性 ②攻击者通过向Balancer Pool提供流动性,获得了约132,688个Balancer流动性证明代币BPT 3. 攻击者向Cover Protocal中的Blacksmith.sol智能合约质押(stake)前一步中所得的所有Balancer流动性证明代币。 质押时,攻击者调用位于0xe0b94a7bb45dd905c79bb1992c9879f40f1caed5的Blacksmith.sol智能合约中的deposit函数,如图一所示:

图一:The deposit() function in blacksmith.sol

通过调用deposit函数,攻击者将得到的BPT流动性证明质押到cover protocol中。 首先通过图一中118行将当前流动性证明代币的pool数据读取到memory,然后调用121行代码对当前pool的数据进行更新。

图二:blacksmith.sol中的updatePool()函数

如图二第75行所示,在updatePool()函数中修改的当前流动性证明代币的pool数据是一份存储在storage中的数据,与在deposit()中存储在memory中当前流动性证明代币的pool数据是两份数据。 在图二第84行lpTotal的值代表当前合同中总共存入的流动性证明代币数目,由于该变量数值较小,因此通过84行公式pool.accRewardsPerToken的数值将会增大,更新过的accRewardsPerToken值存储在storage中。

图三:blacksmith.sol中的_claimCoverRewards()函数

接下来如图三中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()之后: (责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容