Cover: 代币无限增发漏洞
Cover: 代币无限增发漏洞
攻击者通过反复对项目智能合约Blacksmith进行质押和取回操作,触发其中包含铸造代币的操作,对Cover代币进行无限增发,导致Cover代币价格崩盘。此次攻击共获利440万美金,约合人民币2900万人民币。
Blacksmith合约:0xe0b94a7bb45dd905c79bb1992c9879f40f1caed5
攻击步骤:
攻击者使用132,687.999999999999951334COVER假代币(0x53df0bfa014b7522299c129c5a7b318f02adb469) 和2,572.833144991010563535DAI,为Balancer Pool提供流动性. (0x3631f3ad7351921f522b5634a4416536cb008d03b69dde8a001fdedc273a5be7),获得了1,326,879.999999999999224039个Balancer流动性证明代币BPT。
攻击者向Cover Protocal中的Blacksmith.sol智能合约质押前一步中所得的所有Balancer流动性证明代币BPT。(0xd721b0ef2886f14b75548b70d2d1fd82bea085ca24f5de29b833a64cfd8f7a50)
质押时,攻击者调用位于Blacksmith.sol智能合约中的deposit函数,如图一所示:
图一
首先通过图一中118行将当前流动性证明代币的pool数据读取到memory,然后调用121行代码对当前pool的数据进行更新。
图二
如图二第75行所示,在updatePool()函数中修改的当前流动性证明代币的pool数据是一份存储在storage中的数据,与在deposit()中存储在memory中当前流动性证明代币的pool数据是两份数据。在图二第84行lpTotal的值代表当前合同中总共存入的流动性证明代币数目,由于该变量数值较小,因此通过84行公式pool.accRewardsPerToken的数值将会增大,更新过的accRewardsPerToken值存储在storage中。
图三
如图三中318行所示,deposit()通过调用_claimCoverRewards()函数,向函数调用者(msg.sender)铸造一定数目的cover代币。
铸造cover代币的数目与pool.accRewardsPerToken, CAL_MULTIPLIER以及miner.rewardWriteoff三个变量相关。
请注意这里pool.accRewardsPerToken的数值是使用了存放在memory中的pool数据,并非使用图二中update()函数更新之后的数值。
同时,通过图一中deposit函数得知,miner.rewardWriteoff的数值更新是在_claimCoverRewards()函数执行完成之后发生。
因此原本设计上应使用更新过的miner.rewardWriteoff的数值计算需要铸造cover代币的数目,这里错误的使用了未更新过的miner.rewardWriteoff的数据,导致实际铸造cover代币数目比应铸造代币数目增多,最终导致了代币增发。
质押成功之后,攻击者通过调用智能合约中的withdraw()函数,将质押的BPT取回,同时取得额外铸造的cover代币,完成攻击。
通过对比执行deposit()函数和执行withdraw()函数之后的代币结余表,我们可以发现通过这一组deposit和withdraw函数调用之后,攻击者可以获得约704个COVER代币。
- 质押成功之后,攻击者通过调用智能合约中的withdraw()函数,将质押的BPT取回,同时取得额外铸造的cover代币,完成攻击。(0xadf27f5dd052482d46fdf69a5208a27cc7352522c7c19bbde5aee18f6ea4373b)
攻击者通过反复执行deposit和withdraw函数,可以使无限铸造代币,并将代币转到自己的地址中,由此获利。此次攻击共获利440万美金,约合人民币2900万人民币。之后被标记为 Grap Finance 白帽子的地址将所得收益还给了 Cover 团队(0xc2fd5094c1e108f83222a86bd46b35fc0da35616385d681964b22003643f982e), 并销毁了剩余的 COVER ,留言:Next time, take care of your own shit. 目前归还的4350个ETH位于地址0x15957f0ca310d35b2e73fb5070ce44a5b0141ab1中。
临时修复后的Blacksmith合同(0x1d5fab8a0e88020309e52b77b9c8edf63c519a26) 临时禁止了一切质押和取回操作,以此阻止攻击者继续实行攻击。