文:兰修文、胡景秀丨电子商务与电子支付国家工程实验室
区块链作为新兴技术受到越来越广泛的关注,是一种传统技术在互联网时代下的新的应用,这其中包括分布式数据存储技术、共识机制和密码学等。随着各种区块链研究联盟的创建,相关研究得到了越来越多的资金和人员支持。区块链的应用已延伸至多个领域,其在金融行业的应用受到诸多关注,金融行业是我国网络安全重点行业之一,系统及数据安全至关重要,因此区块链技术在安全层面所面临的挑战是个值得深入研究的课题。
该报告首先对区块链密码算法进行了详细的的介绍,其次对区块链面临的安全问题进行了分析,最后以不同角度对针对区块链的攻击进行了全面的分析与研究。经分析,目前区块链技术在平台安全性、匿名性与隐私性、技术壁垒等方面都存在着很多亟待解决的问题,这些问题是区块链技术应用于更多核心领域时需要重视且解决的关键问题,值得进一步探索与深入研究。
区块链的密码算法
下面将对区块链使用的Hash算法、零知识证明、环签名等密码算法进行详细分析。
一、 Hash算法
哈希算法作为区块链基础技术,Hash函数的本质是将任意长度(有限)的一组数据映射到一组已定义长度的数据流中。若此函数同时满足:
(1)对任意输入的一组数据Hash值的计算都特别简单;
(2)想要找到2个不同的拥有相同Hash值的数据是计算困难的。
满足上述两条性质的Hash函数也被称为加密Hash函数,不引起矛盾的情况下,Hash函数通常指的是加密Hash函数。对于Hash函数,找到使得被称为一次碰撞。当前流行的Hash函数有MD5,SHA1,SHA2,SHA3。
比特币使用的是SHA256,大多区块链系统使用的都是SHA256算法。所以这里先介绍一下SHA256。
1、 SHA256算法步骤
STEP1:附加填充比特。对报文进行填充使报文长度与448模512同余(长度=448mod512),填充的比特数范围是1到512,填充比特串的最高位为1,其余位为0。
STEP2:附加长度值。将用64-bit表示的初始报文(填充前)的位长度附加在步骤1的结果后(低位字节优先)。
STEP3:初始化缓存。使用一个256-bit的缓存来存放该散列函数的中间及最终结果。
STEP4:处理512-bit(16个字)报文分组序列。该算法使用了六种基本逻辑函数,由64 步迭代运算组成。每步都以256-bit缓存值为输入,然后更新缓存内容。每步使用一个32-bit 常数值Kt和一个32-bit Wt。其中Wt是分组之后的报文,t=1,2,…,16 。
STEP5:所有的512-bit分组处理完毕后,对于SHA256算法最后一个分组产生的输出便是256-bit的报文。
作为加密及签名体系的核心算法,哈希函数的安全性事关整个区块链体系的底层安全性。所以关注哈希函数的研究现状是很有必要的。
2、 Hash函数的研究现状
2004年我国密码学家王小云在国际密码讨论年会(CRYPTO)上展示了MD5算法的碰撞并给出了第一个实例(Collisions for hash functions MD4, MD5, HAVAL-128 and RIPEMD,rump session of CRYPTO 2004,How to Break MD5 and Other Hash Functions,EuroCrypt 2005)。该攻击复杂度很低,在普通计算机上只需要几秒钟的时间。2005年王小云教授与其同事又提出了对SHA-1算法的碰撞算法,不过计算复杂度为2的63次方,在实际情况下难以实现。
2017年2月23日谷歌安全博客上发布了世界上第一例公开的SHA-1哈希碰撞实例,在经过两年的联合研究和花费了巨大的计算机时间之后,研究人员在他们的研究网站SHAttered上给出了两个内容不同,但是具有相同SHA-1消息摘要的PDF文件,这就意味着在理论研究长期以来警示SHA-1算法存在风险之后,SHA-1算法的实际攻击案例也浮出水面,同时也标志着SHA-1算法终于走向了生命的末期。
NIST于2007年正式宣布在全球范围内征集新的下一代密码Hash算法,举行SHA-3竞赛。新的Hash算法将被称为SHA-3,并且作为新的安全Hash标准,增强现有的FIPS 180-2标准。算法提交已于2008年10月结束,NIST 分别于2009年和2010年举行2轮会议,通过2轮的筛选选出进入最终轮的算法,最后将在2012年公布获胜算法。公开竞赛的整个进程仿照高级加密标准AES 的征集过程。2012年10月2日,Keccak被选为NIST竞赛的胜利者,成为SHA-3。
Keccak算法是SHA-3的候选人在2008年10月提交。Keccak采用了创新的的“海绵引擎”散列消息文本。它设计简单,方便硬件实现。Keccak已可以抵御最小的复杂度为2n的攻击,其中N为散列的大小。它具有广泛的安全边际。目前为止,第三方密码分析已经显示出Keccak没有严重的弱点。
KangarooTwelve算法是最近提出的Keccak变种,其计算轮次已经减少到了12,但与原算法比起来,其功能没有调整。
二、 零知识证明
在密码学中零知识证明(zero-knowledge proof, ZKP)是一种一方用于向另一方证明自己知晓某个消息x,而不透露其他任何和x有关的内容的策略,其中前者称为证明者(Prover),后者称为验证者(Verifier)。设想一种场景, 在一个系统中, 所有用户都拥有各自全部文件的备份, 并利用各自的私钥进行加密后在系统内公开。 假设在某个时刻,用户Alice希望提供给用户Bob她的一部分文件,这时候出现的问题是Alice如何让Bob相信她确实发送了正确的文件。一个简单地处理办法是Alice将自己的私钥发给Bob,而这正是 Alice不希望选择的策略,因为这样 Bob可以轻易地获取到Alice的全部文件内容。零知识证明便是可以用于解决上述问题的一种方案。零知识证明主要基于复杂度理论,并且在密码学中有广泛的理论延伸。在复杂度理论中,我们主要讨论哪些语言可以进行零知识证明应用,而在密码学中,我们主要讨论如何构造各种类型的零知识证明方案,并使得其足够优秀和高效。
在1985年,Shafi Goldwasser,Silvio Micali和Charles Rackoff发表的“The Knowledge Complexity of Interactive Proof-System” 一文中首次提出了零知识证明的概念。文章中引入了交互证明系统(interactive proof system) 模型并构思了知识复杂性(knowledge complexity)这一概念(即证明方传递给验证者知识量的度量) 。同时作者给出了几种可以运用于零知识证明的具体困难问题–二次非剩余问题。之后的相关工作表明所有多项式时间内可以被验证的判定性问题(NP 问题) 都存在零知识证明。更进一步,任何可以通过交互式证明系统证明的判定性问题(IP 问题)和多项式空间内可判定的问题(PSPACE 问题)是等价的,并且都有零知识证明。 目前除了交互式零知识证明以外,还有两个主要变种:并行零知识证明和非交互零知识证明。
Zcash是首个使用零知识证明机制的区块链系统,能够提供完全的支付保密性,使用公有区块链来维护一个去中心化的网络,Zcash与比特币有一定的相似性,相同的是Zcash的代币ZEC总量是2100万元,不同的是Zcash交易的时候自动隐藏区块链上所有交易的发送者、接受者以及数额,只有拥有查看密钥的人才能看到交易的内容,用户具有完全的控制权,可以自行选择向其他任何一个人提供查看的密钥。
Zcash的原理就是在比特币交易的区块链的主链上加上一条侧链,这条侧链可以将付费者和收款者在数字货币的交易过程中把数字货币分成好几份,再重新在全网上发一遍,达到完全匿名交易的目的。采用了POW的分配方式,在前四年旷工的挖矿所得有20%会自动分配给Zcash的团队以及投资者的,与比特币等数字货币不同的是Zcash更加注重隐私和对交易透明的可控性。Zcash系统允许用户进行私人交易,也能维护支持交易的完整性,Zcash项目的出现,解决了比特币的监视风险,为比特币公开交易记录监控风险提供了解决方案。
三、 环签名群签名
1、群签名
在一个群签名方案中,一个群体中的任意一个成员可以以匿名的方式代表整个群体对消息进行签名。与其他数字签名一样,群签名是可以公开验证的,且可以只用单个群公钥来验证。群签名一般流程:
(1)初始化,群管理者建立群资源,生成对应的群公钥(Group Public Key)和群私钥(Group Private Key)群公钥对整个系统中的所有用户公开,比如群成员、验证者等。
(2)成员加入,在用户加入群的时候,群管理者颁发群证书(Group Certificate)给群成员。
(3)签名,群成员利用获得的群证书签署文件,生成群签名。
(4)验证,同时验证者利用群公钥仅可以验证所得群签名的正确性,但不能确定群中的正式签署者。
(5)公开,群管理者利用群私钥可以对群用户生成的群签名进行追踪,并暴露签署者身份。
2、环签名
2001年,Rivest, shamir和Tauman三位密码学家首次提出了环签名。是一种简化的群签名,只有环成员没有管理者,不需要环成员间的合作。环签名方案中签名者首先选定一个临时的签名者集合,集合中包括签名者。然后签名者利用自己的私钥和签名集合中其他人的公钥就可以独立的产生签名,而无需他人的帮助。签名者集合中的成员可能并不知道自己被包含在其中。
环签名方案由以下几部分构成:
(1)密钥生成。为环中每个成员产生一个密钥对(公钥PKi,私钥SKi)。
(2)签名。签名者用自己的私钥和任意n个环成员(包括自己)的公钥为消息m生成签名a。
(3)签名验证。验证者根据环签名和消息m,验证签名是否为环中成员所签,如果有效就接收,否则丢弃。
环签名满足的性质:
(1)无条件匿名性:攻击者无法确定签名是由环中哪个成员生成,即使在获得环成员私钥的情况下,概率也不超过1/n。
(2)正确性:签名必需能被所有其他人验证。
(3)不可伪造性:环中其他成员不能伪造真实签名者签名,外部攻击者即使在获得某个有效环签名的基础上,也不能为消息m伪造一个签名。
3、环签名和群签名的比较
(1)匿名性。都是一种个体代表群体签名的体制,验证者能验证签名为群体中某个成员所签,但并不能知道为哪个成员,以达到签名者匿名的作用。
(2)可追踪性。群签名中,群管理员的存在保证了签名的可追踪性。群管理员可以撤销签名,揭露真正的签名者。环签名本身无法揭示签名者,除非签名者本身想暴露或者在签名中添加额外的信息。提出了一个可验证的环签名方案,方案中真实签名者希望验证者知道自己的身份,此时真实签名者可以通过透露自己掌握的秘密信息来证实自己的身份。
(3)管理系统。群签名由群管理员管理,环签名不需要管理,签名者只有选择一个可能的签名者集合,获得其公钥,然后公布这个集合即可,所有成员平等。
区块链安全性研究
尽管区块链的防篡改、分布式存储、用户匿名等技术优势为其发展应用提供了大量的创新空间,但目前区块链技术在各领域的应用模式仍处于大量探索阶段,其深入应用仍需漫长的整合和发展过程。区块链技术本身仍存在一些内在安全风险,去中心化、自组织的颠覆性本质也可能在技术应用过程中引发一些不容忽视的安全问题。其主要分为系统安全和应用安全两大类。
一、系统安全
系统安全主要指的是底层代码安全、密码算法的安全以及共识机制的安全。底层代码安全是其应用和再开发的保障,其底层代码的漏洞对于其区块链项目的打击是致命,需要及时地进行修补。密码算法的安全是区块链不可篡改性和匿名性的一个保证,密码协议永远是跟随着当前科技的发展不断变化的,在量子时代,需要研究更加安全的抗量子密码协议确保密码算法的安全。在共识算法的设计中存在着著名的Trilemma(三难问题),即Secure(安全性)、Scalability(可扩展性)和Decentralization(去中心化)三者不可兼得,而目前几乎所有的区块链项目都遇到这种挑战。
1、底层代码的安全性
区块链底层相当于操作系统,由于开发者在开发过程中的疏忽造成的系统漏洞极大程度上影响系统的安全性,并且区块链的更新十分繁琐和困难,出现漏洞后的更新很可能造成硬分叉,因此底层代码的安全性十分重要。2018年8月的Bitcoin ABC(Bitcoincash全节点执行的开源代码)代码漏洞事件向我们展现了底层代码漏洞的危害性。根据Bitcoin ABC的官方报告,黑客可以通过这个漏洞构建一个恶意交易,该交易将被某一特定版本的 Bitcoin ABC 接收,但会被其他所有版本的比特币现金拒绝。这样一个漏洞的结果可能是形成比特币现金的分叉,即使使用敏感版本的矿工接受了恶意交易,其他矿工也不会接受的。Bitcoin ABC 表示他们已经直接向相关的矿业池运营商提供了补丁。这一事件说明漏洞总是会发生,但在重构这样一个关键代码时,应该花更多的时间和精力进行代码审查。
2、密码算法的安全性
随着量子计算机的发展将会给现在使用的密码体系带来重大的安全威胁。区块链主要依赖椭圆曲线公钥加密算法生成数字签名来安全地交易,目前最常用的ECDSA、RSA、DSA 等在理论上都不能承受量子攻击,将会存在较大的风险,越来越多的研究人员开始关注能够抵抗量子攻击的密码算法。
3、共识机制的安全性
对于一个共识协议,要满足以下三个特性:
· Common Prefix:对于任何两个诚实节点,他们的本地视图除却最后有限个块之后,所有诚实节点看到的链的视图是一致的。
· Chain Growth:保证区块链能够正常的增长,并且增长速度稳定。
· Chain Quality:对于一条链,任意截取其中一段,总有一部分是诚实节点产生的块。
以下列出目前一些针对共识的攻击手段。
3.1 51%攻击
在比特币中,若恶意用户控制节点中大多数的计算资源(超过51%),就有能力新改写整个公有账本,这被称为51%攻击。由于区块链网络的开放性和当前整个网络的算力不均衡性,尤其是专业挖矿芯片公司的产生与大矿池的形成,使其发生51%攻击的可能性显著提高。51%攻击会引发对于区块链的破坏以及对整个密码货币的破坏,不管攻击成功与否都会让其置于自私挖矿,双花攻击,分叉攻击等危险之下。
最近Horizen团队,对于51%攻击提出了其创新的解决方案:通过“延时函数”升级他们的工作量验证共识算法,来处罚蓄谋这种攻击的矿工。
3.2 自私挖矿
比特币的经济激励机制和自身的去中心化的特性是比特币系统依然能够良好运行的关键。但是,由于矿工的逐利性和当前比特币系统算力的不均衡,使得当前比特币系统受到了严峻的挑战,以色列学者Ittay Eyal在2014年提出了自私挖矿(selfish mining)的攻击方式。攻击者只要能控制全网超过1/3的算力, 就可以发起自私挖矿攻击, 获取更大的收益, 并对网络安全造成威胁。
最近,康奈尔大学两位研究员Cyril Grunspan 和Ricardo Perez-Marco的论文中通过探讨攻击向量与时间的关系,给出其相应的解决方案。
3.3 分区攻击
在P2P网络里, 只要控制一定数量的节点, 就可以进行Eclipse Attack[,从而发起51%攻击, 控制整个网络。这是一种分区攻击。分区攻击通过区块链部分网络的完全隔离实现即使当前控制的算力小于51%,但仍能发起51%攻击。由于分区攻击发起的前提为控制被隔离网络的所有节点,所以攻击成本较大,分区攻击并不是单独发起的往往伴随着双花,自私挖矿等攻击,使其攻击者获得较大利益。
3.4 NAS攻击(Nothing at stake)
针对PoW共识算法的出现的算力集中问题,PoS的提出在一定程度上解决了上述问题,然而伴随而来的是区块分叉的NAS攻击。由于在类似于PoS的共识算法中,区块分叉的成本支付是极小,矿工为实现自身利益的最大化和风险的最小化,会同时在多个分叉上进行挖矿,使其区块链网络得不到及时的收敛,从而破坏共识。当前对于NAS攻击的解决方案主要是保证金机制,即为了有资格获得块投票的奖励,用户必须付保证金,如果用户被发现在多个叉投票,那个交易证明将被放在原来的链上,取消用户的奖励。
二、应用安全
应用安全主要指的是智能合约安全、数字钱包安全以及隐私保护。智能合约安全是当前区块链安全问题中一个重要的问题,当前许多区块链的安全事件都与智能合约的安全有一定的联系,这也是区块链应用发展的一个不可避免的问题。区块链钱包是储存和使用数字虚拟货币的工具,区块链钱包对虚拟币的持有者们是非常重要的其重要性等同于现实生活中的银行卡,所以区块链钱包安全是至关重要的。隐私保护一直是隐私性和安全性两难的问题,对于用户我们希望不要泄露其自身信息的同时享有其安全性,通过环签名、承诺协议和零知识证明可以有效地在保护隐私的同时保障其安全性。
1、智能合约的安全性
智能合约具有不可更改的性质,并且和密码货币强相关,因此智能合约出现安全问题会造成严重后果和经济损失。
2010年8月15日,比特币区块链的第74638块上被 发现了一条包含有92233720368.54277039 BTC的交易记录,而且这些比特币仅被发送到两个比特币地址。而导致这次攻击的原因,是由于比特币代码中的大整数溢出漏洞。为使这笔交易失效,比特币核心开发人员开发了比特币补丁版本,并启动了硬分叉。在33个区块的竞争之后,带补丁版本的区块链才成为主链,消除了原有漏洞的影响。
2016 年6 月,以太坊最大众筹项目The DAO 被攻击,黑客获得超过350 万个以太币,后来导致以太坊分叉为ETH 和ETC。
新加坡国立大学的Loi Luu提出了现在的智能合约存在的几种安全漏洞。
1.1 交易顺序依赖合约
交易顺序依赖就是智能合约的执行随着当前交易处理的顺序不同而产生差异。智能合约在执行交易时,会将合约状态进行更新,在传统公有链上其未处理的交易顺序并没有完全确定,不同的交易顺序的执行会产生不同的合约状态,这样就会导致用户期待的调用合约时的状态与实际的合约状态产生差异;当前合约的状态取决于矿工在执行智能合约时对交易的调用顺序,而这种合约状态的不一致往往是其安全漏洞的来源。
1.2 时间戳依赖合约
按照以太坊的对于时间戳的要求,矿工在处理一个新的区块时,如果新的区块的时间戳大于上一个区块,并且时间戳之差小于900秒,那么这个新区块的时间戳就是合法的。攻击者可以更改时间戳值或者可以选择不同的块的时间戳来操纵依赖于时间戳的智能合约的结果。
1.3 误操作异常
在以太坊中,一个合约调用另一个合约可以通过send指令或直接调用另一个合约的函数。然而在调用过程中出现异常时,被调用的合约会中止执行,回退到调用前的状态并返回false给调用合约。但是取决于合约调用方式的不同,被调用合约的异常可能无法立即被调用者获知。这种不一致的异常传播策略导致多种异常处理不当的情况发生。
1.4 可重入攻击
在以太坊中,当一个合约调用另一个合约的时候,当前的操作就要等到调用结束之后才会继续。这时,如果被调用者需要使用调用者当前所处的状态,不考虑被调用方可能的恶意行为就可能产生了问题,而且该问题可能再合约编写时不能立即被发现。著名的DAO攻击事件就是因为这个漏洞而发生的,导致了3,600,000个以太币被盗取,总价值达60,000,000美元。
1.5 智能合约检测
智能合约本质是一段运行在区块链网络中的代码,它完成用户所赋予的业务逻辑。通俗的来说,相当于是一个“不可改变”且“公正”的“中间人”。但是由于代码是程序员编写的,不免会产生各种各样的bug,但是由于智能合约一旦部署就不能修改的特点,一旦智能合约存在安全性隐患就会造成不可挽回的恶劣后果。因此,在智能合约部署之前对其进行安全性检测尤为重要。目前,智能合约的检测的发展方向有以下三个方向:
· 交由专业的检测机构进行检测
· 智能合约检测工具进行检测
· 形式化证明的检测方式进行检测
2、数字钱包的安全性
数字钱包保存着用户的密码货币,主要存在的安全风险有以下三点。第一,设计缺陷。2014 年底,某签报因一个严重的随机数问题(R 值重复)造成用户丢失数百枚数字资产。第二,数字钱包中包含恶意代码。第三,电脑、手机丢失或损坏导致的丢失资产。
应对措施主要有四个方面:
· 确保私钥的随机性;
· 在软件安装前进行散列值校验,确保数字钱包软件没有被篡改过;
· 使用冷钱包;
· 对私钥进行备份。
3、隐私保护
在公有链中, 需要对交易数据、地址、身份等敏感信息进行保护, 同时又能让记账节点验证交易的合法性;对于联盟链, 在构建隐私保护方案的同时, 需考虑可监管性/授权追踪。可以通过采用高效的零知识证明、承诺、证据不可区分等密码学原语与方案来实现交易身份及内容隐私保护;基于环签名、群签名等密码学方案的隐私保护机制、基于分级证书机制的隐私保护机制也是可选方案;也可通过采用高效的同态加密方案或安全多方计算方案来实现交易内容的隐私保护;还可采用混币机制实现简单的隐私保护。
区块链主要的隐私保护技术主要包括混币技术、环签名技术及零知识证明技术,后两种技术在(上)篇中已经详细的介绍过,这里不再赘述。
3.1 混币技术
对于单个用户的交易图进行大数据分析[37]可以进行交易追踪,有鉴于此研究人员提出了混币技术旨在将多笔不相关的输入进行混合后输出, 使得外界无法关联交易的输入与输出, 从而分辨不出数字货币的流向。Gregory Maxwell于2013年提出了CoinJoin匿名混币技术, CoinJoin的使用者需要委托可信的第三方, 来构造一笔混合多笔输入的交易,其提供服务的第三方可以知道混币交易的流向。Tumble Bit协议提出了不同于CoinJoin的混币协议方案, 虽然仍然需要第三方参与, 但第三方无法知道交易细节, 仅仅是提供服务,即第三方可以是任意第三方而不仅仅是可信的第三方。
总结
作为一个新兴的研究领域,区块链的研究大多仍处于起步阶段。区块链技术依旧存在一些比较严重的问题阻碍了区块链的发展与大规模应用,在今后的区块链技术安全研究中,可重点对共识机制的安全性、区块链应用漏洞以及隐私泄露几个方面进行深入的研究。在共识机制方面,可在目前已有的攻击方案的基础上,探索研究更加安全可靠的共识机制。随着区块链的发展,隐私泄露的问题则更加严峻,亟待后续研究。以比特币为例,攻击者可利用区块链数据和交易链数据对比特币地址进行聚类,以此来对应用户的真实身份,此外,如何应对密钥丢失,如何解决根据用户钱包地址即可暴露所有交易记录都是值得深思的问题。
针对区块链的攻击
一、针对区块数据的攻击
针对区块数据的安全风险,大致总结了以下攻击方式:
1. 恶意信息攻击
在区块链中写入恶意信息,例如病毒特征码、政治敏感话题等。借助区块链数据不可删除的特性,信息被写入区块链后很难删除。若区块链中出现恶意信息,将会遭到杀毒软件、政治敏感等多方面的问题。
2. 资源滥用攻击
随着时间的推移,区块数据可能会爆炸式增长(节点之间恶意频繁交互),也可能会呈线性增长,这主要取决于此区块链应用的设计,依赖现有的计算机存储技术,区块数据若发生爆炸式增长,可能导致节点无法容纳又或者使区块链运转缓慢,从而使稳定运行的节点越来越少,节点越少,则越趋于中心化,引发区块链危机。
3. 攻击场景距离
若链中没有设计相应的操作限制,攻击者可以通过发送大量的垃圾信息来堵塞整个区块链,使区块链中真正的信息迟迟得不到处理,又或者使区块链中的存储节点超负荷运行。
二、针对加密签名机制的攻击
加密技术作为一个区块链整体的支柱,其安全性显得尤为重要,例如前些年所流行的MD5和SHA1哈希算法,目前已经证明安全性不足,现在已经不能被商用。目前大量使用的是SHA256算法,到目前为止,此算法还是安全的,虽然有人依然持有质疑,但是并没有任何直接的公开证据表明此算法存在漏洞。但是还是建议后期的区块链建设使用更新的SHA3算法。
针对加密签名机制大致有如下攻击方式:
1. 穷举攻击
此类攻击方式主要作用于散列函数中,且几乎所有散列函数或多或少都受此攻击方式影响,而且其影响程度与函数本身无关,而是与生成的HASH长度有关,主要是一个概率论的问题,其中最典型的的方式是基于生日悖论的“生日攻击”。
生日悖论:如果一个房间里有23个或23个以上的人,那么至少有两个人的生日相同的概率要大于50%。这就意味着在一个典型的标准小学班级(30人)中,存在两人生日相同的可能性更高。对于60或者更多的人,这种概率要大于99%。
2. 碰撞攻击
此种攻击方式主要作用于散列函数中,比较典型的案例是“MD5摘要算法”和“SHA1摘要算法”。它的攻击原理是通过寻找算法的弱点,瓦解它的强抗碰撞性这一特性,使得散列函数原本要在相当长一段时间才能寻找到两个值不同HASH相同的值的特性被弱化,攻击者能在较短的时间能寻找到值不同但HASH相同的两个值。
3. 长度扩展攻击
此种攻击方式主要作用于散列函数中,准确的说是基于Merkle-Damgard构造的摘要算法。其原理是通过算法弱点,在已知密文HASH和密文长度的情况下,推导出密文与另一消息拼接后计算出来的HASH。
4. 后门攻击
此种攻击方式作用于所有开源加密算法库中,ECC算法是区块链中身份验证的基石,ECC算法本身是没问题的,但是在实际情况中,人们可能更多的是选择别人已经写好的“轮子”直接拿来用,而不是自己再去实现一套加密函数。这就带来了一个问题,在别人已经写好的“轮子”中,可能被安插后门。
5. 量子攻击
此种攻击方式作用于大部分密码学算法。目前所有的加密算法以及摘要算法,其安全强度取决于它被穷举的时间复杂度,这使得依赖现有的计算机的计算能力,针对比较强的加密算法要对它进行暴力破解是非常难的,但是量子计算机拥有传统计算机无可比拟的算力,使得时间复杂度大大降低,于是,其安全强度便可能被瓦解。
三、针对分布式网络的攻击
去中心化的公链网络节点可能是普通家庭PC,可能是云服务器等等,其安全性必然是参差不齐的,其中必有安全性较差的节点,对其进行攻击将直接威胁节点的安全。针对分布式网络的安全风险,大致总结了以下攻击方式:
1. 日食攻击
是其他节点实施的网络层面攻击,其攻击手段是囤积和霸占受害者的点对点连接间隙,将该节点保留在一个隔离的网络中。这种类型的攻击旨在阻止最新的区块链信息进入到日食节点,从而隔离节点。
2. 窃听攻击
攻击者可以使用这种攻击来让区块链中的用户标识与IP关联起来,在某些情况下甚至可以追溯到用户的家庭地址。以比特币为例,当你在比特币网络上执行交易时,你的比特币客户端通常通过连接到一组八台服务器来加入网络,这个初始连接集合就是你的入口节点,每个用户都会获得一组唯一的入口节点。当你的钱包发送比特币完成购买时,入口节点将交易转交给比特币网络的其余部分,研究人员发现,识别一组一口节点意味着识别一个特定的比特币客户端,以此来推导出某个用户。那么,攻击者要做的是与比特币服务器建立多个连接,连接后,攻击者必须听取客户端与服务端的初始连接,这会泄露客户端的IP地址。随着交易流经网络,它们将会与客户端的入口节点相关联,如果匹配,那么攻击者就知道这是来自一个特定客户端的交易。
3. BGP劫持攻击
边界网关协议(BGP)是因特网的关键组成部分,用于确定路由路径。BGP劫持,即利用BGP操纵因特网路由路径,最近几年中已经变得越来越频繁。 无论是网络犯罪分子还是政府,都可以利用这种技术来达到自己的目的,如误导和拦截流量等,目前在区块链网络中节点的流量一但被接管又能对整个网络造成巨大的影响,如破坏共识机制,交易等各种信息。
4. 分割攻击
攻击者可以利用BGP劫持来讲区块链网络划分成两个或多个不相交的网络,此时的区块链会分叉为两条或多条并行链。攻击停止后,区块链会重新统一为一条链,以最长的链为主链,其他的链将被废弃,其上的交易、奖励等全部无效。
5. 延迟攻击
攻击者可以利用BGP劫持来延迟目标的区块更新,而且不被发现。因为它是基于中间人修改目标请求区块的数据来做到的:在目标请求获取最新区块的时候,将它的这一请求修改为获取旧区块的请求,使得目标获得较旧的块。
6. 节点客户端漏洞
攻击者在内网或者外网利用各种手段譬如漏洞扫描,0DAY漏洞利用等技术,对节点客户端进行攻击,此类攻击主要针对客户端自身软件可能存在安全漏洞进行利用,获取节点的控制权限。
7. 拒绝服务攻击
通过大流量,或者漏洞的方式攻击P2P网络中的节点,使网络中部分节点网络瘫痪,节点瘫痪意味着链中总算力受损,使得其更容易遭受51%攻击,而目前进行拒绝服务攻击成本也较低,大量的攻击工具平台能轻易在黑市购买用于攻击。
8. 双重支出攻击
双重支出攻击又称双花问题,指的是一个代币花费在多笔交易中的攻击,它的实现方法主要有以下几种:
(1)种族攻击。在面对0确认的交易便立刻进行付款的商家可能会遭遇此攻击。欺诈者直接向商家发送支付给商家的交易,并发送冲突的交易,将代币投入自己到网络的其余部分。第二个冲突的交易很可能会被开采出来,并被区块链节点认为是真的,于是付款交易作废。
(2)芬尼攻击。当接受0确认的付款时可能会遭遇此攻击。假设攻击者偶尔产生数据块。在他生成的每个区块中,他包括从他控制的地址A到地址B的转移。为了欺骗你,当他生成一个块时,他不会广播它。相反,他打开您的商店网页,并使用地址A向您的地址C付款。您可能会花费几秒钟的时间寻找双重花费,然后转让商品。接着他广播他之前的区块,他的交易将优先于你的交易,于是付款交易作废。
(3)Vector76攻击。也被称为单一确认攻击,是种族攻击和芬尼攻击的组合,因此即使有一次确认的交易仍然可以逆转。对于种族攻击,相同的保护措施显然降低了发生这种情况的风险。 值得注意的是,成功的攻击会使攻击者花费一个块,他们需要通过不传播它来“牺牲”一个块,而是仅将其转让给被攻击的节点。
(4)替代历史攻击。即使商家等待一些确认,这种攻击也有机会成功,但风险较高。攻击者向商家提交支付的交易,同时私下挖掘其中包含欺诈性双重支出交易的分支。等待n次确认后,商家发送产品。如果攻击者此时碰巧找到n个以上的区块,他就会释放他的分支并重新获得他的硬币。
(5)51%攻击。(中)篇详细介绍过51%攻击问题,不再赘述。如果攻击者控制全网算力的一半以上,则前面提到的替代历史攻击有100%的概率成功。由于攻击者可以比网络的其他部分更快地生成块,所以他可以坚持自己的私有分支,直到它比诚实节点网络建立的分支更长,它将代替主链。
(6)交易延展性攻击。延展性攻击者侦听P2P网络中的交易,利用交易签名算法的特征修改原交易中的input 签名, 生成拥有一样input和output的新交易,然后广播到网络中形成双花,这样原来的交易就可能有一定的概率不能被确认,在虚拟货币交易的情况下,它可以被用来进行二次存款或双重提现。
(7)验证绕过。验证机制的代码是区块链应用的核心之一,一旦出现问题将直接导致区块链的数据混乱,而且核心代码的修改与升级都涉及到区块链分叉的问题,所以验证机制的严谨性就显得尤为重要。必须要结合验证机制代码的语言特性来进行大量的白盒审计或是模糊测试,来保证验证机制的不可绕过。例如2010年8月15日,有人在比特币区块链的第74638块上发现了一条让人惊愕的交易,这笔交易里竟然出现了184,467,440,737.09551616个比特币,其中各有922亿个比特币被发送到两个比特币地址。这次攻击的根本原因则是比特币的验证机制中存在大整数溢出漏洞,由于大整数溢出为负数,网络各个节点对黑客的交易均验证通过,导致了比特币区块链中凭空出现了大量比特币。
四、针对共识机制的攻击
1. 短距离攻击
此类攻击比较典型的是“贿赂攻击”,此攻击主要影响PoS共识机制,贿赂攻击流程如下:
1)攻击者购买某个商品或服务。
2)商户开始等待网络确认这笔交易。
3)此时,攻击者开始在网络中首次宣称,对目前相对最长的不包含这次交易的主链进行奖励。
4)当主链足够长时,攻击者开始放出更大的奖励,奖励那些在包含此次交易的链条中挖矿的矿工。
5)六次确认达成后,放弃奖励。
6)货物到手,同时放弃攻击者选中的链条。
因此,只要此次贿赂攻击的成本小于货物或者服务费用,此次攻击就是成功的。相比之下,PoW 机制中贿赂攻击就需要贿赂大多数矿工,因此成本极高,难以实现。
2. 长距离攻击
此类攻击比较典型的是“51%”攻击。虽然某一个节点控制了 51% 及以上算力,就有能力篡改账本,但达到 51% 算力是件极其困难的事情。而在 PoS 中缺乏对算力的约束,那么就存在潜在可能篡改账本。
3. 币龄累计攻击
在最早的 Peercoin 版本中,挖矿难度不仅与当前账户余额有关,也与每个币的持币时间挂钩。这就导致,部分节点在等待足够长时间后,就有能力利用 Age 的增加来控制整个网络,产生非常显著的影响。
4. 预计算攻击
当 PoS 中的某一节点占有了一定量的算力后,PoS 中占有特定算力的节点,就有能力通过控制 Hprev 来使自己所在算力范围有能力去计算 Hnext。
5. 女巫攻击
又称Sybil攻击,在Sybil攻击中,攻击者通过创建大量的假名标识来破坏对等网络的信誉系统,使用它们获得不成比例的大的影响。对等网络上的实体是能够访问本地资源的一块软件。实体通过呈现身份在网络上通告自身。多于一个标识可以对应于单个实体。换句话说,身份到实体的映射是多对一的。对等网络中的实体为了冗余,资源共享,可靠性和完整性而使用多个标识。在对等网络中,身份用作抽象,使得远程实体可以知道身份而不必知道身份与本地实体的对应关系。默认情况下,通常假定每个不同的标识对应于不同的本地实体。实际上,许多身份可以对应于相同的本地实体。对手可以向对等网络呈现多个身份,以便出现并充当多个不同的节点。因此,对手可能能够获得对网络的不成比例的控制水平,例如通过影响投票结果。
五、针对应用层的攻击
应用层安全主要囊括涉及数字货币交易,管理着大量资金的交易所等中心化节点的安全问题。这些节点处在整个区块链网络的单点失败处,攻击收益高而成本低,是攻击者们的首选目标。
1. 交易所服务器未授权访问
交易所往往存放着大量资金,极易成为被攻击目标。一旦获得交易所服务器权限或访问,修改关键信息,攻击者便可盗取资金密钥、篡改交易金额或者泄漏敏感信息等,给交易所造成经济和名誉上的毁灭性打击。
2. 交易所DDoS攻击
据Incapsula2017年Q3季度DDoS威胁报告分析称,尽管其行业规模依然相对较小,比特币已经成为十大最容易被DDoS攻击的行业之一 。这一定程度反映了整个区块链行业面临着严峻的DDoS攻击安全挑战。
六、针对合约层的攻击
在使用类似Ethereum,EOS,Zilliqa等DApp开发平台进行智能合约及DApp应用项目开发时,需要尤其注意合约的安全性。由于区块链不可篡改的特点,使得智能合约一旦发布极难修改,合约的安全与否往往决定了一个项目的生死。合约开发者应该充分重视并在部署合约前做好智能合约的安全审计工作。
针对合约层的攻击主要是重入攻击,即Reentrancy攻击,本质是劫持合约控制流,破坏事务原子性,可以理解为一种逻辑上的条件竞争问题。
The DAO是一个众筹合约,在2016年6月18日被攻击前募集了$150M。攻击者利用合约中的漏洞发动了Reentrancy攻击,获得了$60M。为了追回这部分资金,以太坊社区决定进行硬分叉,在新分支中回滚自攻击开始后的所有交易记录并修复合约漏洞, 但因为此举违背了‘Code is law’精神,部分成员拒绝新分支,导致最终形成了两个分支。旧分支称为以太坊经典(Ethereum Classic/ETC),新分支为现行以太坊。攻击者最终离开以太坊经典,带走了数千万美元。
总结与展望
总体而言,区块链的发展引起了产业界与学术界的广泛关注,尽管其不断得到研究与应用,但是目前区块链技术在系统安全何应用安全等方面都存在着很多亟待解决的问题。这些问题也是区块链技术应用于更多核心领域时需要重视且解决的关键问题,值得进一步探索与深入研究。