文章目录
- 一、重点名词解释
- 1.1 钱包(Wallet)
- 1.2 冷钱包(Cold Wallet)
- 1.3 热钱包 (Hot Wallet)
- 1.4 公钥(Public Key)
- 1.5 私钥(Private Key)
- 1.6 助记词(Mnemonic)
- 1.7 Keystore
- 1.8 公链(Public Blockchain)
- 1.9 交易所 Exchange
- 1.10 节点 Node
- 1.11 RPC
- 1.12 共识 Consensus
- 1.13 工作量证明PoW(Proof of Work)
- 1.14 权益证明PoS(Proof of Stake)
- 1.15 委托权益证明DPoS(Delegate Proof of Stake)
- 1.16 多签(Multi-sig)
- 1.17 软分叉(Soft-fork)
- 1.18 硬分叉(Hard-fork)
- 1.19 智能合约(Smart Contract)
- 二、攻击方法介绍
- 2.1 恶意挖矿攻击(Cryptojacking)
- 2.2 无利益攻击(Nothing at Stake Attack)
- 2.3 双花攻击(Double Spend Attack)
- 2.4 51% attack
- 2.5 异形攻击(Alien Attack)
- 2.6 钓鱼攻击(Phishing)
- 2.7 木马攻击(Trojan Horse Attack)
- 2.8 供应链攻击(Supply Chain Attack)
- 2.9 交易回滚攻击(Roll Back Attack)
- 2.10 交易排挤攻击(Transaction Congestion Attack)
- 2.11 随机数攻击(Random Number Attack)
- 2.12 hard_fail状态攻击hard_fail Attack
- 2.13 重放攻击 Replay Attack
- 2.14 重新攻击 Reentrancy Attack
- 2.15 假充值攻击 False Top-up
- 2.16 短地址攻击 Short Address Attack
- 2.17 假币攻击 Fake Token Attack
- 2.18 整形溢出攻击 Integer Overflow Attack
- 2.19 条件竞争攻击 Race Condition
- 2.20 越权访问攻击 Exceed Authority Access Attack
- 2.21 交易顺序依赖攻击 Transaction-Ordering Attack
- 2.22 女巫攻击 Sybil Attack
- 2.23 通知攻击 Fake Onerror Notification Attack
- 2.24 粉尘攻击 Dusting Attack
- 2.25 C2 攻击 C2 Attack
- 2.26 洗币 Money Launderin
- 2.27 勒索 Ransom
虽然越来越多的人参与区块链行业,但由于许多人以前没有接触过区块链,也没有相关的安全知识,安全意识薄弱,攻击者很容易有时间钻井。
面对区块链的许多安全问题,我们从两个方面介绍:解释区块链安全关键名词和攻击方法,让新手们更快适应区块链危机四伏的安全攻防世界。
一、重点名词解释
1.1 钱包(Wallet)
钱包(Wallet)数字货币钱包是一种管理私钥的工具,形式多样,但它通常包含一个软件客户端,允许用户通过钱包检查、存储和交易他们持有的数字货币。它是进入区块链世界的基础设施和重要入口。
1.2 冷钱包(Cold Wallet)
冷钱包(Cold Wallet)它是一种离线钱包,离线存储数字货币。用户在离线钱包上生成数字货币地址和私钥,然后保存它。冷钱包是存储数字货币而不需要任何网络,所以黑客很难进入钱包获得私钥,但它不是绝对安全的,随机数量不安全也会导致冷钱包不安全,此外,硬件损坏失也可能导致数字货币损失,所以需要备份密钥。
1.3 热钱包 (Hot Wallet)
热钱包(Hot Wallet)它是一种需要网络连接的在线钱包,使用起来更方便。然而,由于热钱包通常需要在线使用,个人电子设备可能会被黑客窃取,捕获钱包密码或破解加密私钥,而一些集中管理钱包并不是绝对安全的。
因此在使用集中交易所或钱包时,最好在不同的平台上设置不同的密码,并打开二次认证,以确保您的资产安全。
1.4 公钥(Public Key)
公钥(Public Key)它与私钥成对出现。它与私钥形成密钥对,并保存在钱包中。公钥由私钥生成,但不能通过公钥倒置获得。公钥可以通过一系列算法计算钱包的地址,因此可以作为拥有钱包地址的凭证。
1.5 私钥(Private Key)
私钥(Private Key)它是一系列由随机算法生成的数据。它可以通过非对称加密算法计算公共信息,并通过私钥对区块链资产进行绝对控制。因此,区块链资产安全的核心问题是私钥的存储钥匙,公钥可以计算货币的地址。私钥非常重要。作为密码,除地址所有者外,它们都被隐藏起来。区块链资产实际上是在区块链上,所有者实际上只有私钥,所有者需要安全保管。
与传统的用户名和密码形式相比,公钥和私钥交易最大的优点是提高了数据传输的安全性和完整性,由于两者之间的相应关系,用户基本上不必担心黑客在传输过程中拦截或修改数据的可能性。同时,由于私钥加密必须由其生成的公钥解密,发送者不必担心数据被他人伪造。
1.6 助记词(Mnemonic)
因为私钥是一长串毫无意义的字符,很难记住,所以有助记词(Mnemonic)。助记词是用固定算法将私钥转换成十几个常见的英语单词。助记词和私钥是互通的,可以互相转换。它只是区块链数字钱包私钥的友好格式。因此,这里强调助记词是私钥!因其明文性,不建议用电子方式保存,而是抄写在物理介质上保存。Keystore互补作为双重备份。
1.7 Keystore
Keystore主要在以太坊钱包 App 比较常见(比特币类似于以太坊)Keystore机制的是:BIP38)私钥是通过钱包密码加密的。与助记词不同,它通常可以保存在文本或 JSON 格式存储。换句话说,Keystore等同于私钥,需要用钱包密码解密。Keystore在导入钱包之前,需要使用钱包密码。当黑客盗窃时。Keystore之后,在没有密码的情况下,暴力破解是可能的Keystore密码解开Keystore,所以建议用户在设置密码时稍微复杂一些,比如带特殊字符,至少 8 以上,安全存储。
由于区块链技术的支持,区块链数字钱包的安全系数高于其他数字钱包,其中最关键的是两点:防盗和防丢失。与货币盗窃事件的多样化相比,货币丢失事件的主要原因有五种:无备份、备份丢失、忘记密码、备份错误、设备丢失或损坏。因此,当我们备份区块链数字钱包时,我们会使用私钥、助记词Keystore一定要多次备份,把丢币的风险扼杀在摇篮里。
1.8 公链(Public Blockchain)
公有链(Public Blockchain)公共链是指世界上任何人都可以随时进入共识区块链,任何人都可以发送交易并得到有效确认。公共链通常被认为是完全分散的,链上的数据是开放和透明的,不可改变的,任何人都可以通过交易或采矿读取和写入数据。一般通过代币机制(Token)来鼓励参与者竞争记账,来确保数据的安全性。
1.9 交易所 Exchange
类似于买卖股票的证券交易所,区块链交易所是数字货币交易的平台。数字货币交易所分为集中交易所和分散交易所。
去中心化交易所:交易行为直接发生在区块链上,数字货币将直接发回用户的钱包或保存在区块链上的智能合同。这种直接在链上交易的好处是,交易所不会持有大量用户的数字货币,所有的数字货币都将存储在用户的钱包或平台的智能合同中。分散交易通过技术手段分散在信任层面,也可以说不需要信任。每笔交易都通过区块链公开透明,不负责保存用户的资产和私钥。用户资金的所有权完全掌握在自己手中,具有很好的个人数据安全性和隐私性。目前,市场上所有的分散交易WhaleEx、Bancor、dYdX等。
集中交易所:目前,大多数流行的交易所都是采用集中技术的交易所。用户通常在平台上注册,并通过一系列身份认证程序(KYC)之后,你可以开始在上面交易数字货币。当用户使用集中交易所时,他们的货币交换可能不会发生在区块链上。相反,他们可能只修改交易所数据库中的资产数字。用户看到的只是账面上数字的变化。只要用户在提款时准备足够的数字货币汇出,交易所就可以汇出。目前,大多数主流交易都是在集中交易所完成的。目前,市场上的集中交易都是货币安全和火币,OKEx等。
1.10 节点 Node
在传统的互联网领域,企业的所有数据操作都集中在一个集中的服务器上,因此该服务器是一个节点。由于区块链是一个分散的分布式数据库,它由成千上万的小服务器组成。区块链网络中的每个节点都相当于存储所有区块数据的每台计算机或服务器。所有新区块的生产,以及交易的验证和会计,并通过节点同步广播到整个网络。节点分为全节点和轻节点由于整个节点都保留了整个网络数据,这意味着整个区块链网络世界仍然可以安全运行,这也是分散的魅力。
1.11 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 等钱包客户端)提供区块链上的信息。
1.12 共识 Consensus
共识算法主要是解决分布式系统中多个节点之间一致性结果的问题。分布式系统由多个服务节点共同处理事务,分布式系统中多个副本呈现的数据状态需要保持一致性。由于节点的不可靠性和节点间通信的不稳定性,甚至节点作恶和伪造信息,节点之间的数据状态不一致。多个不可靠的单个节点可以通过共识算法形成可靠的分布式系统,实现数据状态的一致性,提高系统的可靠性。
区块链系统本身作为一个大型分布式系统,但与传统的分布式系统有明显的不同。由于它不依赖任何中央权威,系统基于分散的点对点网络,分散的节点需要达成一致,即共识算法的作用,即确保所有节点遵守协议规则,确保所有交易都以可靠的方式进行。在分散的节点之间进行交易处理共识算法在区块链系统中起着最重要的作用。
区块链系统中的共识算法还承担了区块链系统中激励模型和治理模型的一些功能,以解决平等网络问题(P2P),共识算法是解决分布式系统中如何保持一致性的问题。
1.13 工作量证明PoW(Proof of Work)
PoW(Proof of Work)这是历史上第一个成功的分散区块链共识算法。工作量被大多数人所熟悉,被比特币、以太坊、莱特币等主流公共链广泛使用。
工作量证明要求节点参与者执行计算密集型任务,但其他网络参与者很容易验证。在比特币的例子中,矿工竞相将收集到的交易添加到整个网络维护的区块链账簿中,即区块。为此,矿工必须首先准确计算nonce,这是一个添加到字符串末尾的数字,用来创建一个哈希值,以满足开头特定数量的零。然而,存在大量的电力消耗和低交易吞吐量的缺点。
1.14 权益证明PoS(Proof of Stake)
PoS(Proof of Stake)——股权认证机制,一种主流的区块链共识算法,旨在使区块链中的分布式节点达成共识,常与工作量认证机制相匹配(Proof of Work)两者都被认为是区块链共识算法中的主流算法之一。作为一种算法,它通过持币人的同意达成共识,目的是确定一个新的区块,与PoW,不需要硬件和电源,效率更高。
PoS 被引入共识Stake 的概念,持币人将代币 Staking,要求所有的参与者抵押一部分他们所拥有的 Token 来验证交易,然后获得出块的机会,PoS根据持币量的比例和 的共识,通过选举算法Token 以抵押时间或其他方式选择包装块的矿工。矿工在指定高度完成包装交易,生成新区块,并通过广播区块进行广播PoS另一个共识”门槛”,验证人验证交易,验证后确认块。这样一轮PoS共识过程已经完成。股权证明通过长期绑定验证人和整个网络的利益来防止不良行为。锁定代币后,如果验证人有欺诈性交易,他们抵押的 Token 也会被削减。
1.15 委托权益证明DPoS(Delegate Proof of Stake)
委托权益证明其原型诞生于 2013年 12月 8日,Daniel Larimer 在bitsharetalk第一次,我们谈到用投票选择一个人,而不是PoS随机选举数量可能被操纵。在DPoS在这种情况下,每个货币持有人都可以投票,从而产生一定数量的代表 ,或理解为一定数量的节点或矿池,它们之间的权利完全相等。货币持有人可以通过投票随时更换这些代表,以保持链上系统的长期纯度。在某种程度上,这与国家治理或全国人大代表制度中的代议制非常相似。该系统最大的优点是解决了过度验证人造成的效率低下的问题。当然,该系统也有明显的缺点由于 的代表性系统,它一直受到集中批评。
1.16 多签(Multi-sig)
多签(Multi-sig)指需要多个签名才能执行的操作(这些签名是由不同的私钥生成的)。这可以用来提供更高的安全性,即使丢失了一个私钥,攻击者也不会获得账户的权限,许多值得信赖的各方必须同时批准更新,否则将无效。
众所周知,一般来说,一个比特币地址对应一个私钥。使用该地址中的资金需要私钥持有人签名。多重签名技术,简单来说,使用一笔资金需要多个私钥签名才能有效。多签的一个优点就是多方可以一起达成共识,才能成功支付。
1.17 软分叉(Soft-fork)
软分叉(Soft-fork)更多的时候是一种协议升级,新共识规则发布后,未升级的旧节点不会意识到代码已经改变,继续生产非法块将产生临时分叉,但新节点可以与旧节点兼容,即新节点总是在同一条链上工作。
1.18 硬分叉(Hard-fork)
硬分叉(Hard-fork)区块链发生了永久性分歧,新共识规则发布后,升级节点不能验证未升级节点产生的块,未升级节点不能验证升级节点产生的块,即新旧节点不兼容,通常发生硬分叉,原正常链分为两个链(升级链和未升级链,两个链不兼容)。
1.19 智能合约(Smart Contract)
这不是一个新概念。早在1995年,跨领域法律学者 Nick Szabo 提出:智能合同是一套以数字形式定义的承诺(Promises),包括合同参与者可以执行上述承诺的协议。在区块链领域,智能合约的本质可以说是区块链网络中运行的代码。它实现了传统合同的自动化处理,并通过计算机指令完成了用户赋予的业务逻辑。
二、攻击方法介绍
为大家提供一份来源imToken总结的钱包安全十不原则:
- 不使用未备份的钱包;
- 不使用邮件传输或存储私钥;
- 私钥不使用微信收藏或云备份存储;
- 不要截屏或拍照保存私钥;
- 不使用微信,QQ 传输私钥;
- 不要把私钥告诉身边的人;
- 不要将私钥发送到群中;
- 不使用第三方提供的未知来源钱包应用;
- 不使用他人提供的 Apple ID;
- 不要将私钥导入未知的第三方网站。
2.1 恶意挖矿攻击(Cryptojacking)
恶意挖矿攻击(Cryptojacking)是指未经授权劫持用户设备挖掘加密货币的恶意行为。通常,攻击者会劫持受害者的设备(个人 PC 或服务器)的处理能力和带宽,攻击者试图同时感染多个设备,因为加密货币挖掘需要大量的计算能力,以便收集足够的计算能力来实施这种低风险和低成本的挖掘活动。
一般恶意挖掘软件会诱导用户在电脑上加载挖掘代码,或者使用类似的网络钓鱼方法,如恶意链接、电子邮件或在网站上植入采矿脚本,使系统无意中被隐藏的加密挖掘程序感染,然后完成攻击行为。近年来,随着加密货币价格的上涨,开发了更复杂的恶意软件,使恶意挖掘攻击层出不穷。
在此,我们为防止恶意挖掘攻击提供几条建议:
1、注意设备性能和 CPU 利用率;
2、在 Web 挖矿脚本隔离插件安装在浏览器上,如MinerBlock,NoCoin和 Adblocker;
3、小心电子邮件附件和链接;
4、安装可靠的杀毒软件,保持软件应用和操作系统的最新状态。
2.2 无利益攻击(Nothing at Stake Attack)
无利益攻击(Nothing at Stake Attack),是在PoS共识机制下一个需要解决的问题的本质可以简单概括为作恶没有成本,好处无限。
当PoS共识系统分叉(Fork)当时,块节点可以在无任何损失的前提下同时在两个分叉上;无论哪个分叉被公认为主链,节点都可以获得所有收入,没有任何成本损失。这很容易给某些节点一个新的分叉、支持或启动非法交易的动力,而其他盈利节点将在多个链(窗口)上排队支持新的分叉。随着时间的推移,越来越多的分叉,非法交易,猖獗的邪恶。区块链将不再是唯一的链,所有的块节点都无法达成共识。
为了防止这种情况发生,有很多种PoS共识机制的解决办法是引入惩罚机制,对作恶节点进行经济惩罚(Slashing),建立更稳定的网络。DPoS事实上,它也是无利益攻击的解决方案之一。从上面我们可以看出DPoS该机制由持币人选择块节点来操作网络,块节点将部分奖励给投票人。
2.3 双花攻击(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、Vector76attack
Vector76 Attack 又称一次确认攻击,即交易确认后仍可回滚,是 Finney Attack 和 Race Attack 的组合。
攻击者创建了两个节点 A 连接到商家节点,节点 B 连接到区块链网络中的其他节点。然后,攻击者使用相同的 Token 发起两笔交易,一笔交易发送给商户地址,我们称之为交易 1;一笔交易发送给你的钱包地址,我们称之为交易 2。与上面提到的 Race Attack 同样,攻击者在 2 交易中增加了更高的矿工成本,从而提高了矿工的包装概率。此时,攻击者并没有在互联网上广播这两笔交易。
然后,攻击者开始挖掘 1 交易所在的分支,我们称之为 1。攻击者挖出块后,没有播出,而是同时做了两件事:在节点 A 在节点 B 上发交易 2。
由于节点 A 只连接商家节点,所以当商家节点想把交易 1 传递给其他对等节点时,连接更多节点的节点 B,交易 2 已经广播到网络中的大多数节点。因此,在概率方面,交易 2 更有可能被网络认定为有效,交易 1 被认定为无效。
2 被认为有效后,攻击者立即将他之前在分支 1 上挖掘的块广播到网络中。此时,接受确认支付的业务将确认交易成功,然后攻击者可以立即实现并转移资产。
同时,由于分支 2 连接的更多节点,所以矿工在这个分支上挖出了另一个区块,也就是分支 2 的链长大于分支 1 的链长。于是,分支 1 上的交易就会回滚,商家之前支付对攻击者的交易信息将被清除,但攻击者已经取款并实现了双花。
2.4 51% attack
攻击者拥有超过整个网络 50% 的计算能力。在攻击者控制计算能力的过程中,他可以创建一个高于原始链的新链。然后旧链中的交易将回滚,攻击者可以使用相同的 Token 向新链发送新的交易。
2.5 异形攻击(Alien Attack)
异形攻击(Alien Attack)事实上,这是一个所有公共链都可能面临的问题,也被称为地址池污染,是一种诱导类似链节点相互侵入和污染的攻击技术。漏洞的主要原因是同类链系统在通信协议中没有识别不同链的节点。
这种攻击在一些参考以太坊通信协议实现的公链上得到了复现:以太坊同类链,由于使用了兼容的握手协议,无法区分节点是否属于同个链,利用这一点,攻击者先对以太坊节点地址进行收集并进行恶意握手操作,通过跟节点握手达成污染地址池的目的,使得不同链的节点互相握手并把各自地址池里已知的节点推送给了对方,导致更多的节点互相污染,最终扩散致整个网络。遭受异形攻击的节点通常会通信性能下降,最终造成节点阻塞、主网异常等现象。相关公链应注意主网健康状态的持续监测,以免影响主网稳定性。
2.6 钓鱼攻击(Phishing)
所谓钓鱼攻击(Phishing),是指攻击者通过电子邮件、通或机构,通过电子邮件、通信软件、社交媒体等方式获取用户名、密码、私钥等私人信息。随着技术的发展,网络钓鱼攻击不仅可以托管各种恶意软件和勒索软件攻击,而且更糟糕的是,这些攻击正在上升。
建议用户通过即时通讯保持警惕 App、短信或电子邮件获得的每一条信息都需要谨慎对待。不要在通过点击链接到达的网站上输入凭证或私钥,尽可能使用硬件钱包和双因素认证(2FA),在攻击者准确告知漏洞细节之前,生态中的项目方不得将其转移给攻击者。如果项目方不能准确判断独处理,可以联系安全公司协助处理。
2.7 木马攻击(Trojan Horse Attack)
木马攻击(Trojan Horse Attack)是指具有特殊功能的恶意代码,如破坏和删除文件、发送密码、记录键盘和 DDoS 攻击等特殊功能的后门程序将控制程序寄生在被控计算机系统中,内外合,操作被感染木马病毒的计算机。它可以用来窃取用户的个人信息,甚至远程控制对方的计算机,然后通过各种方式传播或欺骗目标用户执行程序,以窃取密码和其他数据。
在区块链领域,如勒索木马、恶意挖掘木马一直是行业头疼的安全疾病,据货币世界报道,随着比特币的飙升,推动整个数字加密货币价格上涨,与货币市场密切相关的挖掘木马开始新一轮活跃,只有2019年上半年,一些新的挖掘木马家庭出现了快速、持续的更新版本,其功能设计越来越复杂,在隐藏技术、攻击技术创新方面,与软制造商的技术对抗正在强。
2.8 供应链攻击(Supply Chain Attack)
供应链攻击(Supply Chain Attack)这是一种非常可怕的攻击方式,很难完美避免防御。由于目前的软件工程,各种包/模块的依赖非常频繁和普遍,开发人员很难逐一检查。默认情况下,他们过于信任市场上流通的包管理器,这导致供应链攻击几乎成为必要的攻击之一。这种攻击被称为供应链攻击,是为了形象地表明这种攻击是一种依赖关系。链条和任何链接的感染都会导致链条后的所有链接出现问题。
供应链攻击防不胜防,不计代价,建议所有与数字加密货币相关的项目(如交易所、钱包、DApp等)应强制至少一个核心技术对所有第三方模块进行全面审查,以查看是否有可疑代码,或通过抓取包检查是否有可疑请求。
2.9 交易回滚攻击(Roll Back Attack)
交易回滚攻击(Roll Back Attack),因此,它指的是能够回滚交易的状态。回滚是什么意思?回滚是指将已发生的状态恢复到未发生的状态。然后,交易回滚意味着将已发生的交易变为未发生的状态。也就是说,攻击者已经发生了支付行动,但通过某些手段,转账过程是错误的,从而回滚整个交易过程,以达到交易回滚的目的。这种攻击方法主要发生在区块链上的智能合约游戏中。当用户的下注行动和合同的彩票行动在交易中时,即内部交易。攻击者可以通过交易发生时检测智能合同的某些状态,了解彩票信息,并根据彩票信息选择是否回滚下注交易。
建议开发者不要将用户的赌注和彩票放在同一交易中,以防止攻击者通过检测智能合同中的彩票状态来实现交易回滚攻击。
2.10 交易排挤攻击(Transaction Congestion Attack)
交易排挤攻击(Transaction Congestion Attack)是针对 EOS 使用 defer 开奖游戏合同的攻击手法,攻击者可以通过某种手段在游戏合同中 defer 发送大量 defer 交易,恶意侵占块内 CPU 资源使本应在指定区块内执行的 资源defer 由于资源不足,彩票交易无法执行,只能在下一个区块执行。因为很多 EOS 游戏智能合约使用区块信息作为智能合约本身的随机数量,同一 defer 不同区块内彩票交易的执行结果不同。这样,攻击者在得知自己无法中奖时,会发送大量 defer 交易迫使智能合同重新开奖,以达到攻击目的。
建议智能合同开发者不要使用不同块执行结果的关键操作 defer 交易降低了合同攻击的风险。
2.11 随机数攻击(Random Number Attack)
随机数攻击(Random Number Attack),是攻击智能合约的随机数生成算法,预测智能合约的随机数。目前,区块链上的许多游戏都使用链信息(如区块时间、未来区块哈希等)作为游戏合同的随机数源,也被称为随机数种子。使用这种随机数种子产生的随机数称为伪随机数。伪随机数不是真正的随机数,而是可以预测的。当使用可预测的随机数种子生成随机数时,一旦攻击者猜测或通过反向等方式获得随机数生成算法,攻击者可以根据随机数生成算法预测游戏的随机数,实现随机数预测,达到攻击目的。
建议智能合同开发者不要使用不安全的随机数种子来生成随机数,以降低合同攻击的风险。
2.12 hard_fail状态攻击hard_fail Attack
hard_fail是什么?简单来说,有错误但没有使用错误的处理器(error handler)处理错误,如使用onerror如果没有捕获处理,onerror捕获,就会hard_fail。EOS 上的交易状态记录分为 executed,soft_fail,hard_fail,delayed 和 expired 这5 状态,通常大多数人在链上观察到的交易都是 executed ,或 delayed ,没有失败的交易,导致大多数开发者误以为 EOS 链上没有失败的交易记录,因此忽略了对交易状态的检查。攻击者利用这个细节攻击链上的游戏或交易所,构建执行状态hard_fail交易,欺骗链上游戏或交易所进行假充值攻击,从而获利。
提醒交易所和 EOS DApp在处理转账交易时,游戏开发者需要严格检查交易状态,以确保交易执行状态为 executed。
2.13 重放攻击 Replay Attack
重放攻击(Replay Attack),重放区块链上的交易信息。一般来说,为了保证不被篡改,防止双花攻击,区块链会对交易进行各种验证,包括交易时间戳。nonce,交易 id 等等,但随着各种分散交易所的兴起,越来越多的场景验证了用户在智能合同中的交易。这种场景通常需要用户签署信息并上传到智能合同,然后在合同内进行验证。然而,由于用户的签名信息将被链接起来,也就是说,每个人都可以获得用户的签名信息。当用户在合同中验证签名时,如果签名信息不随交易次数而变化,如时间戳,nonce 等等,攻击者可以拿着用户的签名,伪造用户发起交易,从而获利。
这是最早出现的一种DApp在生态早期的攻击形式中,由于开发者设计的彩票随机算法存在严重缺陷,攻击者可以利用合同漏洞重复彩票,这是开发者更容易忽视的错误。开发者在链上验证签名时,需要在签名信息中添加各种可变因素,防止攻击者重新放置链上签名,造成资产损失。
2.14 重新攻击 Reentrancy Attack
重入攻击(Reentrancy Attack)以太坊首次出现,相应的真实攻击是 The DAO 攻击,此次攻击还导致了原来的以太坊分叉成以太经典(ETC)和现在的以太坊(ETH)。由于项目方采用的转账模式是先将转账发送给用户,然后修改用户的余额状态,恶意用户可以构建恶意合同,并在接受转账时再次调用项目方的转账函数。使用这种方法,用户的余额状态没有改变,但总是可以提取项目方的资金,最终导致项目方的资金消耗。
提醒智能合约开发人员,在处理转账等关键操作时,如果用户的资本状态存储在智能合约中,首先修改资本状态,然后进行实际的资本转账,以避免重新攻击。
2.15 假充值攻击 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。
2.16 短地址攻击 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 的个数。通过这种方式,攻击者就能对交易所或钱包进行攻击,盗窃交易所和钱包的资产。
建议交易所和钱包在处理转账时严格检查转账地址,防止短地址攻击。
2.17 假币攻击 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,用假币充值交易所或钱包,换取真币。
建议交易所和钱包在处理转账时,记得严格检查各种代币和标志,防止假币攻击。
2.18 整形溢出攻击 Integer Overflow Attack
数据存储是区块链的重要组成部分。但是每种数据类型本身都有边界,比如以太坊 uint8 变量只能储存 0~如果超过255 大小的数据,就不能存储。那么,如果你想放一个超过数据类型大小的数字呢?例如,将 256 存储在 中uint在8 的数据类型中,数据显示会变成 1,而不是其他值,因为 uint8 本身可以节省一个 8 位二进制数字,最大值为 1111111。如果此时添加 1,则二进制数变为 1万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万,那么数字的大小就变成了 万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万,这种情况我们称之为 万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万一,那么万万万万万万万万万万万万万万万一,那么万万万万万万万万万万万万万万万万万万一,那么万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万万一,那么万万一,那么万万万万万万万万万万万万一,这个 ,万一万一万一万一,万一万一万一,万一万一万一,万一万一万一,万一万一万一万一万一万一万一万一万一万一万一万一万一万一万一万一万一,万一,万一,万一,万一万一万一万一万一万一,万一,万一,万一,万一万一,万一万一万一万一万一万一万一万一万一,万一,万一,万一万一万一万一万一uint8 数据,如果此时降低 1 操作,结果将成为数据类型中可存储的最大值加 1 减去减数。在这个例子中, 255是数据类型中可存储的最大值。因此,如果上述两种情况发生在智能合同中,恶意用户将通过溢出操作,操纵您的帐户将超过您余额的代币发送到其他帐户。如果合同中没有检查余额,恶意用户的余额将溢出到一个超大值。此时,如果攻击者大量出售这些代币,以立即破坏整个代币的价值系统。
建议所有智能合约开发人员在智能合约中操作数据时,严格检查数据边界,防止整形外科溢出攻击。
2.19 条件竞争攻击 Race Condition
条件竞争(Race Condition)攻击的方式有很多种,但核心的本质只不过是修改某种条件状态的竞争。条件竞争的例子:著名的 Edgeware 锁仓合同拒绝服务漏洞的本质是竞争新锁仓合同余额的条件。攻击者可以监控所有链上的锁仓请求,提前计算锁仓合同的地址,然后将其转移到合同地址,导致锁仓失败。在官方修复之前,为了防止这种攻击,只能使用比攻击者更高的手续费,让他们的锁仓交易先打包,从而与攻击者竞争,避免攻击。最后,官方修复计划不强制等待锁仓合同余额,而是以大于等于的形式避免攻击。
建议智能合同的开发者在修改智能合同中的某些状态时,应根据实际情况充分考虑条件竞争的风险,防止条件竞争的攻击。
2.20 越权访问攻击 Exceed Authority Access Attack
和传统的安全定义一样,越权是指访问或执行超出当前账户权限的操作。例如,有些操作只能由合同管理员执行,但由于限制不严格,关键操作也可以由合同管理员以外的人执行,导致不可预测的风险。以太坊和 EOS 上出现过很多次。
以 EOS 上着名的BetDice以游戏为例,因为游戏合同中的路由(EOS 可定制的事件转发器)没有严格检查源账户,导致普通用户可以通过 push action通过访问合同中的关键操作 transfer 函数直接绕过转账流程下注,导致越权攻击,事后虽然BetDice官方紧急修复了代码,并严格限制了源账户,但这个漏洞几乎没有成本BetDice近5 万 EOS。另一在以太坊使用 solidity 版本为 0.4.x 在开发合同时,许多合同开发人员不仅没有在编写关键函数时添加权限验证,而且没有指定函数的可见性。在这种情况下,默认函数的可见性为 public,恶意用户可以通过这些无限制的关键函数攻击合同。
建议智能合同开发者在开发合同时注意权限验证关键函数,防止非法调用关键函数攻击合同。
2.21 交易顺序依赖攻击 Transaction-Ordering Attack
在区块链的世界里,一笔交易可能包含多个不同的交易,这些交易的执行顺序会影响最终交易的执行结果,因为在挖掘机制的区块链中,在包装之前,交易是一种待包装的 pending 状态,如果你能提前知道交易中执行了哪些其他交易,恶意用户可以通过增加矿工成本来发起交易,让交易中的一个交易先打包,扰乱交易顺序,造成意想不到的执行结果,实现攻击。以太坊为例,如果有 Token 交易平台上的手续费是通过调整合同中的参数来实现的。如果平台项目方有一天通过交易请求提高交易费用,交易包装后的所有交易Token提高交易费用。正确的逻辑应该是从这笔交易开始后的所有 Token 交易费用应增加,但由于交易从发行到包装有一定的延迟,要求修改交易费用的交易不立即生效,恶意用户可以先收取更高的费用,避免支付更高的费用。
建议智能合同开发者在开发合同时注意交易顺序对交易结果的影响,避免因交易顺序不同而受到攻击。
2.22 女巫攻击 Sybil Attack
据说女巫是个会魔法的人。一个人可以幻化多个自己,让受害者觉得有多少人,但其实只有一个人。在区块链世界,女巫攻击(Sybil Attack)攻击服务器节点。当攻击发生时,恶意节点可以伪装成多个节点,对攻击节点发出链接请求,以达到节点的最大链接请求,导致节点无法接受其他节点的请求,导致节点拒绝服务攻击。
建议服务器在构建全节点时,需要在系统层面监控网络连接,一旦发现某个节点IP异常连接调用脚本配置 iptables 常规屏蔽异常 IP,同时,链开发者在开发公链时应该是 P2P 模块中对单 IP添加控制 节点连接数量。
2.23 通知攻击 Fake Onerror Notification Attack
EOS 上有各种通知,只要 action 中添加require_recipient命令可以通知指定账户 action,在 EOS 在一些智能合同中,为了用户体验或其他原因,通常是onerror处理一些通知。如果此时没有onerror通知的来源合同是否为eosio如果进行检查,您可以使用与虚假转账通知相同的方法攻击合同,并在合同中触发合同onerror因此,被攻击合同资产遭受损失。
建议智能合约开发者在开发智能合约时需要onerror验证来源合同,确保合同账户为eosio防止虚假通知攻击。
2.24 粉尘攻击 Dusting Attack
粉尘攻击(Dusting Attack)最早发生在比特币网络中,所谓的灰尘是指交易金额与正常交易相比非常小,可以被视为微不足道的灰尘。通常这些灰尘不会在余额中被注意到,许多货币持有者很容易忽略这些余额。但由于比特币或基于比特币模型的区块链系统的账本模型是 UTXO 模型作为一个账户基金系统,即用户的每笔交易金额都是通过消费之前未消费的基金来产生新的基金。别有用心的用户可以通过这种机制将这些粉尘金额发送到大量账户,粉尘交易,然后跟踪这些粉尘交易,关联地址的其他相关地址。通过对这些相关地址的行为分析,比特币匿名性本身。此外,由于比特币网络块容量的限制,大量的粉尘交易会导致块拥堵,从而增加交易费用,然后产生大量的包装交易,降低系统本身的运行效率。
对于如何避免粉尘攻击,可以在构造交易的过程中,根据交易的类型,计算出交易的最低金额,同时对每个输出进行判断,如果低于该金额,则不能继续构造该笔交易。特别的,如果这个输出刚好发生在找零上,且金额对于你来说不太大,则可以通过舍弃该部分的粉尘输出,以充作交易手续费来避免构造出粉尘交易。其次,为了保护隐私性,建议在构造交易中使用金额极小的 UTXO 放弃,用大量 UTXO 组成交易。
2.25 C2 攻击 C2 Attack
C2 全称 Command and Control,翻译是命令执行和控制。在传统的网络攻击中,通过各种漏洞进入目标服务器后,受到空间的限制,通常通过网络拉出两段 exploit 停留,实现后渗透过程。C2 架构可以理解为恶意软件如何获取资源和命令,以及如何将数据返回给攻击者。在传统的攻击技术中,攻击者通常通过远程服务器将命令拉到当地执行,但这种方法也有一个明显的缺点,即一旦发现远程服务器,后续的渗透活动就不能正常进行。但区块链网络提供了一个自然和不可篡改的大型数据库,攻击者通过攻击负载(payload)写入交易,并将命令永久刻在区块链数据库中。这样,即使发现了攻击命令,也不能篡改链上的数据,也不必担心服务器被发现并离线的风险。
随着新技术的不断发展,旧的攻击技术也在不断迭代和更新。在区块链的世界里,只有防范各方面,才能避免各方面的安全攻击。
2.26 洗币 Money Launderin
洗钱和洗钱是一样的,但对象是不同的。洗钱是指通过某些操作将非法获得的资金转化为合法和合法的收入。洗钱也是如此。它是指通过黑客攻击、携带用户资产逃跑或欺诈等手段获得的非法代币,并通过某些手段将其来源转化为合法和合法的来源。例如,通过交易所、智能合同或一些搅拌机、门罗币等匿名货币,Zcash等等,使非法收入的资金无法跟踪,最终成功逃避监管,达到洗币的目的,然后将代币转换为法币,完成洗币过程。
建议各交易所加强 KYC 战略,提高风险控制水平,及时监控交易所大资金进出,防止恶意用户通过交易所洗钱。此外,他们还可以与第三方安全机构合作,及时拦截非法资产,阻止洗钱的可能性。
2.27 勒索 Ransom
勒索是传统行业中常见的攻击行为。攻击者通过向受害者主机发送勒索病毒来加密主机文件,向受害者勒索资金。随着区块链技术的发展,勒索近年来开始呈现出一种新的方式,如使用比特币作为勒索的资本支付手段或使用匿名门罗币作为资本支付手段。就像名字一样GandCrab病毒是比特币勒索病毒,受害者需要向攻击者支付一定数量的比特币,以换取解密私钥。通过这种勒索,GandCrab勒索病毒一年勒索了20多亿美元。值得一提的是,即使比特币发送给攻击者,也可能无法交换解密私钥,导致人与财的局面。
建议当资产因勒索病毒而损失时,不要惊慌,更不用说向攻击者支付比特币或其他加密货币,同时,交易所收到这些勒索邮件需要额外警惕,不得向攻击者支付比特币或其他加密货币,必要时可以向第三方安全公司寻求帮助。