区块链安全入门笔记

2019/11/13 program 共 9159 字,约 27 分钟

区块链安全入门笔记(系列1-10完整版)

虽然有着越来越多的人参与到区块链的行业之中,然而由于很多人之前并没有接触过区块链,也没有相关的安全知识,安全意识薄弱,这就很容易让攻击者们有空可钻。面对区块链的众多安全问题,慢雾特推出区块链安全入门笔记系列,向大家介绍十篇区块链安全相关名词,让新手们更快适应区块链危机四伏的安全攻防世界。

钱包wallet

钱包(wallet)是一个管理私钥的工具,数字货币钱包形式多样,但它通常包含一个软件客户端,允许使用者通过钱包检查、存储、交易其持有的数字货币。它是进入区块链世界的基础设施和重要入口。

据SlowMist Hacked统计,仅2018年因“钓鱼”、“第三方劫持”等原因所造成的的钱包被黑损失总金额就达 69,160,985 美元,深究根本,除了部分钱包本身对攻击防御的不全面之外,最主要的是钱包持有者们的安全防范意识不强。

冷钱包 Cold Wallet

冷钱包是一种脱离网络连接的离线钱包,将数字货币进行离线存储的钱包。使用者在一台离线的钱包上面生成数字货币地址和私钥,再将其保存起来。冷钱包是在不需要任何网络的情况下进行数字货币的存储,因此黑客是很难进入钱包获得私钥的,但它也不是绝对安全的,随机数不安全也会导致这个冷钱包不安全,此外硬件损坏、丢失也有可能造成数字货币的损失,因此需要做好秘钥的备份。

热钱包 Hot Wallet

热钱包是一种需要网络连接的在线钱包,在使用上更加方便。但由于热钱包一般需要在线使用,个人的电子设备有可能因误点钓鱼网站被黑客盗取钱包文件、捕获钱包密码或是破解加密私钥,而部分中心化管理钱包也并非绝对安全。因此在使用中心化交易所或钱包时,最好在不同平台设置不同密码,且开启二次认证,以确保自己的资产安全。

公钥 public key

公钥是和私钥成对出现的,和私钥一起组成一个密钥对,保存在钱包中。公钥由私钥生成,但是无法通过公钥倒推得到私钥。公钥能够通过一些列算法运算得到钱包的地址,因此可以作为拥有这个钱包地址的凭证。

私钥 private key

私钥是一串由随机算法生成的数据,它可以通过非对称加密算法算出公钥,公钥可以再算出币的地址。私钥是非常重要的,作为密码,除了地址的所有者之外,都被隐秘。区块链资产实际在区块链上,使用者实际只拥有私钥,并通过私钥对区块链的资产拥有绝对控制权,因此,区块链资产安全的核心问题在于私钥的存储,拥有者需做好安全保管。

助记词 Mnemonic

由于私钥是一长串毫无意义的字符,比较难以记忆,因此出现了助记词。助记词是利用固定算法,将私钥转换成十多个常见的英文单词。助记词和私钥是互通的,可以互相转换,它只是作为区块链数字钱包私钥的友好格式。所以在此强调:助记词即私钥!由于它的明文性,不建议它以电子方式保存,而是抄写在物理介质上保管好,它和Keystore作为双重备份互为补充。

Keystore

Keystore主要在以太坊钱包App中比较常见(比特币类似以太坊Keystore机制的是:BIP38),是把私钥通过钱包密码再加密得来的,与助记词不同,一般可保存为文本或json格式存储。换句话说,Keystore需要用钱包密码解密后才等同于私钥。因此,Keystore需要配合钱包密码使用,才能导入钱包。当黑客盗取Keystore后,在没有密码情况下,有可能通过暴力破解Keystore密码解开Keystore,所以建议使用者在设置密码时稍微复杂些,比如带上特殊字符,至少8位以上,并安全存储。

由于区块链技术的加持使得区块链数字钱包安全系数高于其他的数字钱包,其中最为关键的就是两点:防盗和防丢。相比于盗币事件原因的多样化,造成丢币事件发生的原因主要有五个类型:没有备份、备份遗失、忘记密码、备份错误、设备丢失或损坏。

因此,我们在备份一个区块链数字钱包的时候,对私钥、助记词、Keystore一定要进行多重、多次备份,把丢失的风险扼杀在摇篮之中。最后,为大家提供一份来自imToken总结的钱包安全十不原则:

  • 不使用未备份的钱包
  • 不使用邮件传输或存储私钥
  • 不使用微信收藏或云备份存储私钥
  • 不要截屏或拍照保存私钥
  • 不使用微信、QQ传输私钥
  • 不要将私钥告诉身边的人
  • 不要将私钥发送到群里
  • 不使用第三方提供的未知来源钱包应用
  • 不使用他人提供的appid
  • 不要将私钥导入未知的第三方网站

公链 Public Blockchain

公有链简称公链,是指全世界任何人都可随时进入读取、任何人都能发送交易且能获得有效确认的共识区块链。公链通常被认为是完全去中心化的,链上数据都是公开透明的,不可更改,任何人都可以通过交易或挖矿读取和写入数据。一般会通过代币机制(Token)来鼓励参与者竞争记账,来确保数据的安全性。

由于要检测所有的公链的工作量非常大,只靠一家公司不可能监测整个区块链生态安全问题,这就导致了黑客极有可能在众多公链之中寻找漏洞进行攻击。2017 年 4 月 1 日,Stellar 出现通胀漏洞,一名攻击者利用此漏洞制造了 22.5 亿的 Stellar 加密货币 XLM,当时价值约 1000 万美元。

交易所 Exchange

与买卖股票的证券交易所类似,区块链交易所即数字货币买卖交易的平台。数字货币交易所又分为中心化交易所和去中心化交易所。

其中心化交易所:交易行为直接发生在区块链上,数字货币会直接发回使用者的钱包,或是保存在区块链的智能合约。这样直接在链上交易的好处在于交易所不会持有用户大量的数字货币,所有的数字货币会存储在用户的钱包或平台的智能合约上。去中心化交易通过技术手段在信任层面去中心化,也可以说是无需信任,每笔交易都通过区块链进行公开透明,不负责保管用户的资产和私钥等信息,用户资金的所有权完全在自己手上,具有非常好的个人数据安全和隐私性。目前市面上的去中心化交易所有:WhaleEx、Bancor、dYdX 等

中心化交易所:目前热门的交易所大多都是采用中心化技术的交易所,使用者通常是到平台上注册,并经过一连串的身份认证程序(KYC)后,就可以开始在上面校验数字货币。用户在使用中心化交易所时,其货币交换不见得会发生在区块链上,取而代之的可能仅是修改交易所数据库内的资产数字,用户看到的只是账面上数字的变化,交易所只要用户提款时准备充足的数字货币可供汇出即可。当前的主流交易大部分是在中心化交易所内完成的,目前市面上的中心化交易所有:币安,火币,OKEx 等。

由于交易所作为连接区块链世界和现实世界的枢纽,存储了大量数字货币,它非常容易成为黑客们觊觎的目标,截止目前全球数字货币交易所因安全问题而遭受损失金额已超过 29 亿美元(数据来源 SlowMist Hacked)。

数字货币领域,攻击者的屠戮步伐从未停止。激烈的攻防对抗之下,防守方处于绝对的弱势,其攻击手法多种多样,我们会在之后的文章中为大家进行介绍。职业黑客往往会针对数字货币交易所开启定向打击,因此慢雾安全团队建议各方交易所加强安全建设,做好风控和内控安全,做好:早发现,早预警,早止损。

节点Node

在传统互联网领域,企业所有的数据运行都集中在一个中心化的服务器上,那么这个服务器就是一个节点。由于区块链是去中心化的分布式数据库,是由千千万万个“小服务器”组成。区块链网络中的每一个节点,就相当于存储所有区块数据的每一台电脑或服务器。所有新区块的生产,以及交易的验证与记账,并将其广播给全网同步,都由节点来完成。

节点分为“全节点”和“轻节点”,全节点就是拥有全网所有的交易数据的节点,那么轻节点就是只拥有和自己相关的交易数据节点。由于每一个全节点都保留着全网数据,这意味着,其中一个节点出现问题,整个区块链网络世界也依旧能够安全运行,这也是去中心化的魅力所在。

RPC

远程过程调用(Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。以太坊RPC接口是以太坊节点与其他系统交互的窗口,以太坊提供了各种RPC调用:HTTP、IPC、WebSocket等等。

在以太坊源码中,server.go是核心逻辑,负责API服务的注入,以及请求处理、返回。http.go实现HTTP的调用,websocket.go实现WebSocket的调用,ipc.go实现IPC的调用。以太坊节点默认在8545端口提供了JSON RPC接口,数据传输采用JSON格式,可以执行Web3库的各种命令,可以向前端(例如 imToken、Mist 等钱包客户端)提供区块链上的信息。

以太坊黑色情人节漏洞ETH Black Valentine’s Day

2018 年 3 月 20 日,慢雾安全团队观测到一起自动化盗币的攻击行为,攻击者利用以太坊节点Geth/Parity RPC API 鉴权缺陷,恶意调用eth_sendTransaction 盗取代币,持续时间长达两年,单被盗的且还未转出的以太币价值就高达现价2千万美金(以当时 ETH 市值计算),还有代币种类164种,总价值难以估计(很多代币还未上交易所正式发行)。

通过慢雾安全团队独有的墨子(MOOZ)系统对全球约 42 亿 IPv4 空间进行扫描探测,发现暴露在公网且开启RPC API的以太坊节点有 1 万多个。这些节点都存在被直接盗币攻击的高风险。这起利用以太坊RPC鉴权缺陷实施的自动化盗币攻击,已经在全球范围内对使用者造成了非常严重的经济损失。

共识Consensus

共识算法主要是解决分布式系统中,多个节点之间对某个状态达成一致性结果的问题。分布式系统由多个服务节点共同完成对事务的处理,分布式系统中多个副本对外呈现的数据状态需要保持一致性。

由于节点的不可靠性和节点间通讯的不稳定性,甚至节点作恶,伪造信息,使得节点之间出现数据状态不一致性的问题。通过共识算法,可以将多个不可靠的单独节点组建成一个可靠的分布式系统,实现数据状态的一致性,提高系统的可靠性。

区块链系统本身作为一个超大规模的分布式系统,但又与传统的分布式系统存在明显区别。由于它不依赖于任何一个中央权威,系统建立在去中心化的点对点网络基础上,因此分散的节点需要就交易的有效与否达成一致,这就是共识算法发挥作用的地方,即确保所有节点都遵守协议规则并保证所有交易都以可靠的方式进行。由共识算法实现在分散的节点间对交易的处理顺序达成一致,这是共识算法在区块链系统中起到的最主要作用。

区块链系统中的共识算法还承担着区块链系统中激励模型和治理模型中的部分功能,为了解决在对等网络中(P2P),相互独立的节点如何达成一项决议问题的过程。简而言之,共识算法是在解决分布式系统中如何保持一致性的问题。

工作量证明 PoW(Proof of Work)

PoW(Proof of Work)是历史上第一个成功的去中心化区块链共识算法。工作量证明是大多数人所熟悉的,被比特币、以太坊、莱特币等主流公链广泛使用。

工作量证明要求节点参与者执行计算密集型的任务,但是对于其他网络参与者来说易于验证。在比特币的例子中,矿中竞相向由整个网络维护的区块链账本中添加所收集到的交易,即区块。为了做到这一点,矿工必须第一个准确计算出“nonce”,这是一个添加在字符串末尾的数字,用来创建一个满足开头特定个数为零的哈希值。不过存在采矿的大量电力消耗和低交易吞吐量等缺点。

#权益证明 PoS(Proof of Stake) PoS(Proof of Stake)——权益证明机制,一种主流的区块链共识算法,目的是为了让区块链里的分布式节点达成共识,它往往和工作量证明机制(Proof of Work)一起出现,两种都被认为是区块链共识算法里面的主流算法之一。作为一种算法,它通过持币人的同意来达成共识,目的是确定出新区块,这过程相对于PoW,不需要硬件和电力,且效率更高。

PoS 共识中引入了State概念,持币人将代币进行Staking,要求所有的参与者抵押一部分他们所拥有的的Token来验证交易,然后获得出块的机会,PoS 共识中通过选举算法,按照持币量比例以及Token抵押时长,或者是一些其他的方式,选出打包区块的矿工。矿工在指定高度完成打包交易,生成新区块,并广播区块,广播的区块经过PoS 共识中另外一道“门槛”,验证人验证交易,通过验证后,区块得到确认。这样一轮PoS 的共识过程就进行完成了。权益证明通过长期绑定验证者的利益和整个网络的利益来阻止不良行为。锁定代币后,如果验证者存在欺诈性交易,那么他们所抵押的Token也会被削减。

PoS 的研究脚步还在不断推进,安全、性能和去中心化一直都是PoS 所追求的方向,未来也将有更多PoS 的项目落地。为了更好的观测公链运行状态,即时监测安全异常,慢雾在EOS、BOSCORE、FIBOS、YOYOW、IoTeX、COSMOS 上都部署了Safe Staking,落地扎根安全领域,关注节点的稳定与安全。

委托权益证明DPoS(Delegate Proof of Stake)

委托权益证明,其雏形诞生在2013 年 12 月 8 日,Daniel Larimer 在 bitsharetalk 首次谈及用投票选择出块人的方式,代替PoS 中可能出现的选举随机数被操纵的问题。在DPoS 中,让每一个持币者都可以进行投票,由此产生一定数量的代表,或者理解为一定数量的节点或矿池,他们彼此之间的权利是完全相等的。持币者可以随时通过投票更换这些代表,以维系链上系统的“长久纯洁性”。在某种程度上,这很像是国家治理里面的代议制,或者说是人大代表制度。这种制度最大的好处就是解决了验证人过多导致的效率低下问题,当然,这种制度也有很明显的缺点,由于“代表”制度,导致其一直饱受中心化诟病。

恶意挖矿攻击 Cryptojacking Attack

恶意挖矿攻击是一种恶意行为,指未经授权的情况下劫持用户设备挖掘加密货币。通常,攻击者会劫持受害者设备(个人 PC 或服务器)的处理能力和带宽,由于加密货币挖掘需要大量算力,攻击者会尝试感染多个设备,这样他们能够收集到足够的算力来执行这种低风险和低成本的挖矿活动。

一般恶意挖矿软件会诱导用户在计算机上加载挖矿代码,或通过使用类似网络钓鱼的方法,如恶意链接、电子邮件或是在网站里植入挖矿脚本等方式,使系统无意中被隐藏的加密挖矿程序感染进而完成攻击行为。近年来,随着加密货币价格的上涨,更加复杂的恶意软件被开发出来,使恶意挖矿攻击事件层出不穷。

在此我们为大家提供几条建议防范恶意挖矿攻击:

  • 注意设备性能和CPU利用率
  • 在web浏览器上安装挖矿脚本隔离插件,如 MinerBlock,NoCoin 和 Adblocker
  • 小心电子邮件附件和链接
  • 安装一个值得信赖的杀毒软件,让软件应用程序和操作系统保持最新状态

无利益攻击Nothing at Stake Attack

无利益攻击(Nothing at Stake Attack),是在Pos共识机制下一个有待解决的问题,其问题本质可以简单概括为:作恶无成本,好处无限多。

当PoS 共识系统出现分叉(Fork)时,出块节点可以在“不受任何损失”的前提下,同时在两个分叉上出块,无论哪一个分叉后面被公认为主链,该节点都可以获得“所有收益”且不会有任何成本损失。这就很容易给某些节点一种动力去产生新的分叉,支持或发起不合法交易,其他逐利的出块节点会同时在多条链(窗口)上排队出块支持新的分叉。随着时间的推移,分叉越来越多,非法交易,作恶猖狂。区块链将不再是唯一链,所有出块节点没有办法达成共识。

为了预防这样的情况发生,许多类PoS 共识机制对此的解决方法是引入惩罚机制,对作恶的节点进行经济惩罚(Slashing),以建立更加稳定的网络。DPoS 实际上也是无利益攻击的解决方案之一,由上文我们可知DPoS 这个机制由持币人选出出块节点来运营网络,出块节点会将一部分奖励分给投票者。

多签Multi-sig

多签指的是需要多个签名才能执行的操作(这些签名是不同私钥生成的)。这可用于提供更高的安全性,即使丢失单个私钥的话也不会让攻击者取的账户的权限,多个值得信赖的各方必须同时批准更新,否则无效。

我们都知道,一般来说一个比特币地址对应一个私钥,动用这个地址中的资金需要私钥的持有者发起签名才行。而多重签名技术,简单来说,就是动用一笔资金时需要多个私钥签名才有效。多签的一个优势就是可以多方对一笔付款一起达成共识,才能支付成功。

双花攻击 Double Spend Attack

双花攻击即一笔钱花了两次,双重支付,利用货币的数字特性两次或多次使用同一笔签完成支付。双花不会产生新的Token,但能把自己花出去的钱重新拿回来。简单说就是,攻击者将一笔Token转到另外一个地址,通常是转到交易所进行套现,然后再利用一些攻击手法对转账交易进行回滚。目前有常见的几种手法能够引发双花攻击:

1. Race Attack

这种攻击主要通过控制矿工费来实现双花。攻击者同时向网络中发送两笔交易,一笔交易发给自己(为了提高攻击成功的概率,他给遮蔽交易增加了足够的矿工费),一笔交易发给商家。由于发送给自己的交易中含有较高的手续费,会被矿工优先打包进区块的概率比较高。这时候这笔交易就会先于发给商家的那笔交易,那么发给商家的交易就会被回滚。对于攻击者来说,通过控制矿工费,就实现了同一笔Token的“双花”。

2. Finney Attack

攻击者主要通过控制区块的广播时间来实现双花,攻击对象针对的是接受0确认的商家。假设攻击者挖到区块,该区块中包含着一个交易,即A向B转了一定数量的Token,其中A和B都是攻击者的地址。但是攻击者并不广播这个区块,而是立即找到一个愿意接受0确认交易的商家向他购买一个物品,向商家发一笔交易,用A向商家的地址C支付,发给商家的交易广播出去后,攻击者再把自己之前挖到的区块广播出去,由于发给自己的交易先于发给商家的交易,对于攻击者来说,通过控制区块的广播时间,就实现了同一笔Token的“双花”。

3. Vector76 attack

Vector76 Attack 又称“一次确认攻击”,也就是交易确认一次后仍然可以回滚,是 Finney Attack 和 Race Attack 的组合。

攻击者创建两个节点,节点 A 连接到商家节点,节点 B 连接到区块链网络中的其他节点。接着,攻击者用同一笔 Token 发起两笔交易,一笔交易发送给商家地址,我们称为交易 1;一笔交易发送给自己的钱包地址,我们称为交易 2。与上面说的 Race Attack 一样,攻击者对交易 2 添加了较高的矿工费从而提高了矿工的打包概率,此时,攻击者并没有把这两笔交易广播到网络中去。

接着,攻击者开始在交易 1 所在的分支上进行挖矿,这条分支我们命名为分支 1。攻击者挖到区块后,并没有广播出去,而是同时做了两件事:在节点 A 上发送交易 1,在节点 B 上发送交易 2。

由于节点 A 只连接了商家节点,所以当商家节点想把交易 1 传给其它对等节点时,连接了更多节点的节点 B,已经把交易 2 广播给了网络中的大部分节点。于是,从概率上来讲,交易 2 就更有可能被网络认定为是有效的,交易 1 被认定为无效。

交易 2 被认为有效后,攻击者立即把自己之前在分支 1 上挖到的区块,广播到网络中。这时候,这个接受一次确认就支付的商家,会确认交易成功,然后攻击者就可以立即变现并转移资产。

同时,由于分支 2 连接的更多节点,所以矿工在这个分支上挖出了另一个区块,也就是分支 2 的链长大于分支 1 的链长。于是,分支 1 上的交易就会回滚,商家之前支付给攻击者的交易信息就会被清除,但是攻击者早已经取款,实现了双花。

4. 51% attack

攻击者占有超过全网 50% 的算力,在攻击者控制算力的这段时间,他可以创造一条高度大于原来链的新链。那么旧链中的交易会被回滚,攻击者可以使用同一笔 Token 发送一笔新的交易到新链上。

目前已知公链安全事件的攻击手法多为 51% 攻击,截止发稿日由于攻击者掌握大量算力发起 51% 攻击所造成的损失共 19,820,000 美金。2019 年 1 月 6 日,慢雾区预警了 ETC 网络的 51% 算力攻击的可能性,据 Coinbase 博客报道该攻击者总共发起了 15 次攻击,其中 12 次包含双花,共计被盗 219,500 ETC(按当时市价约为 110 万美元),攻击者经过精心准备,通过租借大量算力向 ETC 发动了 51% 攻击,累计收益超 10 倍,Gate.io、Yobit、Bitrue 等交易所均受到影响。所幸在整个 ETC 生态社区的努力下,一周后攻击者归还了攻击所得收益,幸而没有造成进一步的损失。

软分叉 Soft-fork

软分叉(Soft-fork)更多情况下是一种协议升级,当新共识规则发布后,没有升级的旧节点并不会意识到代码已经发生改变,而继续生产不合法的区块,就会产生临时性分叉,但新节点可以兼容旧节点,即新旧节点始终在同一条链上工作。

硬分叉 Hard-fork

硬分叉(Hard-fork)是区块链发生永久性分歧,在新共识规则发布后,已经升级的节点无法验证未升级节点产生的区块,未升级节点也无法验证已经升级的节点产生的区块,即新旧节点互不兼容,通常硬分叉就会发生,原有正常的一条链被分成了两条链(已升级的一条链和未升级的一条链,且这两条链互不兼容)。

历史上比较著名的硬分叉事件是 The DAO 事件,作为以太坊上的一个著名项目,由于智能合约的漏洞造成资金被黑客转移,黑客盗取了当时价值约 6000 万美元的 ETH,让这个项目蒙受了巨大的损失。为了弥补这个损失,2016 年 7 月,以太坊团队修改了以太坊合约代码实行硬分叉,在第 1920000 个区块强行把 The DAO 及其子 DAO 的所有资金全部转到一个特定的退款合约地址,进而“夺回”了黑客所控制 DAO 合约上的币。但这个修改被一部分矿工所拒绝,因而形成了两条链,一条为原链(以太坊经典,ETC),一条为新的分叉链(ETH),他们各自代表了不同社区的共识和价值观。

文档信息

Search

    Table of Contents

    目录