区块链入门安全笔记

 

虽然有着愈来愈多的人参与到区块链的行业之中,然而因为不少人以前并无接触过区块链,也没有相关的安全知识,安全意识薄弱,这就很容易让攻击者们有空可钻。面对区块链的众多安全问题,咱们从两方面介绍:区块链安全重点名词解释和攻击方法,让新手们更快适应区块链危机四伏的安全攻防世界。
1、重点名词解释   
(一)钱包(Wallet) 钱包(Wallet)是一个管理私钥的工具,数字货币钱包形式多样,但它一般包含一个软件客户端,容许使用者经过钱包检查、存储、交易其持有的数字货币。它是进入区块链世界的基础设施和重要入口。前端

(二)冷钱包(Cold Wallet)冷钱包(Cold Wallet)是一种脱离网络链接的离线钱包,将数字货币进行离线储存的钱包。使用者在一台离线的钱包上面生成数字货币地址和私钥,再将其保存起来。冷钱包是在不须要任何网络的状况下进行数字货币的储存,所以黑客是很难进入钱包得到私钥的,但它也不是绝对安全的,随机数不安全也会致使这个冷钱包不安全,此外硬件损坏、丢失也有可能形成数字货币的损失,所以须要作好密钥的备份。web

(三)热钱包 (Hot Wallet)热钱包(Hot Wallet)是一种须要网络链接的在线钱包,在使用上更加方便。但因为热钱包通常须要在线使用,我的的电子设备有可能因误点钓鱼网站被黑客盗取钱包文件、捕获钱包密码或是破解加密私钥,而部分中心化管理钱包也并不是绝对安全。所以在使用中心化交易所或钱包时,最好在不一样平台设置不一样密码,且开启二次认证,以确保本身的资产安全。算法

(四)公钥(Public Key)公钥(Public Key)是和私钥成对出现的,和私钥一块儿组成一个密钥对,保存在钱包中。公钥由私钥生成,可是没法经过公钥倒推获得私钥。公钥可以经过一系列算法运算获得钱包的地址,所以能够做为拥有这个钱包地址的凭证。数据库

(五)私钥(Private Key)私钥(Private Key)是一串由随机算法生成的数据,它能够经过非对称加密算法算出公并经过私钥对区块链的资产拥有绝对控制权,所以,区块链资产安全的核心问题在于私钥的存储钥,公钥能够再算出币的地址。私钥是很是重要的,做为密码,除了地址的全部者以外,都被隐藏。区块链资产实际在区块链上,全部者实际只拥有私钥,,拥有者需作好安全保管。和传统的用户名、密码形式相比,使用公钥和私钥交易最大的优势在于提升了数据传递的安全性和完整性,由于二者——对应的关系,用户基本不用担忧数据在传递过程当中被黑客中途截取或修改的可能性。同时,也由于私钥加密必须由它生成的公钥解密,发送者也不用担忧数据被他人伪造。浏览器

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

(七)Keystore Keystore主要在以太坊钱包 App 中比较常见(比特币相似以太坊Keystore机制的是:BIP38),是把私钥经过钱包密码再加密得来的,与助记词不一样,通常可保存为文本或 JSON 格式存储。换句话说,Keystore须要用钱包密码解密后才等同于私钥。所以,Keystore须要配合钱包密码来使用,才能导入钱包。当黑客盗取Keystore后,在没有密码状况下, 有可能经过暴力破解Keystore密码解开Keystore,因此建议使用者在设置密码时稍微复杂些,好比带上特殊字符,至少 8 位以上,并安全存储。
因为区块链技术的加持使得区块链数字钱包安全系数高于其余的数字钱包,其中最为关键的就是两点:防盗和防丢。相比于盗币事件缘由的多样化,形成丢币事件发生的缘由主要有五个类型:没有备份、备份遗失、忘记密码、备份错误以及设备丢失或损坏。所以,咱们在备份一个区块链数字钱包的时候,对私钥、助记词、Keystore必定要进行多重、屡次备份,把丢币的风险扼杀在摇篮之中。
为你们提供一份来自imToken总结的钱包安全“十不原则”:1.    不使用未备份的钱包;2.    不使用邮件传输或存储私钥;3.    不使用微信收藏或云备份存储私钥;4.    不要截屏或拍照保存私钥;5.    不使用微信、QQ 传输私钥;6.    不要将私钥告诉身边的人;7.    不要将私钥发送到群里;8.    不使用第三方提供的未知来源钱包应用;9.    不使用他人提供的 Apple ID;10.  不要将私钥导入未知的第三方网站。服务器

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

(九)交易所 Exchange与买卖股票的证券交易所相似,区块链交易所即数字货币买卖交易的平台。数字货币交易所又分为中心化交易所和去中心化交易所。去中心化交易所:交易行为直接发生在区块链上,数字货币会直接发回使用者的钱包,或是保存在区块链上的智能合约。这样直接在链上交易的好处在于交易所不会持有用户大量的数字货币,全部的数字货币会储存在用户的钱包或平台的智能合约上。去中心化交易经过技术手段在信任层面去中心化,也能够说是无需信任,每笔交易都经过区块链进行公开透明,不负责保管用户的资产和私钥等信息,用户资金的全部权彻底在本身手上,具备很是好的我的数据安全和隐私性。目前市面上的去中心化交易全部WhaleEx、Bancor、dYdX等。中心化交易所:目前热门的交易所大多都是采用中心化技术的交易所,使用者一般是到平台上注册,并通过一连串的身份认证程序(KYC)后,就能够开始在上面交易数字货币。用户在使用中心化交易所时,其货币交换不见得会发生在区块链上,取而代之的可能仅是修改交易所数据库内的资产数字,用户看到的只是帐面上数字的变化,交易所只要在用户提款时准备充足的数字货币可供汇出便可。当前的主流交易大部分是在中心化交易所内完成的,目前市面上的中心化交易全部币安,火币,OKEx等。websocket

(十)节点 Node在传统互联网领域,企业全部的数据运行都集中在一个中心化的服务器中,那么这个服务器就是一个节点。因为区块链是去中心化的分布式数据库,是由千千万万个“小服务器”组成。区块链网络中的每个节点,就至关于存储全部区块数据的每一台电脑或者服务器。全部新区块的生产,以及交易的验证与记账,并将其广播给全网同步,都由节点来完成。节点分为“全节点”和“轻节点”,全节点就是拥有全网全部的交易数据的节点,那么轻节点就是只拥有和本身相关的交易数据节点。因为每个全节点都保留着全网数据,这意味着,其中一个节点出现问题,整个区块链网络世界也依旧可以安全运行,这也是去中心化的魅力所在。网络

(十一) RPC 远程过程调用(Remote ProcedureCall,缩写为 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 Day2018 年 3 月 20 日,慢雾安全团队观测到一块儿自动化盗币的攻击行为,攻击者利用以太坊节点Geth/Parity RPCAPI 鉴权缺陷,恶意调用eth_sendTransaction盗取代币,持续时间长达两年,单被盗的且还未转出的以太币价值就高达现价 2 千万美金(以当时 ETH 市值计算),还有代币种类 164 种,总价值难以估计(不少代币还未上交易所正式发行)。

(十三)共识 Consensus共识算法主要是解决分布式系统中,多个节点之间对某个状态达成一致性结果的问题。分布式系统由多个服务节点共同完成对事务的处理,分布式系统中多个副本对外呈现的数据状态须要保持一致性。因为节点的不可靠性和节点间通信的不稳定性,甚至节点做恶,伪造信息,使得节点之间出现数据状态不一致性的问题。经过共识算法,能够将多个不可靠的单独节点组建成一个可靠的分布式系统,实现数据状态的一致性,提升系统的可靠性。
区块链系统自己做为一个超大规模的分布式系统,但又与传统的分布式系统存在明显区别。因为它不依赖于任何一个中央权威,系统创建在去中心化的点对点网络基础之上,所以分散的节点须要就交易的有效与否达成一致,这就是共识算法发挥做用的地方,即确保全部节点都遵照协议规则并保证全部交易都以可靠的方式进行。由共识算法实如今分散的节点间对交易的处理顺序达成一致,这是共识算法在区块链系统中起到的最主要做用。区块链系统中的共识算法还承担着区块链系统中激励模型和治理模型中的部分功能,为了解决在对等网络中(P2P),相互独立的节点如何达成一项决议问题的过程。简而言之,共识算法是在解决分布式系统中如何保持一致性的问题。

(十四)工做量证实PoW(Proof of Work)PoW(Proof of Work)是历史上第一个成功的去中心化区块链共识算法。工做量证实是大多数人所熟悉的,被比特币、以太坊,莱特币等主流公链普遍使用。
工做量证实要求节点参与者执行计算密集型的任务,可是对于其余网络参与者来讲易于验证。在比特币的例子中,矿工竞相向由整个网络维护的区块链帐本中添加所收集到的交易,即区块。为了作到这一点,矿工必须第一个准确计算出“nonce”,这是一个添加在字符串末尾的数字,用来建立一个知足开头特定个数为零的哈希值。不过存在采矿的大量电力消耗和低交易吞吐量等缺点。

(十五)权益证实PoS(Proof of Stake)PoS(Proof of Stake)——权益证实机制,一种主流的区块链共识算法,目的是为了让区块链里的分布式节点达成共识,它每每和工做量证实机制(Proof of Work)一块儿出现,两种都被认为是区块链共识算法里面的主流算法之一。做为一种算法,它经过持币人的赞成来达成共识,目的是肯定出新区块,这过程相对于PoW,不须要硬件和电力,且效率更高。
PoS共识中引入了 Stake 的概念,持币人将代币进行 Staking,要求全部的参与者抵押一部分他们所拥有的 Token 来验证交易,而后得到出块的机会,PoS共识中会经过选举算法,按照持币量比例以及 Token 抵押时长,或者是一些其余的方式,选出打包区块的矿工。矿工在指定高度完成打包交易,生成新区块,并广播区块,广播的区块通过PoS共识中另一道"门槛",验证人验证交易,经过验证后,区块获得确认。这样一轮PoS的共识过程就进行完成了。权益证实经过长期绑定验证者的利益和整个网络的利益来阻止不良行为。锁定代币后,若是验证者存在欺诈性交易,那么他们所抵押的 Token 也会被削减。

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

(十七)多签(Multi-sig)多签(Multi-sig)指的是须要多个签名才能执行的操做(这些签名是不一样私钥生成的)。这可用于提供更高的安全性,即便丢失单个私钥的话也不会让攻击者取得账户的权限,多个值得信赖的各方必须同时批准更新,不然无效。咱们都知道,通常来讲一个比特币地址对应一个私钥,动用这个地址中的资金须要私钥的持有者发起签名才行。而多重签名技术,简单来讲,就是动用一笔资金时须要多个私钥签名才有效。多签的一个优点就是能够多方对一笔付款一块儿达成共识,才能支付成功。

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

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

(二十)智能合约(Smart Contract)并非一个新的概念,早在 1995 年就由跨领域法律学者 Nick Szabo 提出:智能合约是一套以数字形式定义的承诺(Promises),包括合约参与方能够在上面执行这些承诺的协议。在区块链领域中,智能合约本质能够说是一段运行在区块链网络中的代码,它以计算机指令的方式实现了传统合约的自动化处理,完成用户所赋予的业务逻辑。

2、攻击方法介绍
(一)恶意挖矿攻击(Cryptojacking)恶意挖矿攻击(Cryptojacking)是一种恶意行为,指未经受权的状况下劫持用户设备挖掘加密货币。一般,攻击者会劫持受害者设备(我的 PC 或服务器)的处理能力和带宽,因为加密货币挖掘须要大量算力,攻击者会尝试同时感染多个设备,这样他们可以收集到足够的算力来执行这种低风险和低成本的挖矿活动。通常恶意挖矿软件会诱导用户在计算机上加载挖矿代码,或经过使用相似网络钓鱼的方法,如恶意连接、电子邮件或是在网站里植入挖矿脚本等方式,使系统无心中被隐藏的加密挖矿程序感染进而完成攻击行为。近年来,随着加密货币价格的上涨,更加复杂的恶意软件被开发出来,使恶意挖矿攻击事件层出不穷。
在此咱们为你们提供几条建议防范恶意挖矿攻击:一、注意设备性能和 CPU 利用率;二、在 Web 浏览器上安装挖矿脚本隔离插件,例如MinerBlock,NoCoin和 Adblocker;三、当心电子邮件附件和连接;四、安装一个值得信赖的杀毒软件,让软件应用程序和操做系统保持最新状态。

(二)无利益攻击(Nothing at Stake Attack)无利益攻击(Nothing at Stake Attack),是在PoS共识机制下一个有待解决的问题,其问题的本质能够简单归纳为“做恶无成本,好处无限多”。当PoS共识系统出现分叉(Fork)时,出块节点能够在“不受任何损失”的前提下,同时在两个分叉上出块;不管哪个分叉后面被公认为主链,该节点均可以得到“全部收益”且不会有任何成本损失。这就很容易给某些节点一种动力去产生新的分叉,支持或发起不合法交易,其余逐利的出块节点会同时在多条链(窗口)上排队出块支持新的分叉。随着时间的推移,分叉愈来愈多,非法交易,做恶猖狂。区块链将再也不是惟一链,全部出块节点没有办法达成共识。为了预防这样的状况发生,许多类PoS共识机制对此的解决方法是引入惩罚机制,对做恶的节点进行经济惩罚(Slashing),以创建更加稳定的网络。DPoS实际上也是无利益攻击的解决方案之一,由上文咱们可知DPoS这个机制由持币人选出出块节点来运营网络,出块节点会将一部分奖励分给投票者。

(三)双花攻击(Double Spend Attack)双花攻击(Double Spend Attack)即一笔钱花了两次,双重支付,利用货币的数字特性两次或屡次使用“同一笔钱”完成支付。双花不会产生新的 Token,但能把本身花出去的钱从新拿回来。简单说就是,攻击者将一笔 Token 转到另一个地址,一般是转到交易所进行套现,而后再利用一些攻击手法对转帐交易进行回滚。目前有常见的几种手法可以引起双花攻击:1. Race Attack这种攻击主要经过控制矿工费来实现双花。攻击者同时向网络中发送两笔交易,一笔交易发给本身(为了提升攻击成功的几率,他给这笔交易增长了足够的矿工费),一笔交易发给商家。因为发送给本身的交易中含有较高的手续费,会被矿工优先打包进区块的几率比较高。这时候这笔交易就会先于发给商家的那笔交易,那么发给商家的交易就会被回滚。对于攻击者来讲,经过控制矿工费,就实现了同一笔 Token 的“双花”。2. Finney Attack攻击者主要经过控制区块的广播时间来实现双花,攻击对象针对的是接受 0 确认的商家。假设攻击者挖到区块,该区块中包含着一个交易,即 A 向 B 转了必定数量的 Token,其中 A 和 B 都是攻击者的地址。可是攻击者并不广播这个区块,而是当即找到一个愿意接受 0 确认交易的商家向他购买一个物品,向商家发一笔交易,用 A 向商家的地址 C 支付,发给商家的交易广播出去后,攻击者再把本身以前挖到的区块广播出去,因为发给本身的交易先于发给商家的交易,对于攻击者来讲,经过控制区块的广播时间,就实现了同一笔 Token 的“双花”。3. Vector76attackVector76 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 发送一笔新的交易到新链上。

(四)异形攻击(Alien Attack)异形攻击(Alien Attack)其实是一个全部公链均可能面临的问题,又称地址池污染,是指诱使同类链的节点互相侵入和污染的一种攻击手法,漏洞的主要缘由是同类链系统在通讯协议上没有对不一样链的节点作识别。这种攻击在一些参考以太坊通讯协议实现的公链上获得了复现:以太坊同类链,因为使用了兼容的握手协议,没法区分节点是否属于同个链,利用这一点,攻击者先对以太坊节点地址进行收集并进行恶意握手操做,经过跟节点握手达成污染地址池的目的,使得不一样链的节点互相握手并把各自地址池里已知的节点推送给了对方,致使更多的节点互相污染,最终扩散致整个网络。遭受异形攻击的节点一般会通讯性能降低,最终形成节点阻塞、主网异常等现象。相关公链须要注意持续保持主网健康状态监测,以避免出现影响主网稳定的攻击事件出现。

(五)钓鱼攻击(Phishing)所谓“钓鱼攻击(Phishing)”,指的是攻击者假装成能够信任的人或机构,经过电子邮件、通信软件、社交媒体等方式,以获取收件人的用户名、密码、私钥等私密信息。随着技术的发展,网络钓鱼攻击不只能够托管各类恶意软件和勒索软件攻击,并且更糟糕的是这些攻击正在呈现不断上升的趋势。建议用户保持警戒,经过即时通信 App、短信或电子邮件获取到的每条信息都须要谨慎对待,不要在经过点击连接到达的网站上输入凭据或私钥,在交易时尽量的使用硬件钱包和双因素认证(2FA),生态中的项目方在攻击者没有确切告知漏洞细节以前,不要给攻击者转帐,若项目方没法准确判断和独自处理,能够联系安全公司协助处理。

(六)木马攻击(Trojan Horse Attack)木马攻击(Trojan Horse Attack)是指攻击者经过隐藏在正常程序中的一段具备特殊功能的恶意代码,如具有破坏和删除文件、发送密码、记录键盘和 DDoS 攻击等特殊功能的后门程序,将控制程序寄生于被控制的计算机系统中,内外夹攻,对被感染木马病毒的计算机实施操做。可用来窃取用户我的信息,甚至是远程控制对方的计算机而加壳制做,而后经过各类手段传播或者骗取目标用户执行该程序,以达到盗取密码等各类数据资料等目的。在区块链领域,诸如勒索木马、恶意挖矿木马一直是行业内使人头疼的安全顽疾,据币世界报道,随着比特币的飙升,推进整个数字加密货币价格回升,与币市密切相关的挖矿木马开始新一轮活跃,仅 2019 年上半年挖矿木马日均新增 6 万个样本,经过分析发现某些新的挖矿木马家族出现了快速、持续更新版本的现象,其功能设计愈来愈复杂,在隐藏手法、攻击手法方面不断创新,与杀软厂商的技术对抗正在不断加强。

(七)供应链攻击(Supply Chain Attack)供应链攻击(Supply Chain Attack)是一种很是可怕的攻击方式,防护上很难作到完美规避,因为如今的软件工程,各类包/模块的依赖十分频繁、常见,而开发者们很难作到一一检查,默认都过于信任市面上流通的包管理器,这就致使了供应链攻击几乎已经成为必选攻击之一。把这种攻击称成为供应链攻击,是为了形象说明这种攻击是一种依赖关系,一个链条,任意环节被感染都会致使链条以后的全部环节出问题。供应链攻击防不胜防且不计代价,建议全部数字加密货币相关项目(如交易所、钱包、DApp等)都应该强制至少一名核心技术完整审查一遍全部第三方模块,看看是否存在可疑代码,也能够经过抓包查看是否存在可疑请求。

(八)交易回滚攻击(Roll Back Attack)交易回滚攻击(Roll Back Attack),故名思义,指的是能对交易的状态进行回滚。回滚具体是什么意思呢?回滚具体指的是将已经发生的状态恢复成它未发生时候的样子。那么,交易回滚的意思就是将已经发生的交易变成未发生的状态。即攻击者原本已经发生了支付动做,可是经过某些手段,让转帐流程发生错误,从而回滚整个交易流程,达到交易回滚的目的,这种攻击手法多发于区块链上的的智能合约游戏当中,当用户的下注动做和合约的开奖动做在一个交易内的时候,即内联交易。攻击者就能够经过交易发生时检测智能合约的某些状态,获知开奖信息,根据开奖信息选择是否对下注交易进行回滚。建议开发者们不要将用户的下注与开奖放在同一个交易内,防止攻击者经过检测智能合约中的开奖状态实现交易回滚攻击。

(九)交易排挤攻击(Transaction Congestion Attack)交易排挤攻击(Transaction Congestion Attack)是针对 EOS 上的使用 defer 进行开奖的游戏合约的一种攻击手法,攻击者能够经过某些手段,在游戏合约的 defer 开奖交易前发送大量的 defer 交易,恶意侵占区块内的 CPU 资源,使得智能合约内本应在指定区块内执行的 defer 开奖交易因资源不足没法执行,只能去到下一个区块才执行。因为不少 EOS 上的游戏智能合约使用区块信息做为智能合约自己的随机数,同一个 defer 开奖交易在不一样区块内的执行结果是不同的。经过这样的方式,攻击者在获知没法中奖的时候,就经过发送大量的 defer 交易,强行让智能合约从新开奖,从而达到攻击目的。建议智能合约开发者对在不一样区块内执行结果不一样的关键的操做不要采用 defer 交易的方式,下降合约被攻击的风险。

(十)随机数攻击(Random Number Attack)随机数攻击(Random Number Attack),就是针对智能合约的随机数生成算法进行攻击,预测智能合约的随机数。目前区块链上不少游戏都是采用的链上信息(如区块时间,将来区块哈希等)做为游戏合约的随机数源,也称随机数种子。使用这种随机数种子生成的随机数被称为伪随机数。伪随机数不是真的随机数,存在被预测的可能。当使用可被预测的随机数种子生成随机数的时候,一旦随机数生成的算法被攻击者猜想到或经过逆向等其余方式拿到,攻击者就能够根据随机数的生成算法预测游戏即将出现的随机数,实现随机数预测,达到攻击目的。建议智能合约开发者不要使用不安全的随机数种子生成随机数,下降合约被攻击的风险。

(十一)hard_fail状态攻击hard_fail Attackhard_fail是什么呢?简单来讲就是出现错误可是没有使用错误处理器(error handler)处理错误,比方说使用onerror捕获处理,若是说没有onerror捕获,就会hard_fail。EOS 上的交易状态记录分为  executed,soft_fail, hard_fail, delayed 和 expired 这 5 种状态,一般在链上大部分人观察到的交易,都是 executed 的,或者 delayed 的,而没有失败的交易,这就致使大部分开发者误觉得 EOS 链上没有失败的交易记录,从而忽略了对交易状态的检查。攻击者利用这个细节,针对链上游戏或交易所进行攻击,构造执行状态为hard_fail的交易,欺骗链上游戏或交易所进行假充值攻击,从而获利。在此提醒交易所和 EOS DApp游戏开发者在处理转帐交易的时候须要严格校验交易状态,确保交易执行状态为 executed。

(十二)重放攻击 Replay Attack重放攻击(Replay Attack),是针对区块链上的交易信息进行重放,通常来讲,区块链为了保证不可篡改和防止双花攻击的发生,会对交易进行各类验证,包括交易的时间戳,nonce,交易 id 等,可是随着各类去中心化交易所的兴起,在智能合约中验证用户交易的场景愈来愈多。这种场景通常是须要用户对某一条消息进行签名后上传给智能合约,而后在合约内部进行验签。但因为用户的签名信息是会上链的,也就是说每一个人都能拿到用户的签名信息,当在合约中校验用户签名的时候,若是被签名的消息不存在随着交易次数变化的变量,如时间戳,nonce 等,攻击者就能够拿着用户的签名,伪造用户发起交易,从而获利。这是一种最先出现于DApp生态初期的攻击形态,因为开发者设计的开奖随机算法存在严重缺陷,使得攻击者可利用合约漏洞重复开奖,属于开发者较为容易忽略的错误。所以,开发者们在链上进行验签操做的时候,须要对被签名消息加上各类可变因子,防止攻击者对链上签名进行重放,形成资产损失。

(十三)重入攻击 Reentrancy Attack重入攻击(Reentrancy Attack)首次出现于以太坊,对应的真实攻击为 The DAO 攻击,这次攻击还致使了原来的以太坊分叉成以太经典(ETC)和如今的以太坊(ETH)。因为项目方采用的转帐模型为先给用户发送转帐而后才对用户的余额状态进行修改,致使恶意用户能够构造恶意合约,在接受转帐的同时再次调用项目方的转帐函数。利用这样的方法,致使用户的余额状态一直没有被改变,却能一直提取项目方资金,最终致使项目方资金被耗光。提醒智能合约开发者在进行智能合约开发时,在处理转帐等关键操做的时候,若是智能合约中存储了用户的资金状态,要先对资金状态进行修改,而后再进行实际的资金转帐,避免重入攻击。

(十四)假充值攻击 False Top-up假充值攻击(False Top-up),分为针对智能合约的假充值攻击和对交易所的假充值攻击。在假充值攻击中,不管是智能合约仍是交易所自己,都没有收到真实的 Token,可是用户又确实获得了真实的充值记录,在这种状况下,用户就能够在没有真正充值的状况下从智能合约或交易所中用假资产或不存在的资产窃取真实资产。1.  智能合约假充值攻击针对智能合约的假充值主要是假币的假充值,这种攻击手法多发于 EOS 和波场上,因为 EOS 上代币都是采用合约的方式进行发行的,EOS 链的系统代币一样也是使用这种方式发行,同时,任何人也能够发行名为 EOS 的代币。只是发行的合约账号不同,系统代币的发行合约为"eosio.token",而其余人发行的代币来源于其余合约账号。当合约内没有校验 EOS 代币的来源合约的时候,攻击者就能经过充值攻击者本身发布的 EOS 代币,对合约进行假充值攻击。而波场上的假充值攻击主要是 TRC10 代币的假充值攻击,因为每个 TRC10 都有一个特定的tokenid进行识别,当合约内没有对tokenid进行校验的时候,任何人均可以以 1024 个 TRX 发行一个 TRC10 代币对合约进行假充值。2.  交易所假充值攻击针对交易所的假充值攻击分为假币攻击和交易状态失败的假充值攻击。以 EOS 和以太坊为例。针对 EOS 可使用名为 EOS 的假币的方式对交易所进行假充值攻击,若是交易所没有严格校验 EOS 的来源合约为"eosio.token",攻击就会发生。同时,区别于 EOS,因为以太坊上会保留交易失败的记录,针对 ERC20 Token,若是交易所没有校验交易的状态,就能经过失败的交易对交易所进行 ERC20 假充值。除此以外,hard_fail状态攻击也是属于假充值攻击的一种。建议交易所和智能合约开发者在处理转帐的时候要充分校验交易的状态,若是是 EOS 或波场上的交易,在处理充值时还要同时校验来源合约是不是"eosio.token" 或tokenid是否为指定的tokenid。

(十五)短地址攻击 Short Address Attack短地址攻击(Short Address Attack)是针对以太坊上 ERC20 智能合约的一种攻击形式,利用的是 EVM 中的对于输入字节码的自动补全机制进行攻击。通常而言,针对 ERC20 合约中的 transfer 函数的调用,输入的字节码位数都是 136 字节的。当调用 ERC20 中的 transfer 函数进行 ERC20 Token 转帐时,若是攻击者提供的地址后有一个或多个 0,那么攻击者就能够把地址后的零省去,提供一个缺位的地址。当对这个地址转帐的时候,比方说转帐 100 的 A Token,而后输入的地址是攻击者提供的缺位地址,这时候,通过编码输入的数据是 134 字节,比正常的数据少了 2 字节,在这种状况下,EVM 就会对缺失的字节位在编码数据的末尾进行补 0 凑成 136 字节,这样原本地址段缺失的 0 被数据段的 0 补齐了,而因为给地址段补 0,数据段会少 0,而数据段缺失的 0 由 EVM 自动补齐,这就像数据段向地址段移动补齐地址段缺失字节位,而后数据段缺失的字节位由 EVM 用 0 补齐。这种状况下,转帐金额就会由 100 变成 100 * 16 的 n 次方,n 是地址缺失的 0 的个数。经过这种方式,攻击者就能对交易所或钱包进行攻击,盗窃交易所和钱包的资产。建议交易所和钱包在处理转帐的时候,要对转帐地址进行严格的校验,防止短地址攻击的发生。

(十六)假币攻击 Fake Token Attack假币攻击(Fake Token Attack),是针对那些在建立官方 Token 时采用通用建立模版建立出来的代币,每一个 Token 的识别仅根据特定的标记进行识别,如 EOS 官方 Token 的识别标记是"eosio.token"合约,波场的 TRC10 的识别标记是tokenid,以太坊的 ERC20 是用合约地址做为识别标记。那么这样就会出现一个问题,若是收款方在对这些 Token 进行收款的时候没有严格校验这些 Token 特有的标记,攻击就会发生,以 EOS 为例子,因为 EOS 官方 Token 采用的是合约来发行一个名为 EOS 的 Token,标记 EOS 自己的标识是"eosio.token" 这个发行账号,若是在接受转帐的时候没有校验这个标识,攻击者就能用其余的账号一样发行一个名为 EOS 的 Token,对交易所或钱包进行假币充值,换取真的代币。建议交易所和钱包在处理转帐的时候,切记要严格检验各类代币各类标识,防止假币攻击。

(十七)整型溢出攻击 Integer Overflow Attack数据的存储是区块链上重要的一环。可是每一个数据类型自己是存在边界的,例如以太坊中 uint8 类型的变量就只能存储 0~255 大小的数据,超过了就存不下了。那么若是要放一个超过数据类型大小的数字会怎样呢?例如把 256 存进 uint8 的数据类型中,数据显示出来会变成 1,而不是其余数值,也不会报错,由于 uint8 自己能存一个 8 位二进制数字,最大值为 11111111,若是这个时候加 1,这个二进制数就变成了 100000001,而由于数据边界的关系,只能拿到后 8 位,也就是 00000001,那么数字的大小就变成 1 了,这种状况咱们称为上溢。有上就有下,下溢的意思就是一个值为 0 的 uint8 数据,若是这个时候对它进行减 1 操做,结果会变成该数据类型所能存储的最大值加 1 减去被减数,在这个例子中是 255,也就是该数据类型所能存储的最大值。那么若是上述两种状况发生在智能合约当中的话,恶意用户经过下溢的操做,操纵本身的账号向其余账号发送超过本身余额数量的代币,若是合约内没有对余额进行检查,恶意用户的余额就会下溢出变成一个超大的值,这个时候攻击者若是大量抛售这些代币,就能瞬间破坏整个代币的价值系统。建议全部的智能合约开发者在智能合约中对数据进行操做的时候,要严格校验数据边界,防止整形溢出攻击的发生。

(十八)条件竞争攻击 Race Condition条件竞争(Race Condition)攻击的方式不少样,可是核心的本质无非是对某个条件的状态修改的竞争。条件竞争的例子:著名的 Edgeware 锁仓合约的拒绝服务漏洞,这个漏洞问题的本质在于对新建的锁仓合约的余额的这个条件进行竞争。攻击者能够监控全部链上的锁仓请求,提早计算出锁仓合约的地址,而后向合约地址转帐,形成锁仓失败。在官方没有修复以前,要防止这种攻击,只能使用比攻击者更高的手续费让本身的锁仓交易先行打包,从而与攻击者造成竞争避免攻击。最后,官方修复方案为不对锁仓合约的余额进行强制性的相等检查,而是采用大于等于的形式,避免了攻击的发生。建议智能合约的开发者在智能合约中对某些状态进行修改的时候,要根据实际状况充分考虑条件竞争的风险,防止遭受条件竞争攻击。

(十九)越权访问攻击 Exceed Authority Access Attack和传统安全的定义同样,越权指的是访问或执行超出当前帐户权限的操做,如原本有些操做只能是合约管理员执行的,可是因为限制作得不严谨,致使关键操做也能被合约管理员之外的人执行,致使不可预测的风险,这种攻击在以太坊和 EOS 上都曾出现过屡次。以 EOS 上著名的BetDice游戏为例,因为在游戏合约内的路由(EOS 内可自定义的事件转发器)中没有对来源帐号进行严格的校验,致使普通用户能经过 push action 的方式访问到合约中的关键操做 transfer 函数,直接绕过转帐流程进行下注,从而发生了越权攻击,过后虽然BetDice官方紧急修复了代码,并严格限制了来源帐号,但这个漏洞已经让攻击者几乎无成本薅走BetDice奖池内将近 5 万 EOS。又如在以太坊使用 solidity 版本为 0.4.x 进行合约开发的时候,不少合约开发者在对关键函数编写的时候不只没有加上权限校验,也没有指定函数可见性,在这种状况下,函数的默承认见性为 public,恶意用户能够经过这些没有进行限制的关键函数对合约进行攻击。建议智能合约开发者们在进行合约开发的时候要注意对关键函数进行权限校验,防止关键函数被非法调用形成合约被攻击。

(二十)交易顺序依赖攻击 Transaction-Ordering Attack在区块链的世界当中,一笔交易内可能含有多个不一样的交易,而这些交易执行的顺序会影响最终的交易的执行结果,因为在挖矿机制的区块链中,交易未被打包前都处于一种待打包的 pending 状态,若是能事先知道交易里面执行了哪些其余交易,恶意用户就能经过增长矿工费的形式,发起一笔交易,让交易中的其中一笔交易先行打包,扰乱交易顺序,形成非预期内的执行结果,达成攻击。以以太坊为例,假如存在一个 Token 交易平台,这个平台上的手续费是经过调控合约中的参数实现的,假如某天平台项目方经过一笔交易请求调高交易手续费用,这笔交易被打包后的全部买卖Token的交易手续费都要提高,正确的逻辑应该是从这笔交易开始日后全部的 Token 买卖交易的手续费都要提高,可是因为交易从发出到被打包存在必定的延时,请求修改交易手续费的交易不是当即生效的,那么这时恶意用户就能够以更高的手续费让本身的交易先行打包,避免支付更高的手续费。建议智能合约开发者在进行合约开发的时候要注意交易顺序对交易结果产生的影响,避免合约因交易顺序的不一样遭受攻击。

(二十一)女巫攻击 Sybil Attack传闻中女巫是一个会魔法的人,一我的能够幻化出多个本身,令受害人觉得有多人,但其实只有一我的。在区块链世界中,女巫攻击(Sybil Attack)是针对服务器节点的攻击。攻击发生时候,经过某种方式,某个恶意节点能够假装成多个节点,对被攻击节点发出连接请求,达到节点的最大连接请求,致使节点没办法接受其余节点的请求,形成节点拒绝服务攻击。建议在搭建全节点的状况下,服务器须要在系统层面上对网络链接状况进行监控,一旦发现某个IP链接异常就调用脚本配置 iptables 规则屏蔽异常的 IP,同时链开发者在进行公链开发时应该在 P2P 模块中对单 IP 节点链接数量添加控制。

(二十二)假错误通知攻击 Fake Onerror Notification AttackEOS 上存在各类各样的通知,只要在 action 中添加require_recipient命令,就能对指定的账号通知该 action,在 EOS 上某些智能合约中,为了用户体验或其余缘由,通常会对onerror通知进行某些处理。若是这个时候没有对onerror通知的来源合约是不是eosio进行检验的话,就能使用和假转帐通知一样的手法对合约进行攻击,触发合约中对onerror的处理,从而致使被攻击合约资产遭受损失。建议智能合约开发者在进行智能合约开发的时候须要对onerror的来源合约进行校验,确保合约账号为eosio账号,防止假错误通知攻击。

(二十三)粉尘攻击 Dusting Attack粉尘攻击(Dusting Attack)最先发生于比特币网络当中,所谓粉尘,指的是交易中的交易金额相对于正常交易而言十分地小,能够视做微不足道的粉尘。一般这些粉尘在余额中不会被注意到,许多持币者也很容易忽略这些余额。可是因为比特币或基于比特币模型的区块链系统的帐本模型是采用 UTXO 模型做为帐户资金系统,即用户的每一笔交易金额,都是经过消费以前未消费的资金来产生新的资金。别有用意的用户,就能经过这种机制,给大量的帐户发送这些粉尘金额,令交易粉尘化,而后再经过追踪这些粉尘交易,关联出该地址的其余关联地址,经过对这些关联地址进行行为分析,就能够分析一个地址背后的公司或我的,破坏比特币自己的匿名性。除此以外,因为比特币网络区块容量大小的限制,大量的粉尘交易会形成区块的拥堵,从而使得交易手续费提高,进而产生大量待打包交易,下降系统自己的运行效率。对于如何避免粉尘攻击,能够在构造交易的过程当中,根据交易的类型,计算出交易的最低金额,同时对每一个输出进行判断,若是低于该金额,则不能继续构造该笔交易。特别的,若是这个输出恰好发生在找零上,且金额对于你来讲不太大,则能够经过舍弃该部分的粉尘输出,以充做交易手续费来避免构造出粉尘交易。其次,为了保护隐私性,建议能够在构造交易时把那些金额极小的 UTXO 舍弃掉,使用大额的 UTXO 组成交易。

(二十四)C2 攻击 C2 AttackC2 全称 Command and Control,翻译过来就是命令执行与控制,在传统的网络攻击中,在经过各类漏洞进入到目标服务器后,受限于空间,一般经过网络拉取二段 exploit 进行驻留,实现后渗透流程。因此,C2 架构也就能够理解为,恶意软件经过什么样的方式获取资源和命令,以及经过什么样的方式将数据回传给攻击者。在传统的攻击手法中,攻击者通常经过远程服务器拉取命令到本地执行,可是这种方式也有很明显的缺点,就是一旦远程服务器被发现,后续渗透活动就没法正常进行。可是区块链网络提供了一个自然且不可篡改的大型数据库,攻击者经过把攻击荷载(payload)写进交易中,并经过发送交易把该命令永久的刻在区块链数据库中。经过这种方法,即便攻击命令被发现,也没法篡改链上数据,无需担忧服务器被发现而后下线的风险。新技术不断发展,旧有的攻击手法也在随着新技术的变换而不断迭代更新。在区块链的世界中只有在各方面都作好防范,才能避免来自各方面的安全攻击。

(二十五)洗币 Money Launderin洗币和洗钱是同样的,只是对象不一样,洗钱指的是将一笔非法获得的金钱经过某些操做后变成正当、合法的收入。而洗币也是同样,指的是将非法获取的代币,如经过黑客攻击、携带用户资产跑路或经过诈骗等手段获取的代币,经过某些手段,将其来源变成正当、合法的来源。如经过交易所进行洗币、智能合约中洗币或经过某些搅拌器进行中转、经过匿名币种如门罗币,Zcash等,令非法所得的资金没法被追踪,最后成功逃过监管达到洗币的目的,而后经过把代币转换成法币离场,完成洗币的流程。建议各交易所应增强 KYC 策略,加强风控等级,及时监控交易所大资金进出,防范恶意用户经过交易所进行洗币,除此以外,能够经过与第三方安全机构进行合做,及时拦截非法资产,阻断洗钱的可能。

(二十六)勒索 Ransom勒索是传统行业中常见的攻击行为,攻击者经过向受害者主机发送勒索病毒对主机文件进行加密来向受害者进行资金勒索。随着区块链技术的发展,近年来,勒索开始呈现新的方式,如使用比特币做为勒索的资金支付手段或使用匿名性更高的门罗币做为资金支付手段。如著名的GandCrab病毒就是比特币勒索病毒,受害者须要向攻击者支付必定量的比特币换取解密私钥。经过这种勒索手段,GandCrab勒索病毒一年就勒索了超过 20 亿美金。值得一提的是,就算向攻击者发送比特币,也不必定能换取解密私钥,形成“人财两空”的局面。建议,当资产已经因勒索病毒而形成损失时,不要慌张,更不要向攻击者支付比特币或其余加密货币,同时,交易所在收到这些勒索邮件时需额外警戒,千万不能向攻击者支付比特币或其余加密货币,必要时可寻求第三方安全公司的协助。

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息