北京时间12月28日晚,CertiK安全验证团队发现CoverProtocol发生代币无限增发漏洞攻击。本文为你分析事件详情始末。
作为币民如果加密资产不幸被盗,但项目方或者你个人购买了保险,那么也大可放心让保险公司偿还损失的资产。
可还有最差的一种情况:但是如果连保险公司都出了安全事故,受到攻击了呢?
北京时间12月28日晚,CertiK安全技术团队发现CoverProtocol发生代币无限增发漏洞攻击。
声音 | 肖飒:年底将至,对于地方上中小型涉币交易所的打击可能会是“首选”:11月18日消息。对于上海展开虚拟货币交易所排查整治行动,中国银行法学研究会理事肖飒在接受采访时指出,从办案经验上讲,每年年关都是各省市执法机关很在意的“时间节点”,年底将至,对于辖区内的虚拟币交易所及周边行业进行摸查,也有合理性。在目前这轮清理整治行动中,打击重点预计还是会集中在集资、非法经营等罪名,对于地方上中小型涉币交易所的打击可能会是“首选”。[2019/11/18]
攻击者通过反复对项目智能合约进行质押和取回操作,触发其中包含铸造代币的操作,对Cover代币进行无限增发,导致Cover代币价格崩盘。
技术分析?
主要攻击分为以下步骤:?1.攻击者设置攻击必要的假代币。
2.攻击者使用假代币,为BalancerPool提供流动性:
声音 | 律师肖飒:互联网法院认可区块链技术收集证据,应当制作电子送达凭证:律师肖飒在微信公众号发文称,当事人提交的电子数据,通过电子签名、可信时间戳、哈希值校验、区块链等证据收集、固定和防篡改的技术手段或者通过电子取证存在平台认证,能够证明其真实性的,互联网法院应当确认。也就是说,互联网法院对于“哈希值校验”“区块链存证”等技术手段取证是认可的。关于如何送达的问题,肖飒指出,完成有效送达的,互联网法院应当制作电子送达凭证。这个凭证具有送达回证效力。我们相信,适用区块链等新技术,可以让电子送达凭证更“可信”。[2018/12/24]
①总计向BalancerPool提供了2,573个DAI的流动性
②攻击者通过向BalancerPool提供流动性,获得了约132,688个Balancer流动性证明代币BPT
3.攻击者向CoverProtocal中的Blacksmith.sol智能合约质押(stake)前一步中所得的所有Balancer流动性证明代币。质押时,攻击者调用位于0xe0b94a7bb45dd905c79bb1992c9879f40f1caed5的Blacksmith.sol智能合约中的deposit函数,如图一所示:
声音 | 律师肖飒:狭义“币圈”与“链圈”以“发币上交易所”为界限:中国银行法学研究会理事肖飒今日发文谈“币圈”与“链圈”的区别。文中表示,“狭义的‘币圈’,单指交易所及上交易所的项目方成员及其联盟等。狭义的‘链圈’,单指只从事区块链技术研发、落地应用的团队及联盟等。这两个定义里的币圈和链圈,几乎是不重合的,因为两者的价值观和行为方式以‘发币上交易所’为界限。”[2018/8/30]
图一:Thedeposit()functioninblacksmith.sol
通过调用deposit函数,攻击者将得到的BPT流动性证明质押到coverprotocol中。
首先通过图一中118行将当前流动性证明代币的pool数据读取到memory,然后调用121行代码对当前pool的数据进行更新。
Upbit运营商Dunamu三季度营业利润同比下降76.6%至1.27亿美元:11月29日消息,韩国加密货币交易所Upbit运营商Dunamu发布的最新报告显示,其2022年第三季度营收为2719亿韩元(约合2.05亿美元),同比下降66.3%;营业利润为1687亿韩元(约合1.27亿美元),同比下降76.6%;净利润为1599亿韩元(约合1.21亿美元),同比下降72.7%。与第二季度相比,该公司营业收入及营业利润分别下降24.1%和39.3%。该公司表示,持续的全球流动性下降和资本市场整体萎缩等因素对其业绩产生了影响。(Zdnet)[2022/11/29 21:10:07]
图二:blacksmith.sol中的updatePool()函数
OpenSea Seaport以太坊链上交易额突破20亿美元:金色财经报道,据Dune Analytics最新数据显示,基于开源NFT协议Seaport的OpenSea以太坊链上总交易额已突破20亿美元,本文撰写时为2,002,874,121美元,以太坊链上总交易量6,419,647笔,独立用户量956,583。[2022/11/8 12:30:46]
如图二第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()之后:
withdraw()之后:
攻击者通过反复执行deposit和withdraw函数,可以使Blacksmith函数无限铸造代币,并将代币转到自己的地址中,由此获利。攻击发生后,截止发稿时,cover官方已经将blacksmith迁移到安全版本:
有漏洞的blacksmith地址:
0xe0b94a7bb45dd905c79bb1992c9879f40f1caed5
临时修复后的blacksmith地址:
0x1d5fab8a0e88020309e52b77b9c8edf63c519a26
临时修复后的blacksmith合同临时禁止了一切质押和取回操作,以此阻止攻击者继续实行攻击。?
本次攻击最初攻击者共获利440万美金,约合人民币2900万人民币。
有其他攻击者利用该漏洞发动类似攻击,例如Grap.finance项目官方参与了利用该漏洞的攻击,获利4350个ETH代币。
在攻击发生后几个小时,Grap.finance项目官方通过Twitter声称对本次攻击负责,并表示已将所有的获利退回给了CoverProtocol。
安全建议
为了确保数字资产不因任何非技术原因遭受损失,项目方应及时为项目产品购买保险,增加项目方和投资者的安全保障方案,确保其因受到攻击所造成的损失可以被及时补偿。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。