Cosmos安全漏洞解析:21天锁仓资金可提前赎回?_ATO:K Bitcoin Bond

今晨,Cosmos团队表示在CosmosSDK发现严重安全漏洞。PeckShield安全人员分析发现,原本Cosmos抵押之后需要等待21天才能赎回,但合约代码里Validator状态变化时存在一种逻辑缺陷,使得用户可以减少21天固定赎回时间,从而提前赎回抵押的数字资产,进而破坏原本的POS共识可更短周期使用资金进行重复抵押赚取利息。

Cosmos是最新上线的基于Tendermint共识的区块链网络,提出IBC通迅协议,用于解决资产跨链的问题,其核心主链被称为CosmosHub,号称『万链之王』。其上的平台代币为Atom,用户通过验证者投票参与服务治理与维护,同时接收系统激励,史称『Staking模式』,为2019年区块链明星项目之一。

CosmosHub是基于Tendermint,它依靠一组验证者来保护网络,等同于Bitcoin、Ethereum等PoW网络中的矿工角色;

验证者运行一个完整的Cosmos节点,并通过广播包含由其私钥签署的加密投票参与共识,有一定的硬件投入成本;

验证者需要抵押定额的Atom作为保证金,且系统只有股权最高的100个节点会成为验证者;

验证者在区块链中打包交易提交新块并获得系统激励,这是验证者的收入,等同于挖矿收益;

另外,验证者在参与治理方面,他们还必须对网络中的提案进行投票,只有投票通过的提案才能发挥效应,投票权重根据每一位验证者存放的总权益进行加权;

安全稳定的验证者会产生稳定的收益,有问题的节点导致您损失本金,例如验证者节点掉线会损失0.01%本金。

由此可知,运行一个Validator角色的难度不低于开一个PoW矿池,普通用户要想加入Cosmos主网,并获取收益是个门槛比较高的事情。

由于普通用户持币但又不想参与验证,那么其手中的Atom会面临增发而贬值,但是直接参与Cosmos主网有一定的技术难度,因此出现了委托人Delegator角色。委托人是那些不能或不想自己运行验证节点的Atom持有者,普通用户可以将Atom委托给验证人并获得部分收入,例如星火矿池提供的委托服务。

用户一旦赎回委托订单,Cosmos将在赎回操作21天之后将委托抵押的Atom退回给委托人。

因此这21天为平台固定的锁仓时间,如果出现一种情况,Cosmos系统存在设计缺陷,导致委托人的赎回周期可变,这对平台上的其它用户来说,是不公平的,也破坏了Cosmos区块链的共识机制。

在了解这个漏洞之前,我们先来看下Cosmos网络之上的验证者状态变化图:

其中,一共有三个状态:

bonded

unbonded

unbonding

状态之间的变化关系如下:

验证者默认属于unbonded状态,当发起bondValidator之后,状态变更为bonded,

变更这一状态之后,验证者开始接收系统收益;

而当验证者发起beginUnbondingValidator以退出bonded状态时,其状态变更为unbonding,

同时系统不再给这一验证者发送任何收益,同时这一验证者的委托人可以发起赎回操作;

若委托人没有发起赎回操作,那么处于unbonding状态的验证者可以重新bondValidator回到bonded状态以接收系统收益;

动态 | Aragon将与Cosmos合作开发Aragon Chain:去中心化自治组织(DAO)项目Aragon在博客宣布,将与Cosmos合作开发Aragon Chain,这条PoS链将专门用于社区自治。 据悉,此前Aragon曾在以太坊和Polkadot上运行摇摆不定。Aragon在官方博客中就此解释称,当时曾经对Polkadot和Cosmos发链进行过研究,在两者之中选择最能满足Aragon需求的公链,最后得出结论是Cosmos SDK的EVM模块最适合Aragon发链,这可以让已经开发的产品达到更好的兼容性。 按照Aragon的预想,Aragon DAO可能会在多链上同时运行。当然,Aragon在博客中也提到并不会放弃以太坊,未来依旧会在以太坊上部署。[2019/10/12]

处于unbonding状态的验证者,当用户赎回时间21天到期之后,将进入到unbonded状态,此时委托者接收到之前抵押的Atom及抵押期间的收益。

上面我们了解到验证者在帮助抵押赎回方面的整体流程,表面上没有什么问题,PeckShield安全人员在分析CosmosSDK代码的时候,发现了这一赎回流程中的致命设计缺陷,可导致委托者利用验证者unbonding状态,突破21天锁仓固定期而提前赎回。

我们先看旧版的赎回代码:

其大体流程如下,获取验证者的unbonding完成时间和区块高度;

将待赎回部分代币根据锁仓到期时间和区块高度生成一个锁币赎回记录;

将这一赎回记录保存到队列之中,等待时间到期之后,退还锁币资金给委托人。

细心的用户发现了这里的问题,一图以盖之:

简而言之,系统在计算锁仓到期时间的时候,误用Validator开始unbond状态时间和Delegator赎回发起时间,使得Delegator可以使用这一时间差赠取差异:

Validator正常发起beginUnbondingValidator操作;

Delegator在Validator发起unbond操作之后7天时发起Undelgate赎回操作,理论上赎回时间为21天,但是这里计算的时候使用的是Validator发起unbond操作的时间,

因此,这一个Deletagor『免费』缩减了7天的赎回时间,再经过14天时间就可以收到锁仓的资金。

此时,我们再来看修复之后的代码:

此时,无论Delegator何时发起Undelgate操作,都会确保从操作发起时开始计算21天,而与验证者无关。

Staking作为2019年新潮的区块链方向,获取了一定的瞩目,无论你是Staking的项目方,还是参与Staking的验证者及普通用户,在资产面前,我们都应该保有敬畏之心。

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

金宝趣谈

[0:0ms0-4:772ms