0x00 背景介绍
区块链技术是金融科技(Fintech)领域的一项重要技术创新。
作为分布式记账(Distributed Ledger Technology,DLT)平台的核心技术,区块链被认为在金融、征信、物联 、经济贸易结算、资产管理等众多领域都拥有广泛的应用前景。区块链技术自身尚处于快速发展的初级阶段,现有区块链系统在设计和实现中利用了分布式系统、密码学、博弈论、 络协议等诸多学科的知识,为学习原理和实践应用都带来了不小的挑战。
区块链属于一种去中心化的记录技术。参与到系统上的节点,可能不属于同一组织、彼此无需信任;区块链数据由所有节点共同维护,每个参与维护节点都能复制获得一份完整记录的拷贝,由此可以看出区块链技术的特点:
- 维护一条不断增长的链,只可能添加记录,而发生过的记录都不可篡改;
- 去中心化,或者说多中心化,无需集中的控制而能达成共识,实现上尽量分布式;
- 通过密码学的机制来确保交易无法抵赖和破坏,并尽量保护用户信息和记录的隐私性。
虽然单纯从区块链理解,仅仅是一种数据记录技术,或者是一种去中心化的分布式数据库存储技术,但如果和智能合约结合扩展,就能让其提供更多复杂的操作,现在活跃的各个数字货币就是其中一种表现形式。
0x01 区块链安全性思考
由于区块链技术的特性,在设计之处就想要从不同维度解决一部分安全问题:
01 Hash唯一性
在blockchain中,每一个区块和Hash都是以一一对应的,每个Hash都是由区块头通过sha256计算得到的。因为区块头中包含了当前区块体的Hash和上一个区块的Hash,所以如果当前区块内容改变或者上一个区块Hash改变,就一定会引起当前区块Hash改变。如果有人修改了一个区块,该区块的 Hash 就变了。为了让后面的区块还能连到它,该人必须同时修改后面所有的区块,否则被改掉的区块就脱离区块链了。由于区块计算的算力需求强度很大,同时修改多个区块几乎是不可能的。
由于这样的联动机制,块链保证了自身的可靠性,数据一旦写入,就无法被篡改。这就像历史一样,发生了就是发生了,从此再无法改变,确保了数据的唯一性。
02 密码学安全性
以比特币为例,数字货币采用了非对称加密,所有的数据存储和记录都有数字签名作为凭据,非对称加密保证了支付的可靠性。
03 身份验证
在数字货币交易过程中,由一个地址到另一个地址的数据转移都会对其进行验证:
验证交易是否成功属实会经过如下几步:
04 去中心化的分布式设计
针对区块链来说,账本数据全部公开或者部分公开,强调的是账本数据多副本存在,不能存在数据丢失的风险,区块链当前采用的解决方案就是全分布式存储, 络中有许多个全节点,同步所有账本数据(有些同步部分,当然每个数据存储的副本足够多),这样 络中的副本足够多,就可以满足高可用的要求,丢失数据的风险就会低很多。所以建议部署区块链 络时,全节点尽量分散,分散在不同地理位置、不同的基础服务提供商、不同的利益体等。
05 传输安全性
在传输过程中,数据还未持久化,这部分空中数据会采用HTTP+SSL(也有采用websocket+websocketS)进行处理,从而保证数据在 络传输中防篡改且加密处理。
0x02 数字货币安全性思考
01 BTC
比特币(Bitcoin,代 BTC)是一种用去中心化、全球通用、不需第三方机构或个人,基于区块链作为支付技术的电子加密货币。比特币由中本聪于2009年1月3日,基于无国界的对等 络,用共识主动性开源软件发明创立。比特币也是目前知名度与市场总值最高的加密货币。
比特币区块结构
以太坊中的智能合约是运行在虚拟机上的,也就是通常说的 EVM(Ethereum Virtual Machine,以太坊虚拟机)。这是一个智能合约的沙盒,合约存储在以太坊的区块链上,并被编译为以太坊虚拟机字节码,通过虚拟机来运行智能合约。由于这个中间层的存在,以太坊也实现了多种语言的合约代码编译, 络中的每个以太坊节点运行 EVM 实现并执行相同的指令。如果说比特币是二维世界的话,那么以太坊就是三维世界,可以实现无数个不同的二维世界。
安全问题
ETH最大的特点就是智能合约,而智能合约漏洞也就导致了ETH的安全问题。
2016年黑客通过The Dao,利用智能合约中的漏洞,成功盗取360万以太币。THE DAO持有近15%的以太币总数,因此这次事件对以太坊 络及其加密币都产生了负面影响。
The DAO事件发生后,以太坊创始人Vitalik Buterin提议修改以太坊代码,对以太坊区块链实施硬分叉,将黑客盗取资金的交易记录回滚,得到了 区大部分矿工的支持,但也遭到了少数人的强烈反对。最终坚持不同意回滚的少数矿工们将他们挖出的区块链命名为Ethereum Classic(以太坊经典,简称ETC),导致了以太坊 区的分裂。在虚拟货币历史上,这是第一次,也可能唯一一次由于安全问题导致的区块链分叉事件。
无独有偶2017年7月19日, 多重签名钱包Parity1.5及以上版本出现安全漏洞,15万个ETH被盗,共价值3000万美元。
两次被盗事件都是因为智能合约中的漏洞。让我们看到,虚拟货币的安全不仅仅是平台和个人,区块链上的应用,也是我们应该关注的内容。
03 XMR
门罗币(Monero,代 XMR)是一个创建于2014年4月开源加密货币,它着重于隐私、分权和可扩展性。与自比特币衍生的许多加密货币不同,Monero基于CryptoNote协议,并在区块链模糊化方面有显著的算法差异。
隐蔽地址
隐蔽地址是为了解决输入输出地址关联性的问题。每当发送者要给接收者发送一笔金额的时候,他会首先通过接收者的地址(每次都重新生成),利用椭圆曲线加密算出一个一次性的公钥。然后发送者将这个公钥连同一个附加信息发送到区块链上,接收方可以根据自己的私钥来检测每个交易块,从而确定发送方是否已经发送了这笔金额。当接收方要使用这笔金额时,可以根据自己的私钥以及交易信息计算出来一个签名私钥,用这个私钥对交易进行签名即可。
环签名
隐蔽地址虽然能保证接收者地址每次都变化,从而让外部攻击者看不出地址关联性,但并不能保证发送者与接收者之间的匿名性。因此门罗币提出了一个环签名的方案——事实上,在古代就已经有类似的思想了:如图5所示,联名上书的时候,上书人的名字可以写成一个环形,由于环中各个名字的地位看上去彼此相等,因此外界很难猜测发起人是谁。这就是环签名。
并要求平台方支付BTC作为赎金换回NXT
二者都是发送20个ether,都是 个新的message call, 同的是这两个调的gasli mit 样。send()给予0的gas(相当于 call.gas(0).value()() ), call.value()() 给予全部(当前剩余)的gas。 当我们调某个智能合约时,如果指定的函数找到,或者根本就没指定调哪个函数(如发送ether)时,fallback函数就会被调用。
当通过 addr.call.value()() 的 式发送ether,和send() 样,fallback函数会被调 ,但是传递给fallback函数的是当前剩余的所有gas,如果精设计个fallback就能影响到系统,如写storage, 新调新的智能合约等等。
递归调用
一段用户从智能合约中取款的代码如下:
如果攻击者制造以上的1023个嵌套调用,之后再调用sendether()
,就可以让add.send(20ether)
失效,而其他执行成功:
当合约执行到withdrawRewardFor(msg.sender);
进入到函数withdrawRewardFor
判断
和此前的举例类似,DAO通过 addr.call.value()()
发送以太币 没有选择 send()
从 客只需要创建fallback再次调 splitDAO()
即可转移多份以太币,PoC如下:
Bitfinex负责 区和产品开发的主管塔克特(Zane Tackett)证实,119,756个比特币遭窃,该公司已经知道相关系统是如何被入侵的。以周二的价格计算,失窃比特币价值约6,500万美元,受此消息影响,全球比特币价格应声下跌25%。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!