©2023云安全联盟大中华区版权所有1 @2023云安全联盟大中华区-保留所有权利。你可以在你的电脑上下载、储存、展示、查看及打印,或者访问云安全联盟大中华区官网(https://www.c-csa.cn)。须遵守以下:(a)本文只可作个人、信息获取、非商业用途;(b)本文内容不得篡改;(c)本文不得转发;(d)该商标、版权或其他声明不得删除。在遵循中华人民共和国著作权法相关条款情况下合理使用本文内容,使用时请注明引用于云安全联盟大中华区。 致谢 云安全联盟大中华区(简称:CSAGCR)区块链安全工作组在2020年2月份成立。由黄连金担任工作组组长,9位领军人分别担任9个项目小组组长,分别有:知道创宇创始人&CEO赵伟领衔数字钱包安全小组,北大信息科学技术学院区块链研 究中心主任陈钟领衔共识算法安全小组,赛博英杰创始人&董事长谭晓生领衔交易所安全小组,安比实验室创始人郭宇领衔智能合约安全小组,世界银行首席信息安全架构师张志军领衔Dapp安全小组,中国移动集团信安中心高工于乐博士领衔去中心化数字身份安全小组,北理工教授祝烈煌领衔网络层安全小组,武汉大学教授陈晶领衔数据层安全小组,零时科技CEO邓永凯领衔AML技术与安全小组。区块链安全工作组现有100多位安全专家们,分别来自中国电子学会、耶鲁大学、北京大学、北京理工大学、世界银行、中国金融认证中心、华为、腾讯、知道创宇、慢雾科技、启明星辰、天融信、联想、OPPO、零时科技、普华永道、安永、阿斯利康等六十多家单位。 本白皮书主要由共识算法安全小组专家撰写,感谢以下专家的贡献:原创作者:陈钟关志王珂 审核专家:黄连金江洪郭鹏程姚凯 关于研究工作组的更多介绍,请在CSA大中华区官网(https://c-csa.cn/research/)上查看。 如本白皮书有不妥当之处,敬请读者联系CSAGCR秘书处给与雅正!联系邮箱: research@c-csa.cn;国际云安全联盟CSA公众号。 序言 从早期的分布式一致性算法的缓慢发展到现如今区块链共识的百花齐放,共识算法的发展已经走过了四十年左右的时光。随着区块链技术的快速发展,共识算法也在不断演进和提高,不同的共识算法的侧重点不同,因此它们所面临的问题、环境也不一样。 共识算法,可以理解为是为了实现分布式一致性协议而产生的一系列流程与规则。当分布在不同地域的节点都按照这套规则进行协商交互之后,最终总能就某个问题得到一致的决策,从而实现分布式系统中不同节点的一致性。 《共识算法与共识安全》白皮书深入介绍了CFT类共识算法、经典拜占庭共识和开放BFT类共识等三大类共识算法,并延伸到了共识算法安全性分析和测试方法。报告旨在提供一份系统的关于共识算法安全的知识,从共识算法理论和实现两方面展开安全测试和分析,理论分析主要从算法本身展开分析,实现分析从算法的具体参数、代码实现、应用部署等都方面进行安全分析和测试。基于测试方法和标准,对共识算法安全的典型安全进行分析,并给出分析过程和结论。报告以超级账本和以太坊共识算法为例,探索这些项目在共识算法安全领域的实践经验。 报告旨在为区块链开发者、投资者、组织机构在共识算法安全领域提供指导,通过详细数据和案例进行论证,力求将理论与实践更好结合,希望能为您提供有关共识算法的有益信息,帮助您更好地理解和应用这项技术。 李雨航YaleLiCSA大中华区主席兼研究院院长 目录 1共识算法介绍6 1.1介绍6 1.2CFT类共识算法6 1.3经典拜占庭共识9 1.4开放BFT类共识17 2共识算法安全性分析36 2.1安全建模36 2.2分析方法39 2.3攻击方法41 3共识算法安全测试方法和标准48 3.1共识算法安全理论分析和模拟48 3.1.1共识算法安全理论分析48 3.1.2安全性与恶意攻击类型49 3.1.3应对策略50 3.1.4共识算法安全模拟51 3.2共识算法安全渗透测试和代码安全审查55 3.2.1安全指标55 3.2.2渗透测试57 3.2.3渗透测试工具和代码安全审计58 3.3共识算法安全CheckList59 4共识算法安全案例分析62 4.151%攻击62 4.2DDoS攻击63 4.3BGP劫持攻击64 5共识算法安全的最佳实践64 5.1超级账本的共识算法安全最佳实践64 5.2以太坊共识算法安全最佳实践66 参考文献69 1共识算法介绍 1.1介绍 共识问题是社会科学和计算机科学等领域的经典问题,计算机科学领域的早期共识研究一般聚焦于分布式一致性,即如何保证集群中所有节点中的数据完全相同并且能够对某个提案(Proposal)达成一致,主要解决的问题是因节点失效、节点间网络故障及分布式系统的运行速度的差异而带来的系统不一致问题。Fischer等在1985年提出了FLP不可能原理,即在网络可靠,但允许节点失效(即便只有一个)的最小化异步模型系统中,不存 在一个可以解决一致性问题的确定性共识算法[1]。EricBrewer在1998年提出了CAP理论,指出在异步的网络模型中,所有的节点由于没有时钟,仅仅能根据接收到的消息作出判断,系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容忍性 (PartitionTolerance)这三项中的两项[2]。 FLP不可能性可以采用更弱的终止条件或者更强的网络假设解决,Ben-Or在1983年提出了完全异步模型下概率终止的共识算法[3],Dwork等人在1988年提出了部分异步模型下的共识算法,保证在网络同步的时侯算法能够确定性终止[4],Leslie等在1982年提出了同步模型下的共识问题[5]。 早期的共识算法一般也称为分布式一致性算法,与目前主流的区块链共识算法相比,分布式一致性算法主要面向分布式数据库操作、且大多不考虑拜占庭容错问题,即假设系统节点只发生宕机和网络故障等非人为问题(CFT,CrashFaultTolerance),而不考虑恶意节点篡改数据等问题(BFT,ByzantineFaultTolerance,拜占庭容错)。拜占庭容错问题是Leslie在1982年提出的分布式领域容错问题,它是分布式领域中最复杂、最严格的容错模型[5]。在该模型下,系统不会对集群中的节点做任何的限制,节点可以向其他节点发送随机数据、错误数据,也可以选择不响应其他节点的请求.这些无法预测的行为使得容错这一问题变得更加复杂。 1.2CFT类共识算法 CFT类共识算法只保证分布式系统中节点发生宕机错误时整个分布式系统的可靠性,而当系统中节点违反共识协议的时候无法保障分布式系统的可靠性,因此CFT共识算法目前主要应用在企业内部的封闭式分布式系统中。目前流行的CFT共识算法主要有Paxos算法及其衍生的Raft共识算法。此外,获得较多研究关注的共识算法还有两阶段提交 (Two-PhaseCommit)算法、三阶段提交(Three-PhaseCommit)算法、Zab、Kafka等。 1.2.1Paxos共识算法 Paxos共识算法是基于消息传递的一致性算法,由LeslieLamport在1990年提出[6],该算法基于同步性假设,通过引入超时(Timeout)概念规避了FLP不可能问题,如果在确认下个值的过程没有进展,Paxos会等到超时,然后重新进行共识的步骤。Paxos的算法步骤如下: 阶段1:准备请求 1)提案者选择新的提案号(n),然后向接收者发送“准备请求”。 2)当接收者收到准备请求(“prepare,”n),且n比已经接收到的其他准备请求大,接收者会发出消息(“ack,”n,n’,v’)或(“ack,”n,^,^)。 3)接收者承诺不会再接纳任何提案号小于n的准备请求。 4)如果有的话,接收者会发出具有最高提案号的提案值(v),反之则发出空消息^。阶段2:接收请求 1)如果提案者收到大多数接收者的响应,则可以发出带有提案号n和价值v的接收请求(“accept,”n,v)。 2)n是准备请求中出现的数字。 3)v是响应中具有最高提案号的提案值。 4)当收到接收请求(“accept,”n,v)时,除非接收者已经采纳了大于n的提案号,否则接收者就会采纳这个请求。 阶段3:学习阶段 1)每当接收者采纳了一个提案,就会向所有学习者返回(“accept,”n,v)。 2)学习者从多数接收者那儿得到(“accept,”n,v),选定最终的值v,然后向其他学习者发送(“decide,”v)。 3)学习者收到(“decide,”v)和最终决定的值v。 图1Paxos算法示意 为了提供部署的灵活性,Paxos描述的许多主要特性都是开放式的,比如领导者选举、侦错、日志管理等内容。这种设计选择后来成为Paxos最大的缺点之一,使得Paxos不仅难以理解,而且难以实施。 1.2.2RAFT共识算法 因为Paxos晦涩难懂,2013年Ongaro和Ousterhout为Raft复制状态机提出了一种新型共识算法[7],其核心目标是可理解性,主要有两方面的改进: 1)将整体算法的描述分解为子问题 Raft算法将其整体划分成了几个子问题,每个子问题都可以独立解释,从而理解Raft 算法只需要相对独立地理解几个子问题即可。Raft算法可分为以下几个子问题: Leaderelection:描述如何从集群节点中选举出Leader; LogReplication:描述如何将日志同步到各个节点从而达成一致; Safety:定义了一组约束条件保证Raft算法的强一致性; Membershipchanges:描述如何变更集群关系(增加或者减少节点)。2)简化状态空间 Raft算法尽可能地确定各个环节的状态。典型地,Raft算法采用strongleader模型,每个日志的读写均由Leader从中主动协调,整体系统的数据流变得非常简单:从Leader流向Follower。而且每个节点的状态也只有3种:Leader,Candidate和Follower。如图2所示: 图2RAFT数据流 此外,Raft使用两个超时机制控制领导人选举,分别是选举超时及心跳超时。在Raft中,如果节点宕机并重启后,在试图声明成为领导者(Leader)之前,需要至少等待一个超时周期,并且一定会有所进展。 1.3经典拜占庭共识 经典拜占庭共识算法能够保证当系统中不超过一点数量的节点发送拜占庭行为时,系统仍能够保持一致性。经典拜占庭容错系统普遍采用的假设条件包括:(1)拜占庭节点 的行为可以是任意的,拜占庭节点之间可以共谋;(2)节点之间的错误是不相关的;(3)节点之间通过异步网络连接(如Internet网络),网络中的消息可能丢失、乱序到达、延 时到达;(4)服务器之间传递的信息,第三方可以知晓但不能篡改或伪造信息的内容,可以通过签名技术实现这一点。 目前主要有两种类型的经典拜占庭协议,一种是基于状态复制的,称为Agreement-Based协议,通过节点间的相互通信达成对请求序列的共识;另一种是Quorum-based协议,客户端直接与节点交互,乐观地执行请求。前者一般通信复杂度较高,后者处理争议的代价比较高。 BFT类算法效率一般较低,很难实用,学术界和业界对BFT协议进行了大量改进,其优化的主要思路是针对无拜占庭错误的场景,尽可能降低协议复杂度,提高效率。 1.3.1Agreement-basedBFT协议 Agreement-basedBFT协议通常需要有一个主节点作为网络中的枢轴,与其他节点相比,主节点在共识过程中起最主要的作用,但通常也会成为系统性能的瓶颈。主节点需要将客户端发来的请求排序后发送给所有的备份节点,所有节点通过互相通信后达成一致, 实现安全性(Safety),大多数协议中所有节点也会向客户端回复响应,实现活性 (Liveness)。该类协议通常需要3f+1个节点实现对f个拜占庭节点的容错。 1.3.1.1PBFT协议 PB