历史多数攻击(Past Majority Attacks)指的是历史上对某区块链拥有控制权(即共识节点中的大多数)的组织或个人,利用自己历史上存在的对该网络的控制权,从这个历史时间点开启新的分叉,但是这种分叉一般无法影响到原来主网络上的资产,只是fork出一条新的区块链。
•在PoS模型下,当某个组织在某个历史区块拥有控制权时,其可以重构,从而危及他人的权益。然而让重构的区块被网络所接受,攻击者需进一步重构一条新的分支来取代当前分支。
•PoW模型下,修改历史区块需重新计算有效哈希,并构建足够长的分支以取代当前分支,这需要非常庞大并且超过现有P0W网络整体算力的基础上才有可能。
•BFT类模型下,亦需要多数共识节点均同意方可构造新的分支。因此在POW和BFT类模型下,此攻击退化为51%攻击。
•BFT模型下,攻击者需要控制过去时间点上2/3 以上的节点,才可以控制整个共识网络,才可以发动历史多数攻击。
如果矿工(或矿池)想要利用自身拥有的哈希算力进行欺骗或攻击的话,比特币的共识机制(什么是共识机制)至少在理论上是有可能被攻击的。正如我们所看到的,共识机制依赖大多数矿工出于个人利益而愿意诚实行事的假设前提。但是,如果一个矿工或矿工集团能获得全网较大比例的挖矿能力时,他们就可以通过攻击共识机制从而瓦解比特币网络的安全性和可用性。
值得注意的是,共识攻击只会影响将来的共识,或者最多也只能影响到“不久前”(过去的几十个区块)的时段。比特币的账本随着时间推移将越来越稳定。虽然在理论上允许任何深度的分叉存在,但在实践中,要迫使非常深的分叉产生需要极其巨大的算力,因此老的区块实际上是不可变的。共识攻击也不会威胁私钥和签名算法(ECDSA)的安全。共识攻击无法盗取比特币,无法不带签名地使用比特币,也不能转移比特币,不能改变过去的交易或所有权记录。共识攻击只能影响最近的区块,并且通过拒绝服务攻击来破坏将来的区块生成。
一种针对共识机制的攻击叫作“51%攻击”。这是由一群控制了51%以上的全网哈希算力的矿工,合谋发起的对比特币的攻击。他们拥有开采大部分区块的能力,可以故意在区块链中制造“分叉”、进行双重支付交易,或者针对特定交易或地址发起拒绝服务攻击。分叉/双重支付攻击指的是攻击者通过在某个区块之下创建分叉,形成新的主链,使之前已确认的区块变得无效。只要拥有足够的算力,攻击者就可以将连续6个甚至更多区块变为无效,从而使那些经过6次确认、已被认定为是无法篡改的交易变为无效状态。另外,需要注意的是,双重支付只能应用于攻击者自己创建的交易,因为他们只能对这些交易进行有效签名。如果通过使交易失效,攻击者可以得到不可逆的交换品,或者可以购买产品而不用付钱,那么对自己创建的交易进行双重支付是有利可图的。
先来看看大多数攻击(Most Attacks)在PoW共识模型中的表现。若某个组织掌握了整个网络的大多数算力(51%),那么该组织构造一个有效区块的平均时间会少于其他所有的矿工,从而在相同的时间内该组织可以构造出更多的区块,并以最长的分支被网络接受为最终确认区块。这样整个区块链处于该组织的控制之下。
显而易见,网络规模越大,总算力越强,掌握大多数算力的难度亦越高。
在PoS模型中,51%攻击转变为掌握网络中的大多数股权,其攻击的代价从算力(电力)变为资产。
在BFT类共识模型中,控制了1/3的共识节点即可阻止共识,控制了2/3的共识节点即可操作共识结果。由于此类模型中共识节点通常是一个特定的范围,其安全性依赖于选择共识节点时的审査机制,以及对节点的安全保护。
长程攻击(Long-Range Attacks)来源于用户不得不撤回保证金的权利。这意味着攻击者可以从任意长度的距离建立一个分叉而不用担心被削减。一旦保证金被解除绑定,激励不从某个高度区块前进行长距离投票就被取消了。换句话说,当超过2/3的验证者解除了绑定,那么他们就可以恶意地创造包含之前验证者集的第二条链,这可能导致任意的交易。
解决方法如下。
•忽视从那些当前没有保证金存款的节点发出的共识信息,能够解决或规避长程攻击问题。解除绑定保证金必须要经过一个“解冻”期。解除绑定之后,代币需要数周到数月的“解冻”时间,用以实现“同步性”前提(即延迟的消息)。
•禁止在N个块之前恢复,其中N是保证金的长度。该规则可使任何长程分叉无效。
此类攻击仅针对PoS共识。
贿赂攻击(Bribery Attacks)指的是敌手方故意使用数字货币或者法币贿赂共识节点,使其工作在特定的区块或者分叉上,来产生对敌手方有利的分叉链。
•PoW算法:由于每个节点都可以自由地加入,有资格参与共识生成区块,因此这种攻击在策略上是可行的。
•PoS、DPoS算法:参与共识的节点需要占据一定的股份权益,因此实施这种攻击需要贿赂绝大多数权益节点。
•DBFT共识算法:在容忍f个节点错误的情况下共有3f+l个共识节点,因此贿赂f+1个节点后能使共识暂停出块,贿赂2f+l以上节点时才能按照对敌手方有利的方式出块。
首先要引入一个概念,即剑手(Slasher)协议。如果你在同一个层级的分叉上同时签署了两份协议,那么你就会失去你所能得到的区块奖励。
无利害关系(Nothing At Stake Attacks)问题指的是,权益证明机制中的矿工最佳的策略是在所有的叉上进行挖矿,因为签名的制造非常便宜。
解决方法:将保证金加入剑手协议意味着无利害关系问题被正式解决。只有当验证节点缴纳存款保证金的时候,它签署的承诺才有意义。当一个保证金节点在相同高度处创建或签署两个区块时,则其存款保证金就会被削减,并且这种行为会被认为是“明显不良的行为”。苛刻以及允许这种惩罚的条件,对于所有的BFT协议都是有帮助的。此类攻击仅针对PoS共识。
无法同步攻击(Desynchronization Attacks)就是让一个节点无法与网络中的其他节点保持统一步调。比如,让节点A收到区块的时间总是要比其他节点晚一些,这样即使A成功记账,也会远远落后于其他节点,从而不被网络接受,也就造成了节点A无法获得其算力预期的收益。
这个通常是PoW、PoS、DPoS的问题;PBFT或者DBFT因为记账节点首先会选择高性能的服务器,并且通常并不会直接开放在开放性网络中,而是由同步节点作为连接对象,因此共识节点很难产生无法同步的问题。通常达成共识并即刻落账。
在交易拒绝攻击(Transaction Denial Attacks)中,对手的目的是阻止某笔交易成功完成。例如,对手可能想要瞄准一个特定账户,并防止账户持有人发布交易。
这个问题可以分2个阶段来分析。
1)在进入P2P网络之前,任何共识算法都是一样的,如果发出交易的节点在这个时间点的网络上是被控制的,那么这笔交易是没办法流转到P2P网络的。
2)在进入P2P网络之后,P2P网络会发散式地广播这笔交易到所有的共识节点。于是这个问题就退化成了51%攻击,即是否控制了共识的问题(参见51%攻击)。
日蚀攻击(Eclipse Attacks)是一种针对比特币网络的攻击。每个比特币网络节点默认最多允许被117个其他节点连接(输入连接),同时最多可以向其他8个节点发起连接(输出连接)。
日蚀攻击的目标就是比特币节点的接入连接。通过控制某一个比特币节点的接入连接来达到控制比特币输入的消息来源,使这个节点仅跟恶意节点通信。
日蚀攻击中,攻击者只需40%的算力就可以达到51%攻击的效果。假设比特币网络分为2个算力为30%的节点和一个算力为40%的节点,如果攻击者拥有算力为40%的节点,他就能通过日蚀攻击来达到分割这两个30%算力的节点,使之不能正常出块。这样攻击者拥有的40%算力的节点就能控制整个网络。
日蚀攻击的实施方法如下。
1)攻击者可以通过某种方法把正常的比特币节点的输出连接都连接到攻击者控制的恶意节点,同时比特币节点的输入连接都被恶意节点连满。那如何做到让正常的比特币节点都连接到恶意的节点呢?在比特币节点中有两张表,一张叫作NewTable,用来保持当前节点所感知到的网络中其他节点的地址;另一张叫作TriedTable,用于保存曾经连接过的节点。比特币节点每次建立输出连接的,都是在这两张表中选择一个时间戳较新的节点连接。通过控制僵尸网络不断地去连接这个比特币节点,即可达到刷新这两张表的目的,使得这两张表保存了大量的恶意节点的地址信息。
2)攻击者再通过DDoS攻击等方法,让这个比特币节点重启。这样这个比特币节点连到的就都是攻击者控制的恶意节点了。
从本质上说,日蚀攻击是一种针对P2P网络的攻击。这种攻击方法与共识算法关系不大,理论上讲对PoW、PoS、DbFT等共识算法都有效,但是它非常依赖于节点在P2P网络处理上的漏洞,因此实施攻击不具备普适性。
权利压迫(Grinding Attacks)是指攻击者在获得记账权的时候,利用自己手中的权利实施一些计算或者一些操作让系统的随机数产生偏斜,来增加自己下一次获得记账权的可能性,可能的方式如下。
方式一:一个验证者通过一些参数组合或者找到一个特殊的参数来增加自己被选择,产生一个有效块的可能性。
方式二:利用对当前块的控制能力去影响下一个块。
举一个不真实的例子,块N+1的随机性依赖于块N的签名,如果一个验证者在当前块中一直指定自己是下一个块的验证者,便永远控制住了整个系统。
方式三:通过跳过块的方式,控制出块的随机性。
由于N+1的随机性依赖于N的验证者,验证者得以通过跳过自己创建的块的方式来控制出块的随机性。当然这会丢失一个块的奖励,但是随之而来的,他可能拥有下面数十个块高于平均数的随机性控制能力。
PoS提出了两种解决方案。
(1)第一种方法
权利压迫的方式一和方式二比较容易解决,一般的做法是要求验证者事先抵押自己的资产,并且也不使用那些容易被操纵的信息来产生随机数。对于方式三,可以采用以下的策略:首先考虑使用基于秘密共享或者确定性门限函数的方案,并且验证者协同生成随机值,那么除非大多数验证者勾结,否则这些方案对于所有操作都是强大的。
(2)第二种方法
使用验证者事先提交信息(即发布sha3(x))的密码方案,在块中发布x,随后将x添加到随机性池中。这里有两个理论攻击方式。
1)在承诺时间处理x。这是不切实际的,因为随机性结果会考虑到许多参与者的价值,如果他们中的一个是诚实的,那么产出将是一个统一的分配结果。均匀分布与任意多个任意偏置分布异或,仍然给出均匀分布。
2)有选择地避免发布块。这种攻击花费了一个块奖励机会的成本,并且因为该方案阻止任何人看到除了下一个以外的任何未来验证者,所以它几乎无法提供多于一个块的奖励。唯一的例外情况是,如果验证程序跳过,则下一个验证程序再运行,如果验证程序的内容是相同的,那么这会是一个严重的问题。对此可以通过明确的跳过惩罚,来加大惩罚更多的跳跃。
3)Iddo Bentov的“多数信标”是一种解决方案,它通过获取由其他信标生成的前N个随机数的位的大部分来产生随机数(即,如果大部分源数字中的第一个比特为1,则结果的第一比特位为1,否则为0;如果源数字中的大部分第二个比特为1,则结果的第二个比特为1,否则为0等)。总而言之,存在许多己知的权利压迫解决方案。这个问题更像差分密码分析,而不是
停滞的问题——一个让利益相关者、设计者最终理解
并且现在知道如何克服的麻烦,而不是一个根本的、不可避免的缺陷。
•PoW:记账权的争夺依赖于算力,因此不存在权利压迫。
•PoS:存在权利压迫,需要加入其他机制来避免。
•DPoS:DPoS其实更多的是一种理念,具体要看delegate的实现。如果不是确定的随机性,依然会存在权利压迫的可能性。如果是按照顺序执行的,则没有这个问题。
•PBFT:确定性的记账人顺序,公平的随机性,因此不存在权利压迫。
•DBFT:引入代议制的选举委托机制,在公平的基础上推选出可信的确定性的记账人列表,并按照顺序来验证出块,因此不存在权利压迫问题。
2018-11-17 15:18
公有链中,在没有身份认证机构的情况下,用户创建新身份或新节点是不需要代价的,攻击者可以很容易地伪造身份加入网络,并试图去获取大量的ID。在掌握了若干节点或节点身份之后,他们可以随意做出一些恶意的行为,比如发出虚假节点加入请求消息,误导节点之间正确路由来降低区块链网络节点査找效率;发布虚假资源或是故意不响应请求来消耗节点之间的链接资源等。
图5-2演示了在比特币网络中,大量的Sybil节点被注入到网络中。这些节点可以假冒比特币的全节点,故意不响应请求,使得其他节点必须为此等待,从而拖慢整个区块链网络的速度;而且像手机钱包(比特币钱包介绍)这种SPV节点,都需要通过全节点才能正常收发比特币,当SPV节点连接到这种假冒的全节点时,它们就无法正常工作了。
双花攻击(Double Spending Attacks)是指同一个数字货币可以花费一次以上。
在区块链中,每一笔交易都是一个请求。区块链会验证这个交易的请求,并检査其所使用的资产的有效性、是否使用了己花费的资产来决定是否提交进入共识,并广播成功验证的账本。如果系统对双花攻击没有防范,将会是一件非常可怕的事情。
这也是每一个区块链必须要解决的问题,在不同的共识体系下解决方案也会不同。
(1)PoW共识算法(查看什么是pow)
在PoW体系下,系统同时允许存在多条分叉链(什么是区块链分叉),每一条链都可以声称自己是正确的。但是有一个最长有效原理,即不管在什么时候,最长的那条区块链被认为是拥有最多的工作量,称之为主链。当然,如果其他的分支链在接下来获得了更多的工作量,并超越了原先主链的长度,那么主链就会变成这条新链,而之前的主链则会被认为是无效的链,而且在这个分叉上所进行的交易会被认为是无效的,转而以新的主链为主。比特币目前大概需要12个区块的确认时间,才能基本确定某笔交易的不可篡改,因为要超越这一工作量将是非常困难的,并且攻击的代价会随着区块数的增加变得越来越困难。
在这个过程中有一种可能,在比特币的众多分支中,假设在第一条链分支上花费了一笔钱,再假设黑客能操控算力,让第二条链能拥有更多的算力并超越了第一条链的长度,那么第一条链的交易便相当于回滚了,黑客就能重新再拥有第一条链上花费掉的比特币,这个过程就是比特币上的双花。
因此,PoW共识算法要求等待一定的区块确认数,当工作量达到几乎无法超越、回滚的状态时,才可以确认为资产的成功转移。
(2)PoS、DPoS、DBFT共识算法
此类算法是确定性的,交易一旦确认就不可逆转,因此没有双花攻击。
双花攻击的特例是重放攻击,即攻击者“重放”他在网络上“窃听”或在区块链中“看到”的消息。由于这样会导致整个验证实体重做计算密集型的动作和/或影响对应的合约状态,同时它在攻击侧又只需要很少的资源,因此重放攻击也是所有区块链必须要解决的一个问题。如果是一笔支付交易,那么问题就更大了,重放可能会导致在不需要付款人的参与下,多于一次的支付。
对于UTXO模型,要防止重放攻击,共识节点只需要对收到的交易检査其Hash是否在账本中存在,或者检査交易的input是否已经被花费即可。
对于Balance模型,在交易中放置一个nonce值,要防止重放攻击,共识节点只需要对收到的交易检査其Hash是否在账本中存在即可。
其他区块链专业名词:
多重签名——典型的数字签名技术
HMAC——典型的数字签名技术
时间戳服务器
拜占庭将军问题是什么