区块链安全问题有哪些(区块链领导干部读本修订版)

摆账网 知识与问答 2024-11-15 08:13:14

来自:国家信息安全服务资质

一、关键术语解释

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

(2)冷钱包冷钱包(Cold Wallet)是一种离线钱包,与网络断开连接,离线存储数字货币。用户在离线钱包上生成数字货币地址和私钥,然后保存它。冷钱包存储的是数字货币,没有任何网络,黑客很难访问钱包获取私钥,但也不是绝对安全的。不安全的随机数也会让冰冷的钱包变得不安全。此外,硬件损坏和丢失也可能造成数字货币的丢失,因此有必要对密钥进行备份。

(3)热钱包热钱包是一种需要网络连接,使用更方便的在线钱包。但是,由于热门钱包一般需要在线使用,个人电子设备可能被黑客窃取,或者钱包密码或加密私钥可能因钓鱼网站延迟而被破解,一些集中管理的钱包也不是绝对安全的。

所以在使用集中交易所或者钱包的时候,最好在不同的平台设置不同的密码,并开通二次认证,保证自己的资产安全。

(4)公钥(Public Key)公钥与私钥成对出现,与私钥形成密钥对,存放在钱包中。公钥是由私钥生成的,但私钥是无法通过公钥反向获得的。公钥可以通过一系列算法得到钱包的地址,因此可以作为凭证拥有钱包地址。

(5)私钥私钥是随机算法产生的一串数据,可以通过非对称加密算法计算出公钥,通过私钥对区块链的资产拥有绝对控制权。因此,区块链资产安全的核心问题在于私钥的存储密钥,公钥可以重新计算货币的地址。私钥非常重要。作为密码,除了地址的所有者之外,它是隐藏的。区块链资产实际上在区块链上,所有者实际上只拥有私钥,所以所有者需要保证它的安全。与传统形式的用户名和密码相比,使用公钥和私钥进行交易的最大优势在于提高了数据传输的安全性和完整性。由于它们之间的对应关系,用户基本上不用担心数据在传输过程中被黑客截取或修改的可能性。同时,由于私钥加密必须由其生成的公钥解密,发送方也不必担心数据被他人伪造。

(6)记忆法。因为私钥是一长串无意义的字符,很难记住,所以出现了助记符。Memorials是使用固定的算法将私钥转换成十多个常见的英文单词。内存和私钥是可互操作的,并且可以相互转换。它只是区块链数字钱包私钥的友好格式。所以在这里强调一下:助记符是私钥!因为是明文,所以不建议电子保存,而是复制保存在物理介质上。它和密钥库作为双重备份相互补充。

(七)KeystoreKeystore主要常见于以太坊钱包App(比特币类似于以太坊Keystore机制:BIP38)。它是通过钱包密码对私钥重新加密得到的。与助记符不同,它一般可以保存为文本或JSON格式。换句话说,在密钥库等同于私钥之前,需要用wallet密码对其进行解密。因此,密钥库需要与wallet口令一起使用才能导入wallet。当黑客窃取密钥库时,可以在没有密码的情况下,通过暴力破解密钥库密码来解锁密钥库。所以建议用户在设置密码时稍微复杂一点,比如取至少8位的特殊字符,安全存储。

得益于区块链科技的加持,区块链数字钱包的安全系数高于其他数字钱包,其中两个关键点是:防盗和防丢。相对于硬币被盗原因的多样性,硬币丢失的原因主要有五种:没有备份、备份丢失、忘记密码、备份错误、设备丢失或损坏。因此,在备份区块链数字钱包时,我们必须对私钥、助记符和密钥库进行多次备份,以便将丢失硬币的风险扼杀在萌芽状态。

图片来自imToken粉丝活动分享

为您提供imToken总结的钱包安全“十不原则”:

1.不要使用没有备份的钱包;

2.不要使用邮件传输或存储私钥;

4.不要截图或拍照保存私钥;

5.不使用微信、QQ传输私钥;

6.不要把私钥告诉身边的人;

7.不要将私钥发送给该组;

9.不要用苹果ID;由他人提供;

10.不要将私钥导入未知的第三方网站。

(八)公共区块链公共区块链(简称公链)是指世界上任何人都可以随时访问阅读,任何人都可以发送交易并得到有效确认的共识区块链。公链一般被认为是完全去中心化的,链中的数据是公开、透明、不可更改的。任何人都可以通过交易或挖掘来读写数据。一般通过令牌机制鼓励参与者竞争记账,以保证数据的安全性。

(九)交易所交易所类似于买卖股票的证券交易所。区块链交易所是数字货币的交易平台。数字货币交易所分为集中式交易所和分散式交易所。去中心化交换:交易行为直接发生在区块链,数字货币会直接发回用户的钱包或者存储在区块链的智能合约。直接在链上交易的好处是交易所不会持有用户的大量数字货币,所有的数字货币都会存放在用户的钱包或者平台上的智能合约中。分散通信

易通过技术手段在信任层面去中心化,也可以说是无需信任,每笔交易都通过区块链进行公开透明,不负责保管用户的资产和私钥等信息,用户资金的所有权完全在自己手上,具有非常好的个人数据安全和隐私性。目前市面上的去中心化交易所有WhaleEx、Bancor、dYdX等。

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

(十)节点 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 种,总价值难以估计(很多代币还未上交易所正式发行)。

区块链系统本身作为一个超大规模的分布式系统,但又与传统的分布式系统存在明显区别。由于它不依赖于任何一个中央权威,系统建立在去中心化的点对点网络基础之上,因此分散的节点需要就交易的有效与否达成一致,这就是共识算法发挥作用的地方,即确保所有节点都遵守协议规则并保证所有交易都以可靠的方式进行。由共识算法实现在分散的节点间对交易的处理顺序达成一致,这是共识算法在区块链系统中起到的最主要作用。区块链系统中的共识算法还承担着区块链系统中激励模型和治理模型中的部分功能,为了解决在对等网络中(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),包括合约参与方可以在上面执行这些承诺的协议。在区块链领域中,智能合约本质可以说是一段运行在区块链网络中的代码,它以计算机指令的方式实现了传统合约的自动化处理,完成用户所赋予的业务逻辑。

二、攻击方法介绍

(一)恶意挖矿攻击(Cryptojacking)恶意挖矿攻击(Cryptojacking)是一种恶意行为,指未经授权的情况下劫持用户设备挖掘加密货币。通常,攻击者会劫持受害者设备(个人 PC 或服务器)的处理能力和带宽,由于加密货币挖掘需要大量算力,攻击者会尝试同时感染多个设备,这样他们能够收集到足够的算力来执行这种低风险和低成本的挖矿活动。一般恶意挖矿软件会诱导用户在计算机上加载挖矿代码,或通过使用类似网络钓鱼的方法,如恶意链接、电子邮件或是在网站里植入挖矿脚本等方式,使系统无意中被隐藏的加密挖矿程序感染进而完成攻击行为。近年来,随着加密货币价格的上涨,更加复杂的恶意软件被开发出来,使恶意挖矿攻击事件层出不穷。

在此我们为大家提供几条建议防范恶意挖矿攻击:1、注意设备性能和 CPU 利用率;2、在 Web 浏览器上安装挖矿脚本隔离插件,例如MinerBlock,NoCoin和 Adblocker;3、小心电子邮件附件和链接;4、安装一个值得信赖的杀毒软件,让软件应用程序和操作系统保持最新状态。

(二)无利益攻击(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)实际上是一个所有公链都可能面临的问题,又称地址池污染,是指诱使同类链的节点互相侵入和污染的一种攻击手法,漏洞的主要原因是同类链系统在通信协议上没有对不同链的节点做识别。这种攻击在一些参考以太坊通信协议实现的公链上得到了复现:以太坊同类链,由于使用了兼容的握手协议,无法区分节点是否属于同个链,利用这一点,攻击者先对以太坊节点地址进行收集并进行恶意握手操作,通过跟节点握手达成污染地址池的目的,使得不同链的节点互相握手并把各自地址池里已知的节点推送给了对方,导致更多的节点互相污染,最终扩散致整个网络。遭受异形攻击的节点通常会通信性能下降,最终造成节点阻塞、主网异常等现象。相关公链需要注意持续保持主网健康状态监测,以免出现影响主网稳定的攻击事件出现。

(七)供应链攻击(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,但是用户又确实得到了真实的充值记录,在这种情况下,用户就可以在没有真正充值的情况下从智能合约或交易所中用假资产或不存在的资产窃取真实资产。

(十五)短地址攻击 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 锁仓合约的拒绝服务漏洞,这个漏洞问题的本质在于对新建的锁仓合约的余额的这个条件进行竞争。攻击者可以监控所有链上的锁仓请求,提前计算出锁仓合约的地址,然后向合约地址转账,造成锁仓失败。在官方没有修复之前,要防止这种攻击,只能使用比攻击者更高的手续费让自己的锁仓交易先行打包,从而与攻击者形成竞争避免攻击。最后,官方修复方案为不对锁仓合约的余额进行强制性的相等检查,而是采用大于等于的形式,避免了攻击的发生。建议智能合约的开发者在智能合约中对某些状态进行修改的时候,要根据实际情况充分考虑条件竞争的风险,防止遭受条件竞争攻击。

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

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

(二十三)粉尘攻击 Dusting Attack粉尘攻击(Dusting Attack)最早发生于比特币网络当中,所谓粉尘,指的是交易中的交易金额相对于正常交易而言十分地小,可以视作微不足道的粉尘。通常这些粉尘在余额中不会被注意到,许多持币者也很容易忽略这些余额。但是由于比特币或基于比特币模型的区块链系统的账本模型是采用 UTXO 模型作为账户资金系统,即用户的每一笔交易金额,都是通过消费之前未消费的资金来产生新的资金。别有用意的用户,就能通过这种机制,给大量的账户发送这些粉尘金额,令交易粉尘化,然后再通过追踪这些粉尘交易,关联出该地址的其他关联地址,通过对这些关联地址进行行为分析,就可以分析一个地址背后的公司或个人,破坏比特币本身的匿名性。

除此之外,由于比特币网络区块容量大小的限制,大量的粉尘交易会造成区块的拥堵,从而使得交易手续费提升,进而产生大量待打包交易,降低系统本身的运行效率。对于如何避免粉尘攻击,可以在构造交易的过程中,根据交易的类型,计算出交易的最低金额,同时对每个输出进行判断,如果低于该金额,则不能继续构造该笔交易。特别的,如果这个输出刚好发生在找零上,且金额对于你来说不太大,则可以通过舍弃该部分的粉尘输出,以充作交易手续费来避免构造出粉尘交易。其次,为了保护隐私性,建议可以在构造交易时把那些金额极小的 UTXO 舍弃掉,使用大额的 UTXO 组成交易。

(二十四)C2 攻击 C2 AttackC2 全称 Command and Control,翻译过来就是命令执行与控制,在传统的网络攻击中,在通过各种漏洞进入到目标服务器后,受限于空间,通常通过网络拉取二段 exploit 进行驻留,实现后渗透流程。所以,C2 架构也就可以理解为,恶意软件通过什么样的方式获取资源和命令,以及通过什么样的方式将数据回传给攻击者。在传统的攻击手法中,攻击者一般通过远程服务器拉取命令到本地执行,但是这种方式也有很明显的缺点,就是一旦远程服务器被发现,后续渗透活动就无法正常进行。

但是区块链网络提供了一个天然且不可篡改的大型数据库,攻击者通过把攻击荷载(payload)写进交易中,并通过发送交易把该命令永久的刻在区块链数据库中。通过这种方法,即使攻击命令被发现,也无法篡改链上数据,无需担心服务器被发现然后下线的风险。新技术不断发展,旧有的攻击手法也在随着新技术的变换而不断迭代更新。在区块链的世界中只有在各方面都做好防范,才能避免来自各方面的安全攻击。

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

相关问答:

相关问答:交易回滚是什么意思?

  以太坊发生过这种事,当时一个大型交易所被黑客黑了,盗走一大笔以太坊。然后交易所联合几个以太坊矿池,依靠算力优势,告诉社区内的以太坊用户强行忽略前两个区块的新交易,从倒数第三个区块开始继续交易。

  这样交易记录就被滚回N分钟前,让黑客偷盗以太坊的交易被认为非法了,但这是非常严重的信用危机事件,比特币最初就千方百计想避免这种占有51%算力的问题,以太坊却因为大玩家为了挽回自己损失强行滚回。

  但是交易滚回,只是以太坊分区内一部分成员承认,不承认的继续按照原始链走,承认的按照新链走,彼此互相不承认,以太坊从此分裂成以太币ETC和以太坊ETH两种货币,就是所谓的硬分叉。

  不过以太坊作为第一个以智能合约为特色的数字货币,还是有其价值的。比特币因为是第一个区块链技术的数字货币,会过分强调安全性的,短期内不会涉足智能合约的特性。相对于莱特币这种机制超像比特币,仅仅提升了结算速度的货币来说,以太坊的特性大概率会在将来占有一席之地。而莱特币则很难说会有同样光明的前途。

上一篇:华融湘江闪贷具体要求(光大银行长沙分行领导班子)

下一篇:平安寿险电话95511(中国平安保险电话人工服务)