区块链安全基础四
八.区块链攻击与防御
安全威胁分析
- 自身结构的复杂性和应用场景的多样性
- 恶意攻击者可能针对区块链应用的底层技术缺陷、低耦合性等安全漏洞展开攻击,从而非法攫取利益。
分类:
分类
数据层威胁
数据层、网络层和共识层是区块链技术体系中最基础、最必要的3个层级,而数据层是其中最重要的一层,主要涉及区块链的数据结构、数字签名、哈希函数等密码学工具。这些密码学工具在保护区块链数据隐私的同时,其固有的碰撞攻击、后门攻击等安全问题也给区块链数据隐私带来了一定威胁。此外,攻击者也可能通过交易延展性攻击和恶意信息攻击破坏交易秩序和区块链网络环境。因此,区块链数据层面临的安全威胁主要包含数据隐私窃取和恶意数据攻击。
原因:区块链的数据层主要负责底层数据的存储,包括交易信息、区块头等关键数据。由于区块链的不可篡改性,一旦数据被写入,修改这些数据是极其困难的。然而,如果攻击者在数据层植入恶意信息或成功篡改已有数据,可能会对整个链的安全性造成威胁。
类型:常见的数据层攻击包括51%攻击,通过控制大多数计算力来重写区块链历史;以及时间戳攻击,即通过操纵时间戳来影响区块的产生。
密码算法的安全风险:如果使用的是低安全强度的密码算法,或者密码算法实现存在错误,那么区块链系统将容易受到攻击,导致数据被篡改或泄露。
数据结构逻辑错误:区块链的数据结构如果设计不合理,比如交易数据的树状组织不当,可能会导致解析错误,从而影响整个系统的稳定性和安全性。
数据隐私窃取:由于区块链的透明性特点,所有交易数据都是公开的,这可能导致用户隐私信息的泄露。因此,如何保护用户的隐私成为了一个重要的安全问题。
恶意数据攻击:区块链数据层可能会遭受恶意数据的注入,这些数据可能是为了破坏区块链的正常运行或者是企图篡改历史记录。
硬件安全:区块链系统通常依赖于特定的硬件环境,如果硬件存在安全漏洞,比如固件中的后门或硬件设备的物理损坏,也会影响到数据层的安全。
采取有效的防御措施至关重要。例如,采用高强度的密码算法、确保数据结构的合理性和加强数据隐私保护措施
网络层威胁
网络层是区块链技术体系中最基础的层级,主要包含P2P网络组网方式、消息传播协议等模块,赋予了区块链去中心化、不可删除、不可篡改的技术特性。区块链网络层面临的安全威胁主要是针对P2P网络的恶意攻击,攻击者可能通过漏洞植入、路由劫持、资源占用等方式扰乱区块链网络的正常运行,也有可能利用交易延迟攻击来破坏区块链网络交易环境。
原因:网络层负责节点间的通信和数据传输。如果攻击者能够控制或干扰节点之间的通信,那么他们可以发起拒绝服务攻击(DoS),或者更隐蔽地修改传输中的数据,从而污染整个网络的信息。
类型:网络层的攻击包括日蚀攻击,即隔离某些节点使其只与攻击者控制的节点通信;以及路由攻击,攻击者破坏或操纵网络的路由表来干扰数据传输。
共识层威胁
共识层是区块链技术体系的核心架构。
其中的共识算法可以保证全网节点在去信任化的场景中对分布式账本数据达成共识,为区块链的去中心化、信任化提供了保障。
在授权共识机制中,各节点对共识过程的影响相同,所以易遭受女巫攻击;而在非授权共识机制中,各对等节点利用自身所持资源(如算力、权益)竞争记账权,进而达成共识。
投入的资源越多,则成功率越高,因此易遭受51%攻击。攻击者可能出于利益目的,通过贿赂攻击、币龄累计攻击等方式非法获取大量资源,从而发起51%攻击,以实现代币双花、历史修复、期货卖空、自私挖矿等目的。此外,攻击者还可以通过无利害关系攻击、预计算攻击等方式影响全网共识进程,进而获利。
共识层面临的安全威胁主要是,攻击者可以通过各种手段阻止全网节点达成正确的共识。
原因:共识层是区块链设计中的核心部分,它确保所有节点同意一份相同的数据记录。这一层的安全问题通常涉及操纵共识机制以达到非法获利或破坏系统的目的。
类型:自私挖矿是一种共识层的攻击方式,攻击者私下挖掘区块并隐瞒,直到能够获得比诚实节点更长的链时再公布,从而实现双花攻击。
关于女巫攻击
Sybil攻击,又称为女巫攻击,指一个恶意节点非法的对外呈现多个身份,通常把该结点的这些身份称为Sybil结点。Sybil攻击方式有以下几种类型:直接通信、间接通信、伪造身份、盗用身份、同时攻击、非同时攻击。
在区块链网络中,用户创建新身份或新节点是不需要代价的,攻击者利用这一漏洞发动Sybil攻击,伪造自己的身份加入网络,在掌握了若干节点或节点身份之后,随意做出一些恶意的行为。例如降低区块链网络节点的查找效率;或者网络中传输非授权文件、破坏文件共享安全、消耗节点间的连接资源等。
关于Eclipse攻击
Eclipse攻击是指攻击者通过侵占节点的路由表,将足够多的虚假节点添加到某些节点的邻居节点集合中,从而将这些节点“隔离”于正常区块链网络之外。
当节点受到Eclipse攻击时,节点的大部分对外联系都会被恶意节点所控制,由此恶意节点得以进一步实施路由欺骗、存储污染、拒绝服务以及ID劫持等攻击行为。Eclipse攻击原理如图所示:
Eclipse攻击者不断的向区块链节点发送路由表更新信息来影响区块链节点的路由表,使普通节点的路由表充满虚假节点。当区块链节点的路由表虚假节点占较高比例时,它对区块链网络的正常行为(如路由查找、资源搜索)都会被恶意节点所隔绝。
Eclipse攻击和Sybil攻击密切相关,它需要较多的Sybil攻击节点相配合。为了实现对特定区块链节点群的Eclipse攻击,攻击者需要先设置足够多的Sybil攻击节点,并向区块链网络宣称他们是“正常节点”,然后利用这些Sybil节点和正常的节点通信,入侵其路由表,最终把他们从区块链网络中隔离出去。
Eclipse攻击破坏了区块链网络的拓扑结构,减少了节点数目,使区块链网络资源共享的效率大大降低,极端情况下,它可以控制整个网络,将其分割成若干个区块链网络区域。对受害节点来说,它在未知情况下脱离区块链网络,所有区块链网络请求消息都会被攻击者劫持。
合约层攻击
合约层是区块链实现点对点可信交互的重要保障,主要包括智能合约的各类脚本代码、算法机制等,是区块链2.0的重要标志。合约层面临的安全威胁可以分为智能合约漏洞和合约虚拟机(EVM)漏洞:智能合约漏洞通常是由开发者的不规范编程或攻击者恶意漏洞植入导致的,而合约虚拟机漏洞则是由不合理的代码应用和设计导致的。
首先是智能合约编程导致的漏洞,这类漏洞通常是由于开发者在编写智能合约时的不规范编程或者疏忽导致的;其次是合约虚拟机漏洞,合约虚拟机(Ethereum Virtual Machine,EVM)是以太坊上智能合约运行的环境,如果EVM存在漏洞,那么所有运行在该环境上的智能合约都可能受到影响。
类型:重入攻击(reentrancy attack)或者前置运行攻击(front-running attack)用于破坏合约的正常执行或者盗取资产;DAO攻击就是利用当时以太坊智能合约和EVM中的递归调用漏洞来实现的。
应用层威胁
应用层是区块链技术的应用载体,为各种业务场景提供解决方案,可分为记账和区块链交易两类场景。(应用层是用户与区块链系统交互的层面,包括智能合约和去中心化应用(Decentralized Applications,DApps)。智能合约的代码如果有漏洞,就可能成为攻击的目标)
在记账场景中,攻击者可能通过漏洞植入、网络渗透、地址篡改等方式攻击记账系统,从而非法获利;“聪明”的记账系统也可能利用记账机制的漏洞,通过算力伪造攻击、扣块攻击、丢弃攻击等方式谋求最大化的收益。
在区块链交易场景中,攻击者可能利用撞库攻击、0day漏洞、API接口攻击等方式非法获取交易平台中用户的隐私信息,也可能通过钓鱼攻击、木马劫持攻击等方式获取用户账户的隐私和资产。
类型:智能合约漏洞利用是一种常见的应用层攻击,攻击者通过调用存在缺陷的智能合约来盗取资产或破坏应用逻辑。
小结
在实际的区块链攻击场景中,攻击者发起攻击旨在非法获取最大化的利益,但并不是所有的区块链攻击方式都可以使攻击者直接获利。此外,部分区块链攻击对实施场景和条件要求过高,使得其可行性受到了严重的制约。因此,攻击者通常采用一系列跨层级的区块链攻击方式来实现最大化的获利目的,这种攻击序列为攻击簇。
例如:现实场景中,攻击者利用自身资源发起51%攻击是不现实的,所以他们可能通过傀儡记账、贿赂攻击、币龄累计攻击等方式非法获取记账权竞争资源,然后发起51%攻击,进而实现双花攻击、历史修复攻击、卖空攻击等。显然,研究区块链安全态势,不仅要从层级分类的横向维度对单个攻击展开分析,还要从攻击关联分析的纵向维度对跨层级的攻击簇进行研究,才有可能构建出全面有效的区块链安全防御体系。
攻击类型分析
网络层攻击类型分析
网络层是区块链技术体系中最基础的技术架构,封装了区块链系统的组网方式、消息传播协议和数据验证机制等要素,使区块链具备了去中心化、不可篡改的技术特性。
区块链网络是由P2P网络构建,P2P网络主要涉及用户客户端和对等网络结构,P2P网络的攻击可能针对这两个方面展开如下攻击:
(1)客户端漏洞(client vulnerability): 尽管现有全节点客户端的底层协议互相兼容,增强了比特币网络的健壮性,但客户端代码中可能存在诸多安全漏洞,并且这些漏洞会随着客户端类型的增加而增加 。攻击者可以利用0day漏洞扫描等技术扫描客户端中存在的漏洞,然后利用这些漏洞发起各种攻击。2018年,区块链安全公司Peck Shield披露了一个安全漏洞,攻击者可以向以太坊客户端发送特定恶意报文,导致2/3的以太坊节点下线。
(2)窃听攻击(eavesdropping attack):攻击者可以通过网络窃听,获取区块链用户节点的网络标识,并将其与IP地址关联起来,进而获取用户节点的隐私信息,甚至可以追溯到用户的实际家庭地址。以比特币为例,用户通过连接一组服务器来加入比特币网络,这个初始连接集合就是该用户的唯一入口节点。攻击者可以通过与比特币服务器建立多个连接,以窃听客户端与服务器端的初始连接,获得客户端的IP地址。随着交易流经网络,攻击者将窃听得到的IP地址与已有的客户端入口节点进行匹配,若成功,则攻击者便可获知交易的来源。
(3)日蚀攻击(eclipse attack):攻击者通过特定手段使得目标节点只能获得被操纵的、伪造的网络视图,将其从实际的网络视图中隔离出来,从而妨碍目标节点正常运转,以达成特定的攻击目的。攻击者操纵多个对等节点与目标节点保持长时间的传输连接,使其在线链接数达到目标节点的入站连接上限,从而阻止其他合法节点的连接请求。此时,目标节点被攻击者从P2P网络中“隔离”出来,导致目标节点无法正常维护区块链账本。
日蚀攻击的实施方法如下:
攻击者可以通过某种方法把正常的比特币节点的输出连接都连接到攻击者控制的恶意节点,同时比特币节点的输入连接都被恶意节点连满。那如何做到让正常的比特币节点都连接到恶意的节点呢?在比特币节点中有两张表,一张叫作NewTable,用来保持当前节点所感知到的网络中其他节点的地址;另一张叫作TriedTable,用于保存曾经连接过的节点。 比特币节点每次建立输出连接的,都是在这两张表中选择一个时间戳较新的节点连接。通过控制僵尸网络不断地去连接这个比特币节点,即可达到刷新这两张表的目的,使得这两张表保存了大量的恶意节点的地址信息。
攻击者再通过DDoS攻击等方法,让这个比特币节点重启。这样这个比特币节点连到的就都是攻击者控制的恶意节点了。
边界网关协议(border gateway protocol,简称BGP)劫持攻击:BGP是因特网的关键组成部分,攻击者可以通过劫持BGP来实现操纵互联网路由路径的目的。由于区块链是基于互联网来传递信息的,劫持BGP可以实现对区块链节点流量的误导和拦截。攻击者一旦接管了节点的流量,就可以通过影响区块链网络的正常运行来破坏共识和交易进程。例如,比特币系统的大部分节点都被托管至几个特定的互联网服务提供商,大约60%的比特币连接都会通过这些特定服务商,所以攻击者一旦接管了这部分流量,将可以通过BGP路由劫持破坏区块链网络的完整性,甚至导致区块链网络瘫痪。
分割攻击(segmentation attack):攻击者通过BGP劫持攻击将区块链网络划分成两个或多个不相交的网络,此时的区块链会分叉为两条或多条并行支链。攻击者可以在多个支链网络中将同一笔电子货币兑换成现实商品或法币。BGP劫持攻击停止后,区块链重新统一,以最长的链为主链,其他的链上的交易、奖励等全部失效,攻击者由此获利。
DoS攻击(denial-of-service attack):即拒绝服务攻击,攻击者利用大量网络资源攻击计算机系统或网络,使其停止响应甚至崩溃,从而拒绝服务。实际中,用户节点资源通常受限,攻击者只能通过分布式DoS攻击(distributed denial-of-service,简称DDoS)整合零散网络带宽来实施DoS攻击。2017年5月,Poloniex交易平台遭受了严重的DDoS攻击,导致比特币价格被锁定在1761美元,用户无法正常执行交易。此外,当区块链网络中的大部分矿工无法盈利时,可能通过拒绝为区块链网络服务而发起BDoS攻击(blockchain denial of service,简称BDoS),导致区块链网络瘫痪。
交易延迟攻击(transaction delay attack):比特币闪电网络(lightning network)通常使用哈希时间锁定技术来实现安全的资产原子交换,其安全性主要依赖于时间锁定和资金锁定。由于每一笔资金交换都需要通过时间锁定来规定该交易必须在某个时间段内完成。一些恶意节点短时间内建立大量交易,然后故意超时发送,致使网络发生阻塞,影响正常运作。
网络层攻击的主要攻击目标是区块链底层的P2P网络,其共性在于攻击者都是通过扰乱用户的之间的通信,从而达到不同的攻击目的。根据攻击方式的特性,区块链网络层攻击大致可以分为信息窃取类攻击、网络路由劫持类攻击和恶意资源占用类攻击。
(1)信息窃取类攻击:主要包括客户端代码漏洞和窃听攻击。在针对客户端代码漏洞的攻击场景中,攻击者利用的漏洞可能是预先恶意植入的后门,也可能是开发人员编写错误导致的。理论上,无法完全杜绝类似的漏洞,所以开发商应在软件安全开发生命周期内,通过Fuzzing、代码审计、逆向漏洞分析、反逆向工程等技术对客户端的安全性进行评估,以缓解类似漏洞带给用户的安全威胁。
在窃听攻击场景中,攻击者可以通过网络监听等手段获取用户身份、地址等隐私信息,其关键在于用户的区块链网络标识唯一,攻击者可以将窃听得到的IP地址与已有的客户端入口节点进行匹配,从而获得交易数据来源和用户隐私。为了预防窃听攻击,用户应采用混淆的交易方法来打破交易过程中用户唯一标识与IP地址之间的一一对应关系。具体地,多个用户可以通过共享唯一网络标识,实现“一对多”或“多对一”的交易,以此混淆用户唯一标识与IP地址之间的一一对应关系,使得攻击者无法通过匹配用户标识和IP地址来获取用户隐私。此外,在交易数据的传输过程中,应使用可靠的加密算法实现数据的加密传输,防止恶意攻击者对网络节点的信息进行窃取。
(2)网络路由劫持类攻击:主要包括日蚀攻击、BGP劫持攻击和分割攻击,它们的攻击原理相似,攻击目标分别为单个节点、节点集合和P2P网络。攻击者通过改变节点的网络视图,将目标节点集合从区块链网络中隔离出来,从而达成控制区块链网络的目的。以比特币系统为例,攻击者可以通过这3种攻击迫使部分矿工节点“离线”,导致区块链全网实际算力的流失,从而使攻击者的算力在全网总算力中的占比不断上升。当算力超过全网算力的一半时,攻击者可以以远低于原全网51%的算力发动51%攻击。与通过提升自身算力来实施51%攻击的方式相比,通过日蚀攻击和BGP劫持攻击来提升自身攻击优势的方式更加经济。攻击者之所以可以发起日蚀攻击,其关键在于目标节点无法判断已连接节点的身份。为了预防日蚀攻击,Letz等人提出了共识信誉机制BlockQuick。BlockQuick中的网络节点在接受新产生的区块时,会对矿工的加密签名进行验证,并将该矿工的身份与共识信誉表中已知矿工的身份进行比对。最终,当共识得分大于50%时,网络节点才会接受该区块;否则,节点察觉出攻击者的日蚀攻击行为并拒绝该区块。而在BGP劫持攻击和分割攻击场景中,攻击者主要通过BGP路由劫持实现网络视图分割。针对这个问题,研究人员提出了自动实时检测与缓解系统(ARTEMIS),可以在几分钟内帮助服务提供商解决BGP劫持问题,使得实时流的公共BGP监控服务成为可能。
(3)恶意资源占用类攻击:DoS,DDoS攻击属于通过恶意资源占用实现的拒绝服务攻击,目前已经存在很多有效的防御工具,如DoS防火墙等。而BDoS和交易延迟攻击则属于社会工程学类攻击,解决此类攻击只能通过不断完善激励制度和奖惩制度、优化网络环境等社会工程学手段。
共识层攻击类型分析与防御
针对非授权共识机制的攻击。 非授权共识机制是指在非授权网络(公有链)中,节点无需身份认证,即可加入网络与其他节点为达成某种共识而共同运行的特定共识算法。经典非授权共识算法包括工作量证明机制(proof of work,简称PoW)、权益证明机制(proof of stake,简称PoS)、信誉证明机制(proof of reputation,简称PoR)及其衍生算法。委托权益证明机制(delegated proof of stake,简称DPoS)、评价证明机制(proof of review,简称PoR)、PoR/PoS混合共识机制(PoR/PoS-hybrid)等。授权共识算法中,各节点达成共识消耗的是等价的参与权,即节点共识权重相等。而在非授权共识机制中,各节点通过消耗自身持有的“筹码”(PoW中代表算力Work,PoS中代表权益Stake)竞争记账权,进而达成共识,即节点共识权重不相等。 非授权共识机制可以在本轮竞争“总筹码”为N=2n+1、恶意节点持有“筹码”不超过n的情况下,确保全网节点达成正确共识(容错率为1/2)。
恶意筹码获取。在非授权的共识机制中,节点持有的“筹码”越多,则其获得记账权的可能性越大。所以节点可能通过傀儡挖矿、贿赂攻击、币龄累计攻击等方式获取“筹码”,以提高自己获得记账权的成功率。
(1)傀儡挖矿攻击(puppet attack):攻击者通过植入木马入侵大量网络节点,部署挖矿程序,盗用被入侵主机的电力、算力等资源挖矿获利。2018年初,上百款《荒野行动》游戏辅助被植入挖矿木马,利用游戏主机显卡的高性能来挖矿获利。同年,攻击者在大量网站的首页植入Coinhive平台的门罗币(Monero)的挖矿代码,通过网页端盗用网络节点资源挖矿获利,导致该网站用户的系统运行变慢。
(2)币龄累计攻击(coin age accumulation attack):在基于“POW+POS”混合共识机制的区块链中,节点持有的“筹码”不仅与其算力有关,还与其持有的币龄有关。持币量越多、持币时间越长,则节点持有的币龄越多。因此,节点可以通过币龄累计攻击来获取更多的“筹码”。买入一定数量代币后,持有足够长时间后,就可以获得足够多的币龄用于竞争记账权。
(3)贿赂攻击(the bribing attack):攻击者通过“恶意悬赏”,鼓励矿工在攻击者指定的支链上进行挖矿,当支链挖矿投入的“筹码”超过全网总筹码的一半时,攻击者便通过51%攻击实现双花攻击、历史修复攻击、卖空攻击等。在PoW中,贿赂攻击可以看作是一种算力租借方式,被贿赂矿工需要消耗大量算力来挖矿,因此攻击者的攻击成本较高;而在PoS共识机制中,被贿赂节点不需要消耗大量算力,以较低成本便可赚取攻击者的悬赏,因此贿赂攻击所需的成本较低,常见于PoS系统。
除了通过增加“筹码”提高筹码占比的方法以外,攻击者还可能通过网络层日蚀攻击、BGP路由劫持、分割攻击等手段迫使大量节点离线,使区块链网络的总算力流失,从而提高自己的记账权竞争筹码占比和记账权竞争的成功率。
51%攻击。一旦存在恶意节点持有的“筹码”超过本轮记账权竞争总“筹码”的一半,则其可以以较大的优势获得记账权,并主导区块链达成特定共识,该攻击被称为短程51%攻击 ;也可以利用资源优势计算并生成一条区块链支链,使其长度超过当前主链,并代替成为新的主链,这种攻击被称为长程51%攻击。
在实际的区块链网络中,攻击者可能将51%攻击作为一种子攻击,进而实现以下几类攻击。
(1)双花攻击(double spending attack):以比特币系统为例,攻击者在完成交易A后,针对A花费的代币伪造交易B,并发动长程51%攻击,将一条包含交易B的支链变成新的主链。如此,攻击者对相同的一组代币实现了“双重花费” 。2016年8月,基于以太坊的数字货币Krypton遭受了名为“51%Crew”的51%攻击,攻击者通过租用Nicehash(算力买卖市场)的算力,导致该区块链损失约21465KR的代币。2018年,比特币黄金社区的一位成员发文称:有人在尝试进行针对交易所的双花攻击,这一攻击造成了千万美元的损失,同时引起了人们对于去中心化和PoW机制的质疑。
(2)历史修复攻击(history-revision attack):在区块链网络中,当攻击者无法持续拥有超过竞争本轮记账权总筹码的一半以上筹码时,攻击者和诚实节点的身份可能发生颠倒,并导致多轮51%攻击。 具体地,当攻击者A成功发起51%攻击将他的支链变为主链时,之前的主链变为支链,诚实节点B变为“恶意节点”,A成为“诚实节点”。一旦B获得超过新一轮记账权总筹码的一半时,便可作为“攻击者”发起51%攻击,将他们的“支链”恢复为主链,此时称B发起了历史修复攻击。
(3)卖空攻击(shot selling attack):51%攻击会破坏区块链系统,导致其对应的代币贬值。尤其是在PoS共识机制下,“聪明”的矿工一般不会对基于PoS的区块链系统发动51%攻击。因为攻击者成功发起51%攻击,意味着其持有大量代币,而代币贬值将会给攻击者带来巨大的经济损失。但在支持证券信用交易的PoS系统中,攻击者可能通过51%攻击发起卖空攻击来牟取暴利,具体步骤如下:
①攻击者持有数量为A的代币,这些代币的权益需超过本轮投票总权益的一半以上。
②攻击者通过证券信用交易或金融借贷等手段获得数量为B的代币,B的数量远大于A。这里的B是攻击者所借的证券,攻击结束后,需返还等额的代币给借贷方,如交易所。
③攻击者将所借的代币套现,兑换为具备实际价值的经济实体或货币。
④攻击者使用双花攻击、传统网络攻击等手段恶意影响区块链网络的正常运作,从而使得基于该区块链的数字货币贬值,此处将贬值率记为Δ。攻击者回购数量为B的代币偿还给借款方,最终获利Δ(B-A)。
(4)自私挖矿攻击(selfish mining attack):与双花攻击不同,自私挖矿攻击是一种利用短程51%攻击持续性获取记账权,进而赚取奖励的攻击方式,常见于PoW系统中。攻击者通过短程51%攻击,以较大优势比其他节点先挖到“矿”,暂扣区块并赶在其他节点之前公布出来,以获取记账权并赚取奖励。在延迟公布期间,攻击者沿着之前的区块继续挖矿,以积攒更多的优势,保证他可以连续获得奖励 。这种攻击不会破坏比特币的运行机制,但会使其他节点的工作量无效化,浪费了大量的算力。
其他攻击分析如下:
(1)无利害关系攻击(nothing at stake attack):这是一种针对PoS共识机制的攻击方式,攻击者可以在区块链产生分叉时,使用权益同时为多个分叉出块,以获取最大化的收益。由于攻击者无需像在PoW系统中消耗大量算力,只需进行权益投票便可实现利益最大化,因此也被称为“作恶无成本,好处无限多”的无利害关系问题,这变相地鼓励了区块链分叉的产生。“聪明”的矿工往往采取“在每条分叉上同时挖矿”的最佳策略以获取最大收益,这将导致区块链产生过多分叉,不再是唯一链。全网节点也因此无法达成共识,进而引起双花攻击、非法交易的泛滥。
(2)预计算攻击(pre-computation attack):在“PoW+PoS”混合共识机制中,当前区块难度取决于前一区块参数(如哈希值)。攻击者可以在生成区块时,通过随机试错法计算并选择一个对自己产生下一区块最有利的参数。通过这种方式,攻击者有更大的优势可以获得下一区块的奖励。
(3)长距离攻击(long range attack):PoS系统中,区块的生成速度比PoW快很多,所以攻击者可能尝试通过重写区块链账本,从而实现代币双花等目的。这种攻击和PoW中的长程51%攻击的原理相似 ,区别在于长距离攻击中,攻击者不用消耗大量算力,便可能伪造出一条新的区块链主链 ,攻击成本更低,所以带来的安全威胁更大。
共识层攻击的主要攻击目标是影响区块链的共识进程 ,其共性在于攻击者都是利用共识机制的特点或缺陷来提高自身竞争记账权的成功率,从而使区块链沿着对攻击者有利的方向发展 ,以实现妨碍网络正常运行、货币双花、最大获利等实际目的。其特性则在于各个攻击的场景、目的、方式的不同。授权共识机制中,攻击者持有的有效节点身份数量是影响共识进程的关键。而在非授权共识机制中,算力、权益等类型的资源才是影响共识进程的关键。 同时,攻击者为了获取更多资源,可能采用诸多恶意的筹码获取手段来提升自己竞争记账权的成功率。此外,在一些特殊的系统中,攻击者无需积累“资源”便可实现最大化收益。
在授权共识机制中,攻击者需持有超过全网1/3的节点才有可能主导区块链网络达成有利于自己的共识即攻击者操纵了多个节点身份,发起了女巫攻击。在女巫攻击的场景中,攻击者可能通过伪造等手段获取多个节点身份,也可能通过胁迫、腐化等手段控制多个节点,而其他节点无法检测、判断出攻击者持有节点身份的数量及其之间的内部关系。因此,阻止女巫攻击的关键在于阻止攻击者获取多重身份,可以考虑以下策略。
(1)采用节点身份验证机制,通过身份验证防止攻击者伪造节点身份。目前,部分私有链采用了PoA共识机制,如Aura、Clique等,该机制通过随机密钥分发与基于公钥体制的认证方式,使得攻击者无法在区块链网络中伪造多个身份,在一定程度上缓解了女巫攻击。
(2)采用高成本的多身份申请机制,通过提高身份伪造成本缓解女巫攻击。 尽管节点身份验证机制可以阻止攻击者伪造身份,但在实际中,这种方式无法满足诚实节点对多节点身份的正常需求。因此,可以考虑在区块链中引入首次申请身份免费、多次申请成本指数式升高的身份申请机制,在满足节点对多身份正常需求的同时,指数式增加攻击者的攻击成本,缓解女巫攻击带来的安全威胁。
理论上,女巫攻击也可以出现在非授权的共识场景中,但由于非授权共识算法中的节点是通过自身持有的“筹码”竞争记账权,多重身份伪造意味着攻击者“筹码”的分流,但“筹码”总量不会发生变化,而攻击者实施女巫攻击不但不能提高自己获得记账权的成功率,反而有可能导致其成功率降低,所以女巫攻击不会对非授权共识机制的共识过程产生实质性影响。
克隆攻击是一种专门针对PoA系统的攻击方式,攻击者成功实施克隆攻击的关键,一方面在于PoA系统中记账节点集合恒定不变的固有缺陷,另一方面在于攻击者是否能通过BGP劫持攻击、分割攻击成功实现网络分区。因此,解决克隆攻击的关键在于如何阻止攻击者成功实施BGP劫持攻击、分割攻击,所以可以考虑采用ARTEMIS系统预防攻击者进行网络分区,从源头阻止克隆攻击。然而,ARTEMIS系统只能在网络发生异常时发现区块链网络是否发生分区,如果攻击者仅对部分关键数据进行管控而不影响其他数据的正常传递,则ARTEMIS也无法阻止此类“无特征”的克隆攻击。此时,准备出块的区块链节点可以考虑引入基于权重的节点活性检测方法,主动检测区块链网络是否发生网络分区。具体地,区块链节点可以通过随机取样的方式选取区块链中已有的区块,根据其中包含的交易类型、金额、数量等特征计算出该区块生成者的权重。然后随机选择节点并请求包含其心跳信息和上一区块哈希值在内的活性证明,如果该节点成功证明自身活性,则验证者累计已验证节点的权重,并重复上述操作直至累计权重达到预先设置的阈值;若被选中节点未通过或未参与活性检测,则证明区块链网络发生分区,应立即停止出块。尽管该方法与ARTEMIS无法从根本上阻止攻击者在PoA系统中实施克隆攻击,但能够在一定程度上预防并缓解克隆攻击来的危害,避免损失。
在非授权共识机制中,攻击者在本轮“记账权”竞争中需持有超过全网1/2的“筹码”,才有可能通过51%攻击主导区块链网络达成有利于自己的共识,进而实现双花攻击、历史修复攻击、卖空攻击等目的。而实际中,攻击者通常很难自己拥有足够的“筹码”来实施51%攻击,所以可能会通过各种手段获取“筹码”。为了预防51%攻击区块链网络应该采取如下策略,阻止攻击者通过傀儡挖矿攻击、贿赂攻击等方法获取“筹码”。
(1)加强区块链客户端的入侵检测能力,添加防火墙,阻止攻击者通过木马病毒入侵网络节点,盗用受害节点的挖矿资源。
(2)采用针对“恶意悬赏”的惩罚机制,缓解贿赂攻击带来的危害。全网节点可以对抵制恶意悬赏、恶意攻击达成共识,缴纳保证金并签订智能合约。一旦出现恶意悬赏,则对举报者进行奖励,对恶意节点进行惩罚,没收悬赏金额和保证金,限制其网络交易权限。
(3)在PoS中采用新型的币龄计算方法,限制节点恶意累计币龄的行为。如:点点币通过在币龄计算方法中设置节点持币时间上限的方式,限制了用户所持币龄的上限,在一定程度上阻止了51%攻击。
(4)在PoS中采用币龄预警、清零机制,预防51%攻击。在记账权竞争过程中,对节点进行身份认证和权益关联。若发现单节点或关联节点所持权益超过全网一半,则启动预警机制,阻止共识进程,然后清空恶意节点持有的全部币龄,并处罚金。
尽管如此,攻击者还可能存在其他获取“筹码”的途径。为了进一步阻止51%攻击,以太坊提出了一种计划内置于PoS系统客户端的Casper机制。Casper机制要求以太坊的矿工锁定一些以太币作为押金,为刚产生的区块担保。如果投注者是诚实的,他们将获得相应的交易费用作为奖励;否则,Casper将没收大量已投注的以太币作为惩罚。显然,类似Casper机制的保证金奖惩机制可以很好地解决一些社会工程学问题,从而预防趋利节点发起的各种攻击。如:在无利害关系攻击场景中,Casper机制可以惩罚大部分恶意行为,提升了制造恶意分叉的代价使无利害关系攻击无法为攻击者带来收益。若矿工想参与挖矿,则他必须抵押一定数量的以太币作为押金,保证自己在最长链上挖矿。若该区块被确认上链,则矿工收回保证金并获得一定的奖励。如果其他矿工尝试在多条支链上挖矿来进行无利害关系攻击,则会被没收其在多条支链上的押金,这种概念叫做剑手(slasher)协议,即如果矿工在同一个层级的分叉上同时签署了两份承诺,该矿工就会失去区块奖励,甚至被没收押金。
在预计算攻击场景中,攻击者可以通过预计算确定下一区块计算难度的关键在于区块生成算法中,上一区块哈希值与下一区块计算难度的关联性 。所以为了预防PoS系统中的预计算攻击,应该重新制定区块生成算法首先,可以考虑打断当前区块链计算难度与前一区块哈希值之间的联系,使得攻击者无法通过预计算控制后续区块的计算难度;其次,也可以考虑增加新的计算元素,使得上一区块的哈希值不再是确定下一区块计算难度的唯一因素。在长距离攻击场景中,区块链网络无法阻止攻击者伪造一条新的区块链主链,但可以通过类似BlockQuick的方式,通过增加身份认证、信誉值对比的方式限制全网节点对该链的接受度来预防长距离攻击。
合约层攻击类型分析与防御
合约层是区块链2.0技术体系的重要标志,封装了区块链的各类脚本代码、算法机制和智能合约,使区块链技术具备了较高的可编程性和实用性。图灵完备的区块链网络允许用户在区块链网络上开发并部署特定的代码或应用,但智能合约在编写过程中存在的诸多不足,可能给区块链网络带来以下安全隐患。
(1)整数溢出漏洞(integer overflow and underflow vulnerability): 智能合约代码中,整数型变量都存在上限或下限,当变量存储的数值超过上限则称为整数上溢,超过下限则称为整数下溢。当一个整数变量发生溢出时,可能会从一个很大的数变成很小的数或者从一个很小的数变成很大的数。利用这个漏洞,攻击者通常通过输入异常参数致使整数溢出,从而达到修改地址指针,实现代码异常调用的目的。2010年8月,由于验证机制中存在大整数溢出漏洞,比特币的第74638块出现了一条包含超过1844亿个比特币的交易。2018年4月,BeautyChain(BEC)智能合约中出现了一个灾难性的整数溢出漏洞,导致约10亿美元的损失。
(2)时间戳依赖攻击(time-stamp dependency attack): 智能合约的执行大多依赖于当前区块的时间戳,不同的时间戳可能导致智能合约产生不同的执行结果。以抽奖合约为例:假设智能合约需要根据当前时间戳和其他可提前获知变量计算出一个“幸运数”,以确定获奖人员。攻击者则可以在挖矿过程中提前尝试使用不同的时间戳来计算“幸运数”,从而将奖品送给自己想给的获奖者。
(3)调用深度攻击(call deep attack): 合约虚拟机在运行过程中会为合约相互调用的深度设置一个阈值,即使合约调用不存在任何逻辑问题,但当调用深度超过该阈值后,合约将不再往下执行,即合约调用失败 。例如在以太坊虚拟机中,调用深度被限制为1024。如果攻击者发起一系列递归调用让栈的深度到达了1023,之后再调用目标智能合约的关键函数,就会自动导致这个函数所有的子调用失败。因此,攻击者可以通过控制调用深度,使得某些关键操作无法执行 。例如在区块链上实现一个拍卖的智能合约,由于拍卖过程中可能存在多次竞价,需要反复调用合约中的出价函数,攻击者可以恶意刷出价次数。当调用深度达到1023次临界值时竞拍结束,此时调用转账函数就会失败,导致拍卖失败。
(4)误操作异常攻击(misoperation attack): 攻击者通过智能合约A调用智能合约B时,B可能因为执行异常而返回合约未执行的状态,若A不检查B的结果而继续执行,则将导致A在B未执行的情况下完成调用。 以KoET智能合约为例:网络中各节点可以通过智能合约买卖“以太币国王”称号来获利,支付金额由现任国王来决定。当一个节点想购买“国王”称号时,智能合约A调用智能合约B支付赔偿金给现任国王,并指定该节点成为新的国王。如果B因为操作异常(如调用深度攻击)导致支付失败,而A在未检查B执行结果的情况下继续执行,将导致节点在未支付赔偿金的情况下成为新的“国王”,原“国王”同时失去国王称号和赔偿金。
(5)重入攻击(re-entrancy attacks): 攻击者针对智能合约代码的重入漏洞发起的攻击,可导致两个智能合约发生循环调用。其中最具代表性的是DAO攻击:攻击者通过智能合约A向智能合约B发起提现请求,B向A转账并调用A的回调函数。此时,若A的回调函数中被攻击者写入操作“合约A向合约B发起提现请求”。 如此,A再次向B发起提现请求并重复提现过程,直至提现失败(账户余额不足)。2016年6月发生了一起史上最严重的智能合约安全事件——“The DAO”,导致价值6000万美元的以太币被盗,迫使以太币硬分叉为以太坊ETH和以太经典ETC。
针对合约虚拟机的攻击。合约虚拟机是智能合约的调用、执行平台,是区块链技术支持多样化应用的载体,提高了区块链的可扩展性,但仍然可能存在一些安全隐患。
(1)逃逸漏洞(escape vulnerability): 攻击者在控制一个虚拟机的前提下,通过利用虚拟机和底层监控器(virtual machine monitor,简称VMM)的交互漏洞,实现对底层VMM或其他虚拟机的控制。虚拟机逃逸后可以在VMM层或者管理域中安装后门、执行拒绝服务攻击、窃取其他用户数据,甚至控制其他用户虚拟机等。在区块链系统中,虚拟机在运行代码时会提供一个沙盒环境,一般用户只能在沙盒的限制中执行相应的代码,此类型漏洞会使得攻击者编写的恶意代码在运行该沙盒环境的宿主机上执行,破坏宿主机与沙盒的隔离性。
(2)逻辑漏洞(logic vulnerability):逻辑漏洞是指由于程序逻辑不严谨,导致逻辑分支被非正常处理或错误处理的漏洞。虚拟机在发现代码不符合规范时,可能会做一些“容错处理”,并导致一些逻辑问题。最典型的是“以太坊短地址攻击”[97]:在ERC-20 TOKEN标准[98]下,攻击者可以输入一个短地址并调用Transfer方法提币。EVM虚拟机在解析合约代码时,会通过末尾填充0的方式将短地址补至预期长度。此时,参数编码可能出现逻辑漏洞,导致攻击者获取与交易金额不符的代币。
(3)资源滥用漏洞(resource-exhaustion vulnerability):攻击者在虚拟机上部署恶意代码,恶意消耗系统存储资源和计算资源。所以在虚拟机中必须要有相应的限制机制来防止系统的资源被滥用。在以太坊中,智能合约采用了gas机制,攻击者想在以太坊虚拟机上做更多操作,需要付出经济代价。
合约层攻击的共性在于,攻击者是尝试通过干扰合约的正常调用来实现不同的攻击目的。其特性在于不同攻击方式的攻击目标和原理不同,攻击者可以利用智能合约的代码漏洞或合约虚拟机的运行漏洞,尝试通过非正常的合约调用,以实现非法获利、破坏区块链网络的目的。
智能合约实质上是由开发者编写并部署在区块链上的一段代码,其中的漏洞可能是由于开发人员编写的代码不符合标准导致的,如整数溢出漏洞、时间戳依赖性、调用深度限制等;也可能是攻击者(开发者)恶意植入的,如重入攻击。所以在智能合约编写过程中,开发人员需考虑到以下几方面。
(1)养成良好的编程习惯,以严谨的编程逻辑避免智能合约开发过程中出现整数溢出等常见的漏洞。
(2)针对智能合约的时间戳依赖性,在合约开发过程中应采用多维参数输入、随机参数输入等,避免合约执行结果完全依赖于时间戳,降低合约执行结果的可预测性。
(3)针对智能合约的调用深度限制,应在智能合约中预先设置预警惩罚机制。当合约调用次数接近上限时,智能合约调用预警合约对用户发出提醒,若用户继续调用合约最终导致合约运行失败,则预警合约调用惩罚合约对最后调用合约的用户进行惩罚。
(4)针对重入漏洞,应在合约开发过程中设置参数检验机制。当智能合约A调用智能合约B时,应对B返回的参数进行确认,再继续执行。参数检验机制可以阻止攻击者通过在B植入漏洞发起重入攻击,也可以阻止攻击者实施误操作异常攻击。
尽管良好的编程习惯和编程策略可以在一定程度上避免智能合约中出现安全漏洞,但仍有一些安全漏洞是不可避免的。所以在部署智能合约时,用户可以采用以下方法避免代码漏洞带来的危害。
(1)安全评估:在正式部署智能合约前,应对其进行大量安全测试或白盒审计,以评估该合约的安全性。
(2)采用Sereum,ZEUS等重入攻击防护工具。其中,Sereum支持多种重入攻击的识别,不仅适用于待部署合约,还可以保护已部署智能合约在重入攻击下的安全性,误报率仅为0.06%。
此外,合约虚拟机中存在的逃逸漏洞、逻辑漏洞、资源滥用漏洞可能会导致智能合约的异常运行,攻击者可以在发现这些漏洞后,在与其他用户订立智能合约时,利用这些漏洞编写有利于自己的智能合约代码,使得智能合约失去公平性。所以,区块链网络在引入智能合约虚拟机时,应对虚拟机进行系统的代码审计,分析评估其安全性,并将其可能存在的安全漏洞披露出来。而用户在部署智能合约时,除了对合约代码进行常规审计外,也要根据目标合约虚拟机披露的漏洞对代码进行审计,做好双向的智能合约运行环境评估。
应用层攻击类型分析与防御
应用层是区块链技术的应用载体,为各种业务场景提供解决方案。应用层主要有挖矿机制和区块链交易中存在的安全漏洞和恶意攻击。
挖矿场景中的攻击 。 “挖矿”是维持PoW系统正常运转的动力,很多攻击者尝试利用挖矿过程中存在的漏洞获利,这会导致严重的资源浪费,进而降低区块链网络的吞吐量。其中,主要包括针对矿机系统和挖矿机制的恶意攻击。
针对矿机系统的攻击 。由于系统代码的闭源特性,用户无法检查矿机的安全性,所以存在诸多安全隐患。
(1) 0day漏洞攻击(zero-day (0day) vulnerability):目前,大多数矿机的系统都是通用的,一旦某个矿机系统被发现存在0day漏洞,攻击者可以利用该漏洞得到系统控制权限。
(2)网络渗透攻击(network penetration attack):攻击者通过利用多种安全漏洞对客户端系统(如钱包客户端、矿机系统、Web服务系统等)进行持续性渗透,最终获取系统的控制权限,威胁矿机的系统安全。该攻击方式不限制于某一特定漏洞,最终以获取系统权限为目的。
(3)地址篡改攻击(address tampering attack):攻击者在攻陷矿机系统之后,通过篡改挖矿奖励接收地址的方式,劫持并盗取原属于目标矿工的挖矿奖励。
资源浪费
在挖矿过程中,“聪明”的矿工可能利用挖矿机制的一些漏洞做出趋利行为,导致严重的资源浪费。主要包括:
(1)算力伪造攻击(computational forgery attack):在比特币系统中,矿池一般通过特定的工作量证明检验算法来检验当前矿工的实际算力。如果算法存在某些漏洞时,“聪明”的矿工可能通过虚报算力来获取更高的奖励,这将严重影响奖励分配的公平性,导致矿池的算力流失。
(2)扣块攻击(block withholding attack):也被称为藏块攻击。主要有3种形式:第1种是矿池下发计算任务后,恶意矿工直接返回一个错误的计算值,然后分得矿池根据算力分发的数字货币奖励;第2种是矿工挖出区块后,不向矿池返回,而是私自广播至整个网络,独自获得相应的区块奖励;第3种是恶意矿工不会发布自己挖到的区块,导致矿池收益降低。扣块攻击成本较高,恶意矿工获利较少,甚至不获利,所以该攻击常见于矿池恶意竞争的场景中:恶意矿工作为“间谍”加入敌方矿池,在领取敌方矿池奖励的同时,通过浪费敌方矿池的算力资源来获取己方矿池的报酬,实现两方获利。扣块攻击的出现,激化了矿池间的恶意竞争,严重扰乱了正常的挖矿秩序。
(3)丢弃攻击(drop attack): 攻击者将多个具有良好网络连接的节点置于网络中,这样不但可以方便地获知最新被广播出的区块,也可以比其他节点更加快速地传播目标区块。当攻击者挖出新区块后不会及时公布,直至得知有区块被公布时,攻击者会立即发布自己的区块,并且利用布置好的节点快速地广播到整个网络,使得该合法节点开采的区块被丢弃,从而获取奖励。
(4)空块攻击(empty block attack): 空块攻击是早期比特币网络中常见的攻击方式,攻击者通过生成空块获取比打包交易区块更快的出块速度, 从而以更大的可能性获取出块奖励。空块的产生,意味着比特币网络有10分钟处于拒绝服务的状态 。偶尔出现空块不会对网络产生太大影响,但短期内出现大量空块,会使交易池中的交易大量滞留,平均交易时间延长。
(5)通用挖矿攻击(general mining attack):通用挖矿攻击常见于区块链系统初始化建立的阶段,当该系统与某个已成熟区块链系统采用相同的架构和共识机制时,后者系统中具备大量算力的攻击者可能加入新区块链进行挖矿,以恶意竞争出块奖励。此时容易产生算力集中化问题,甚至当攻击者算力超过新系统全网一半时,可能发起51%攻击来实现代币双花、历史修复、卖空攻击等攻击目的。
(6)交易顺序依赖攻击(transaction-ordering dependence attack):区块链交易场景中,交易的处理顺序不同,则其产生的结果也不相同。例如:当攻击者发布一个奖励丰富的解题智能合约时,攻击者可以监听网络中与之相关的解题交易,并在目标解题交易被验证、打包上链前,发布一个具备高Gas值的交易,将解题合约的奖励降低为0。出于最大获利的目的,矿工会优先将高Gas值的交易打包上链,导致解题者无法获得智能合约中原先声明的奖励。
(7)芬尼攻击(Finney attack): 芬尼攻击是扣块攻击的一种衍生攻击,主要发生在支持零确认交易的服务场景中,可以作为实现双花攻击的跳板。以比特币系统为例,每笔交易被打包后需要经过6个区块的确认才能真正上链,这明显无法满足部分服务场景对即时性交易的需求,所以部分商家推出零确认交易服务,即用户在完成交易后无需等待确认便可获取服务,商家则需等待交易数据上链才可以获得相应的费用。攻击者可以利用零确认交易的缺点,实施芬尼攻击:当攻击者挖到包含自己交易A的区块时扣留该区块,然后就A对应的代币与商家完成零确认交易B,并在B被确认前将包含A的区块广播至全网。此时,交易B被验证为不合法,攻击者由此实现了双花攻击。 与通过51%攻击实现的双花攻击相比,芬尼攻击的攻击成本远低于基于51%攻击的双花攻击,因此相对常见。
(8)种族攻击(race attack): 种族攻击可以看作是一种进阶版的芬尼攻击,可以通过扰乱正常的交易顺序来实现双花攻击。与交易顺序依赖攻击不同的是:交易顺序依赖攻击针对的是智能合约,而种族攻击针对的是支持零确认交易的服务场景。如以太坊中,攻击者在与商家完成零确认交易A后,就A对应的代币生成一个高Gas值的交易B,“聪明”的矿工会优先将B打包进区块以获取最大化的利益,导致零确认交易A验证失败,而攻击者已经提前获取了相应服务,实现了代币双花。
针对交易平台的攻击
随着部分国家对比特币的认可,出现了很多区块链数字货币、交易平台,形成了一套相对完整的区块链电子货币金融体系。用户节点可以通过交易平台进行资产转换、投资等商业行为,也可以通过钱包账户进行点对点的可信交易。多样的交易平台和用户账户中存在的安全漏洞,严重威胁着区块链用户的资产安全。
交易平台是区块链电子货币金融体系中十分重要的一类实体,为区块链用户提供了进行各种商业行为的场所。但由于用户的安全意识不足、系统潜在的安全漏洞等原因,交易平台面临隐私泄露、资产流失的风险。
(1)弱口令攻击(weak password attack):实际中,用户可能出于方便记忆等原因,为自己的账户设置了安全级别较低的密码,攻击者通过简单的猜测、穷举等方式,即可获取用户的账户访问权限。
(2)撞库攻击(credential stuffing attack):用户由于安全意识不足,可能在不同的网站使用相同的账号和口令。攻击者可以通过钓鱼攻击等手段收集与区块链、金融等相关网站上的用户账号和口令,然后在目标交易平台上使用自动化程序逐个尝试,以获取该平台中用户的账户隐私信息。
(3)穷举攻击(brute-force attack):如果网站不对登陆接口做请求限制或者风险控制 ,攻击者可以针对目标值发送多次测试请求,尝试通过穷举攻击破解某些关键信息。如在短信验证中,若平台不对短信验证码的有效期或验证接口进行限制, 攻击者可以轻易对其完成破解。若平台对登陆接口未做请求限制 ,攻击者可以通过大量的密码字典来暴力破解某个账户的密码。
(4) API接口攻击(application programming interface,简称API attack):用户通常使用私钥key,通过交易平台中私有的API接口来执行一些敏感操作,如交易所新订单的确认、取消等。一旦API key泄露,很可能导致用户账户蒙受经济损失。2018年3月,币安网大量用户API key泄露,攻击者通过泄露的key直接操作用户交易,致一万余枚的比特币被用于购买其他币种,造成币市动荡。
(5)单点登陆漏洞(single sign-on vulnerability):攻击者可以通过跨站请求伪造、跨站脚本攻击等手段来窃取用户登陆的Ticket,从而盗取目标用户账户中的资金。2017年10月,OKCoin旗下交易所出现大量账户被盗情况,损失金额超过1千万人民币。
针对用户账户的攻击
区块链钱包、交易所账户是用户参与区块链交易的重要工具,保管着大量的用户隐私和资产,是攻击者的主要攻击目标。由于服务场景的多样性和复杂性,用户账户主要面临以下安全威胁。
(1)钓鱼攻击(phishing attack): 攻击者通过伪造网页、系统、邮件等形式,诱导用户进行一系列交易操作,获取用户的钱包、交易所账户口令,进而盗取用户资产。
(2)木马劫持攻击(Trojan horse attack) :攻击者可以向用户主机中植入木马病毒,通过按键记录、hook浏览器的方式来获取其账户和口令,从而盗取目标用户资产。2017年8月,攻击者利用木马病毒Trickbot对包括Coinbase在内的几家数字货币交易所进行了Web注入攻击[113],当受害者购买数字货币时,木马病毒会劫持交易所钱包,并将资金定向至攻击者钱包,最终造成用户损失。
(3)中间人劫持攻击(man-in-the-middle attack): 目前,多数交易所都采用HTTPS协议进行交互,在一定程度上保证了数据安全。但在某些API接口的子域名,却未使用HTTPS。攻击者可以通过在流量中转处劫持网络流量,如路由器、网关等流量出口,从而获取相关信息。
(4)私钥窃取攻击(private key stealing attack): 用户丢失私钥意味着用户的账户资产全部遗失,因此,用户通常会对钱包的私钥文件进行多次备份,而不安全的备份存放点存在私钥泄露的风险。目前,针对比特币的wallet.dat文件广泛出现在互联网中,例如GitHub、NAS服务器、Web服务等互联网可接入的位置。目前,已经有攻击者开始扫描密钥文件,甚至开发相关的木马病毒进行私钥窃取。
(5)钱包客户端漏洞(wallet client vulnerability): 攻击者可能利用钱包软件自身的漏洞实施攻击,进而获取用户隐私和资产。例如:在以太坊多重签名钱包Parity中,攻击者可以通过间接调用初始化钱包软件的库函数,将自己更换为受害者钱包的新主人。2017年11月,Parity钱包出现重大Bug,攻击者利用该Bug成为库的主人,然后调用自杀函数报废整个合约库,彻底冻结了150多个地址中总计超过50万个ETH,直接导致上亿美元资金被冻结。
(6)粉尘攻击(dusting attack): 比特币系统中,“聪”是最小的BTC单位,通常将100聪以内的BTC称为粉尘。而且比特币中没有余额的概念,所有合法的交易都可以追溯到前向一个或多个交易的输出,其源头都是挖矿奖励,末尾则是当前未花费的交易输出(unspent transaction output,简称UTXO)。攻击者可以通过向目标用户钱包地址发送“粉尘”来实施粉尘攻击,当用户使用这些“粉尘”交易时,会导致其与用户自有UTXO的交易输出发生混合,攻击者可以通过“粉尘”来追踪用户的钱包地址,获取用户的隐私信息,从而勒索、盗取目标用户的资产。
(7) SIM hack: 在一些去中心化钱包中,用户需要通过SIM(subscriber identity module)卡来验证身份的合法性。用户通常在丢失SIM卡后向运营商申请“移植”SIM卡,该服务允许客户将该电话号码转移到新的SIM设备中。攻击者可以利用这一漏洞,通过技术手段将受害者的SIM卡移植到他们控制的电话上,然后在其电子邮件帐户上启动密码重置流程,验证码会发送到电话号码中。 由于攻击者此时控制着SIM卡,可以轻易地对受害者账户信息进行篡改,盗取受害者账户中的财产。
(8)在线钱包窃取(online wallet theft):目前,很多用户会选择使用在线钱包,这使得个人的资产安全严重依赖于服务商的安全性。2013年11月,比特币在线钱包服务商Inputs.io遭受黑客攻击,黑客通过电子邮件账号进行入侵,进而劫持代管账号,从中盗取了4 100个比特币。
(9)重放攻击(replay attack):主要包含单链重放攻击和多链重放攻击。单链重放攻击中,攻击者通常在以太坊等账户余额模型的区块链系统中先发起一笔交易A(如交易所提现),然后对A的时间戳等数据进行修改,获得新的交易B并进行广播。因为B的私钥签名和公钥加密齐全,所以矿工会在付款方余额足够的情况下将交易B打包进新区块。攻击者不断重复便可获取大量资金,直至付款方账户余额不足为止。多链重放攻击通常出现在区块链硬分叉时,此时用户的地址和私钥生成算法相同,所有“一条链上的交易在另一条链上也往往是合法的”,所以攻击者在其中一条链上发起的交易后,可以重新将该交易广播到另一条链上,并得到整个系统的确认。
防御策略与方法
相比区块链其他层级,应用层攻击的场景更加具体、复杂,所以攻击者的手段也十分多样。因此,区块链应用层面临的安全问题应从实际的服务场景出发,设计合适的防御策略和相关技术。在挖矿场景中,攻击者采用的攻击方式大多具备社会工程学攻击特性,即攻击者会根据矿机漏洞、挖矿机制漏洞采取趋利的挖矿行为,通过损害矿池或其他矿工利益,实现自身利益的最大化。
针对矿机的系统漏洞 ,可以尝试以下防御策略。
(1)开发阶段:开发人员应在开发阶段设定软件安全开发生命周期,建立安全漏洞管理机制,在成品销售前对矿机系统进行代码审计、性能测试,以预防0day漏洞攻击。
(2)部署阶段:矿工应该在原有的软件防护基础上增加辅助的安全检测技术,如入侵检测、防火墙、蜜罐技术等,进一步预防网络渗透攻击和地址篡改攻击。
攻击者可以利用挖矿机制 中存在的漏洞恶意骗取、竞争出块奖励,也可以通过扰乱交易顺序实现双花攻击等。其中,算力伪造攻击和扣块攻击 属于恶意骗取矿池出块奖励的攻击行为,可以尝试以下防御策略。
(1)身份管理机制:矿池应结合保证金奖惩机制(如Casper机制)和身份认证机制,对新加入的矿工进行身份认证,要求其缴纳一定的保证金,为其诚实的挖矿行为做保证。
(2)细粒度的工作量检验算法:矿池应定时更新其使用的工作量检验算法,对以往算法中存在的问题进行背书,作为新算法设计的重要依据。
(3)合理的绩效制度:矿池应定时对矿工进行绩效考核,奖励表现优秀的矿工,驱逐效率低下的懒惰矿工。对矿池内的矿工行为进行管理和约束,保证矿池公平有序地运行。
(4)相互监管制度:设置矿工相互监管奖励,一旦矿工因进行算力伪造攻击和扣块攻击而被举报,则矿池奖励举报者,没收恶意矿工的保证金,将其加入黑名单后驱逐出矿池,不再录用。
丢弃攻击、空块攻击、通用挖矿攻击则属于恶意竞争出块奖励攻击行为。丢弃攻击中,攻击者主要依赖于网络资源优势,可以比其他节点更快获取数据上链信息,也可以更快地完成数据打包上链。所以丢弃攻击可以看作是女巫攻击的变种攻击,也可以作为自私挖矿攻击的前置攻击,提高攻击者实施自私挖矿攻击的成功率。为了防止丢弃攻击,区块链网络可以引入身份认证机制,对用户潜在的节点身份进行关联分析,杜绝单个用户通过操纵多个节点获取远高于其他节点的网络优势。在空块攻击场景中,攻击者之所以可以通过生成空块恶意竞争奖励,是因为区块链网络不存在对新区块的有效性验证过程。因此,区块链网络节点只要在获取新区块时执行有效性验证,即可有效缓解阻止空块攻击。通用挖矿攻击则需要特定的场景才可以实施,其关键在于攻击者利用新系统与旧系统之间相同的架构和共识机制导致的矿机(算力)通用问题,通过成熟系统的中算力对新系统实现算力压制,从而恶意竞争出块奖励,甚至实施双花攻击、卖空攻击等恶意行为。因此,新区块链项目必须考虑系统封闭性、专机专用等问题,从根本上杜绝算力通用导致的通用挖矿攻击。
芬尼攻击、种族攻击、交易顺序依赖攻击属于扰乱交易顺序类的攻击方式。芬尼攻击和种族攻击主要针对的是支持零确认交易的服务场景,前者主要利用挖矿便利,攻击者只有在挖到包含自己交易的区块时,才会通过零确认交易扰乱交易秩序,实现代币双花等目的;而后者和交易顺序依赖攻击则是通过提高交易Gas的方式扰乱交易顺序,进而实现代币双花等目的。这两者的共性在于区块链节点在接受新区块时未验证区块内交易与交易池中的未确认交易是否存在冲突。由于零确认交易可以满足商家的即时性支付需求,所以直接通过禁止零确认交易来阻止芬尼攻击和种族攻击的方式不具备可行性。区块链系统可以考虑开通钱包的子账户来保证零确认交易的安全性,即,用户需要通过专门的子账户才能完成零确认交易操作。此时,零确认交易由矿工单独打包验证,在一定程度上可以避免零确认交易与普通交易的冲突。此外,为了避免攻击者扰乱交易顺序,区块链系统可以要求矿工在打包交易时,通过代币锁定技术缴纳保证金之后再广播新区块。其他节点在接受新区块时,可以就区块内交易在交易池中进行遍历验证:如果通过验证,则接受新区块;否则,该节点可以通过举报矿工恶意行为来获取矿工被锁定的保证金及出块奖励。
• 八、防御策略与方法
在区块链交易场景中,攻击者的最终目的是通过直接或间接手段获取用户节点的账户信息,进而盗取资产,主要存在交易平台和用户账户两个攻击目标 。为了保证交易平台中用户的账户隐私,交易平台应采取以下措施。
(1)引入密码安全等级分析机制。系统可以在用户设置账户密码时,对当前密码的安全性进行实时评级,避免用户使用弱口令,从而预防弱口令攻击。
(2)交易平台应在用户登录账号时进行人机识别,在一定程度上缓解撞库攻击。而用户也应该注意避免多网站的密码通用问题,可以考虑对账户进行安全等级评估,相同安全等级的账户采用相同的密码,这样既可以缓解撞库攻击,也能避免账户密码过多给用户带来的密码管理问题。
(3)通过限制目标账户的登陆频率和限制单节点的访问请求频率,从被访问端和访问端两个方向限制攻击者的攻击能力,可以有效预防穷举攻击。
(4)启用API调用接口认证机制,合理管理交易平台的API接口,预防API接口攻击。
(5)提高开发工程师安全素养,在一些敏感系统里单独实现一些额外的认证机制,避免单点登陆漏洞。
此外,用户在日常交易中应该提高个人的安全意识,采取相应的安全措施,避免在交易过程中泄露了个人账户的隐私数据,具体需要从以下几方面考虑。
(1)培养好安全意识,提高对危险网站、邮件的辨识能力,预防钓鱼攻击。
(2)构建全面的系统安全防护体系,安装防火墙等安全软件,预防木马劫持攻击。
(3)利用安全的路由协议对区块链网络实现全方位覆盖,预防中间人劫持攻击。
(4)实现离线的密钥管理,预防攻击者对在线密钥存储中的私钥窃取。
(5)利用代码审计、逆向漏洞分析、反逆向工程等技术对钱包客户端代码的安全性进行评估。
(6)在使用数字货币钱包时,对一些来源不明的小额资金“粉尘”进行标记并禁用,预防粉尘攻击。
(7)使用专门的零钱包存储该用户持有的“粉尘”级资产,其中既包含攻击者发送的“粉尘”,也可能包含用户自身交易产生的小额资金。为了资产安全,该零钱包中的资金专用于隐私性不高的交易。
• 八、防御策略与方法
在针对认证机制漏洞的SIM hack攻击场景中,攻击者主要是利用服务商提供的“账户找回”服务中的安全隐患来成功获取目标账户。因为基于手机、邮件的二次验证并不是完全安全的方法,因此服务商应尝试使用采取2FA等具备更高安全性的有更高级别安全设置的服务。2FA是基于时间、历史长度、实物,例如信用卡、SMS手机、令牌、指纹等自然变量结合一定的加密算法组合出的一组动态密码,一般每60s刷新一次。这种方法不容易被破解,相对较安全。
• 八、防御策略与方法
理论上,基于UTXO结构的区块链系统可以抵抗重放攻击,因为转账是基于每一笔UTXO进行的原子级别操作,不存在一笔UTXO被重复扣除的情况。但是在类似以太坊的账户结构中,交易是通过余额判断合法性的只要余额足够就可以进行重复扣款转账,一笔交易的信息进行多次广播的重放攻击是可行的。交易延展性攻击和重放攻击非常相似,它们都是对交易所发起的攻击方式,但重放攻击主要针对区块链硬分叉的情况,而交易延展性攻击讲究的是区块标识的可变性。
• 八、防御策略与方法
此外,基于Hyperledger Fabric的区块链也可以抵抗重放攻击,该框架中采用Endorser节点对客户端提交的交易预案进行身份验证,若交易信息异常,则系统终止操作,这种方式可以有效阻止重放攻击。以太坊的账户结构中存在一个参数Nonce,该参数的值等于从这个账户中发出交易的数量。当交易完成验证后,发送者账户中的Nonce值会自动增加1。当矿工验证一笔交易是否合法的时候,矿工会对比交易包含的Nonce值,并与该交易的发送者账户中的Nonce值进行比较,相等才算作合法交易,并对该交易打包出块。单链重放攻击无法修改发送者账户的数值,因此当接受到重复交易时,矿工会直接判定它无效,从而阻止了单链重放攻击。面对多链重放攻击时可以参考以太零开发团队的做法,建立一个交易锁。当一笔交易发起时,交易锁将被广播到整个区块链网络。此时,交易锁会锁定交易关联的数字资产。交易在主节点验证期间,原交易资产被锁定无法使用,以此达到抵御多链重放攻击的目的。