作者:Abba garba,weblock首席技术官
翻译:郝
区块链是一种新的分布式系统架构,它利用P2P对等通信、块存储、分布式算法共识和加密算法来防止篡改。
从本质上讲,区块链可以看作是一个由所有网络节点维护的分布式数据库。与传统的分布式数据库相比,区块链具有完整的数据备份、开放透明的网络、不可篡改、完整的信息可追溯性和弱信任模,更适合对去中心化信任有明确要求的应用场景。
特别是典的区块链应用场景包括数字支付、产品溯源、版权保护、供应链金融等,在区块链系统中,智能合约对分布式应用部署的实现和应用功能的扩展起着极其重要的作用。
与传统应用相比,运行在区块链体系结构上的智能合约具有开放、透明、可执行、不篡改、不依赖第三方等特点,能够满足各种去中心化应用场景的需求,包括近年来去中心化金融(DeFi)项目的快速发展。
截至2021年1月15日,去中心化金融已成为一种成功的金融模式,拥有超过45亿美元的资本。它采用基于区块链的智能合约来保证其完整性和安全性。
去中心化金融是交换、借贷代币的一个新的发展领域。一般来说,这些指令由智能合约(而不是单一的中心化法人或个人)和/或“收入”或由多方去中心化治理机制(如Dao)控制的收入流进行监管。去中心化金融(DeFi)-出现在现有区块链平台上。
这个新领域的组成部分包括贷款、资产交易和衍生品市场。智能合约作为一种去中心化的应用,管理着大量的数字资产,容易受到各种攻击。
本文从三个方面对智能合约的安全性进行了探讨:首先,智能合约的安全性是由以太坊体系结构各层的脆弱性所引起的。其次,我们还将讨论最近针对DeFi和智能合约的各种攻击。
**,我们将探讨现有可行的工具和其他有效的做法,以尽量减少此类攻击。
以太坊体系结构不同层次智能合约的脆弱性
以太坊体系结构概述
在讨论智能合约的脆弱性之前,让我们简要概述一下以太坊智能合约的体系结构。
区块链网络可以自动部署和执行编程脚本任务。这些程序称为智能合约,用于定义在事务期间调用的自定义函数和规则。基于智能合约的区块链技术已经应用于金融、供应链管理、医疗、能源、政府服务等各个行业。
只有特定的区块链平台支持智能合约:以太坊是第一个支持智能合约的平台。其他区块链平台(如EOS、lisk、比特币和hyperledger fabric)与部署和执行智能合约兼容。
一种称为SOLidity的脚本类语言用于在以太坊平台上开发智能合约。在这一部分中,我们介绍了在以太坊平台上实现智能合约的安全漏洞。智能合约可以持有和管理相应的功能credit(address){大量可能价值数千美元的虚拟货币。
因此,反对者不断试图操纵智能合约的执行来支持他们的活动。本质上,智能合约运行在分布式和未经授权的网络上,这些网络继承了许多漏洞。在传统系统中,这一小部分中心化式应用程序可以重新开发或修补。
相反,在去中心化的区块链网络中,除非采取极端措施,否则部署的智能合约在实时网络中无法修改或升级。智能合约不变的特点是其安全性的优缺点。由于这种不变性,黑客不能为了自己的利益更改或修改合同。
但是,开发人员不能在部署后修改智能合约应用程序。他们可以取消或终止合约,创建新的智能合约,然后再次部署。因此,为了安全起见,我们应该在部署智能合约之前对其进行大规模的测试。我们关注以太坊智能合约体系结构的基本构建块,如图1所示,包括以太坊的体系结构。
比特币图1:用于运行以太坊区块链的环境是通过web用户界面、应用层、用于存储区块链数据的数据库、用于支持共识协议的加密机制以及用于应用程序的Internet服务与以太坊体系结构服务的四个层进行交互网络层[20]。
a、 应用层:以太坊客户端在EVM中执行智能合约,智能合约与以太坊账号关联。以太坊支持两种类的账户:外部所有权账户(EOA)和合同账户。EOA用于将用户资金存入魏,魏是以太坊的最小面额,价值10-18以太坊。
EOA与公钥相关联,由公钥求解;通过显示相应私钥的所有权来验证对EOA的访问。相反,契约帐户与可执行字节码(即智能契约)相关联,后者定义了一些有趣的业务逻辑。智能合约是DAPP的基石。
DAPP通常使用用户界面作为前端,一些智能合约作为后端。一些dapp发行自己的加密货币,称为代币,用于初始代币发行(ICO)和交换。基于以太坊的代币是一种特殊的智能合约(如ERC-20)[20]。
智能合约是在EVMS中执行的,EVMS是使用基于堆栈的体系结构的准图灵完备机器。术语“准”是指执行受到交易提供的气体的限制。在以太坊的应用层中,出现了各种漏洞,导致了许多攻击,如应用层的图所示。
b、 数据层:包含区块链数据结构。交易是一个EOA(称为发送方)和另一个EOA或合同账户(称为接收方)之间的交互。交易由以下人员指定:
(i) Nonce,用于跟踪发送方发起的事务总数;
(二) 指定交易目标意向书或合同账户的收件人;
(三) 价值,即从发送方转移到收款方的金额(如适用);以及;
(四) 输入,是与交易目的相对应的字节码或数据;
(v) Gasprice和gaslimit分别指定发送方愿意向包含交易的区块的中标矿工支付的单价和**气量;
(六) (V,R,s),这是发件人的ECDSA签名。执行交易会更新相关账户的状态,从而更新区块链。
c、 共识层:确保区块链状态一致。在编写时,以太坊创建一个块大约需要12-14秒,这意味着多个矿工可以同时创建有效块,并且可能有许多块。
以太坊使用ghost共识协议的一个变体来选择“最重”的分支作为主链,其中“最重”的分支扎根于所讨论的分支的子树中,并且具有**的累积块难度。同时,需要注意的是,旧块不在主链上。但是请注意,以太坊将其当前使用的工作证明(POW)替换为权益证明(POS)。
d、 网络层:管理节点或客户端的以太坊点对点(P2P)网络,使节点始终可以从一些活动节点获取区块链的更新状态。
以太坊网络是一个结构化P2P网络,其中每个节点(客户端)存储整个区块链的副本。对于节点发现和路由,每个节点维护一个动态路由表,其中包含160个bucket。每个bucket最多包含16个其他节点id、IP地址和UDP/TCP端口条目。
以太坊使用rlpx协议发现目标客户机,并使用以太坊有线协议促进以太坊区块链客户机之间的信息交换(如事务、块)。
e、 以太坊区块链环境:它运行在以下四层:用户与以太坊区块链交互的web界面;存储区块链数据的以太坊客户数据库;出于安全目的的加密机制;以及支持以太坊节点之间区块链通信的互联网基础设施。
我们将以太坊区块链架构与环境区分开来,因为针对以太坊区块链的攻击可能来自环境,而这些攻击可能在环境中得到更好的解决,而不是通过以太坊。
1以太坊智能合约漏洞
本文主要研究以太坊系统各层智能合约的脆弱性,如图2所示。
A660202图2:以太坊各层漏洞分类
以太坊应用层:
重入:此漏洞最初是在Dao攻击[1]中发现的,当时外部被叫方协定位于
当在用户约定完成之前调用调用方约定中的回调函数时(即某种意义上的循环调用),就会出现此漏洞。这使得攻击者可以绕过适当的有效性检查,直到调用方契约耗尽或事务耗尽。
委托呼叫注入:首先,该漏洞是在奇偶钱包攻击中发现的[2]。为了促进代码重用,EVM提供了一个操作码委托调用,将被调用方协定的字节码插入到调用方协定的字节码中。
结果恶意的被调用方契约可以直接修改(或操纵)调用方契约的状态变量。此漏洞是由于被调用方协定可以更新调用方协定的状态变量造成的。声明的目的是通过委托将无状态契约调用为库共享,完全可以防止这种漏洞。
冻结以太网:**在奇偶钱包攻击中发现此漏洞[3]。已创建此漏洞
因为用户不能把钱存入他们的合同账户,也不能从这些账户上花钱,他们的资金实际上被冻结了。
升级合约:引入合约升级的思想,缓解智能合约一旦部署就无法修改的问题,即使以后发现有漏洞。为了实现合同的升级,有两种方法:(1)将合同分为**合同和逻辑合同,使开发人员可以对**合同和逻辑合同进行升级;(2)使用注册机构合同保存更新后的合同。尽管这些方法是有效的,但它们引入了一个新的漏洞:当合同开发者变得恶意时,更新的合同可能是恶意的。此漏洞(即不安全的联系人更新)仍然是一个未决问题。
意外恢复的拒绝服务:造成这种情况的原因是,由于主叫方的合同在外部呼叫中失败而恢复了事务,或者被叫方的合同故意执行恢复操作以中断主叫方合同的执行。此漏洞是由执行被调用方协定还原的调用方协定引起的。通过让接收方调用事务来“提取”发送方为接收方保留的资金,可以防止此漏洞,从而有效防止发送方的事务被恢复。
整数溢出和下溢:此漏洞是在针对BEC代币的攻击中**发现的[4]。当操作的结果超出实体数据类的范围时,会发生这种情况,例如未经授权操纵攻击者的平衡或其他状态变量。该漏洞是由于固态源代码没有对数字输入执行正确的验证,并且固态编译器和EVM都没有提供整数溢出/下溢检测。通过使用safemath库处理这些问题,可以防止此漏洞。
平衡操纵:当契约的控制流决策依赖于此值时,就会出现此漏洞。平衡或平衡,攻击者可以利用它使自己成为唯一一个谁可以得到钱。通过在任何条件语句中不使用契约余额[5],可以防止此漏洞。
领养德克萨斯州起源要进行身份验证:德克萨斯州起源是一个全局变量,表示启动有问题事务的原始EOA。使用合同时德克萨斯州起源此漏洞发生在授权期间,可能会受到网络钓鱼攻击的危害。通过使用邮件发件人而不是德克萨斯州起源身份验证可以防止此漏洞,因为邮件发件人返回导致此消息的帐户。
错误可见性:未正确指定功能的可见性以允许未经授权的访问。
无保护自杀:合同所有人(或委托的第三方)可以通过自杀或自毁的方式销毁合同。当合同取消时,相关的字节码和存储器将被删除。该漏洞是由于合同执行的身份验证不足造成的。例如,可以通过实施多因素身份验证来缓解此漏洞,这意味着自杀操作必须得到多方的批准。
以太坊泄漏到任何地址:当任何呼叫者可以提取合同资金时,该漏洞不会发生。呼叫者既不是合同的所有者,也不是将资金存入合同的投资者。
此漏洞是由于调用向任何地址发送以太网货币的功能时,调用方未能检查调用方的身份造成的。可以通过正确验证发送资金的功能来防止此漏洞。
保密失败:在区块链中,由于区块链的公共性(即交易细节众所周知),限制变量或函数的可见性不能保证变量或函数的保密性。防止此漏洞的一种可能的解决方案是使用加密技术,如定时承诺[6]。
签名信息不足:当数字签名对多个事务有效时,会出现此漏洞。当发送者(如Alice)通过**合同向多个接收者(而不是发起多个交易)汇款时,可能会发生这种情况。此漏洞最初是在针对智能合约的重放攻击中被利用的。通过在每条消息中组合适当的信息(如当前值和时间戳),可以防止此漏洞。
具有无限制操作的DOS:这种漏洞首先在政府心理契约中观察到[7]。
未检查的调用返回值:此漏洞也称为处理错误的异常。它有两种变体,称为无气发送和无气发送。如果未检查低级调用的返回值,则会发生这种情况,即使函数调用抛出错误,也可能继续执行[8]。
未初始化的存储指针:回顾过去,在实体中,协定状态变量始终从插槽0开始连续放置在存储中。对于复合局部变量(例如,结构、数组或映射),将引用指定给未占用对象存储中的插槽,以指向状态变量。
错误的构造函数名称:这个漏洞最初是在rubixi合同[9]中发现的,它的名称不正确,允许任何人成为合同的所有者。在SOLidness0.4.22之前,声明与契约同名的函数被视为契约构造函数,仅在创建契约时执行。
类转换:此漏洞在[10]中**发现。用固体语言编写的合同可以通过直接引用被调用合同的实例来调用另一个合同。
过时的编译器版本:合同使用过时的编译器时发生,其中包含错误,使已编译的合同易受攻击。使用**的编译器可以防止此漏洞。
简短地址:此漏洞最早在[11]中实现并得到广泛讨论。
以太网货币丢失到隔离地址:当汇款中发生以太网货币丢失到隔离地址时,以太坊只检查接收方地址的长度不超过160位,不检查接收方地址的有效性。如果钱被发送到一个不存在的独立地址,以太坊将自动注册该地址,而不是终止交易。
由于地址与任何意向书或合同账户都没有关联,任何人都不能提取转移的资金,这实际上是丢失的。此漏洞是由EVM无法隔离保护造成的。在编写本文时,只能通过手动确保收件人地址的正确性来防止此漏洞。
调用堆栈深度限制:此漏洞是由于EVM执行模不足造成的,eip-150的hard fork已经消除了此漏洞,它重新定义了外部调用的油耗规则,使得调用堆栈深度无法达到1024。
低估操作码:此漏洞最早是在两次DoS攻击中发现的[12][13]。
交易顺序依赖(也称为前端操作):这是指并发问题,即区块链的未来状态取决于交易的执行顺序,但由矿工决定。
时间相关性:当合同执行关键操作(例如汇款)时,它将块.时间戳当将此漏洞用作触发条件的一部分或恶意矿工可以操纵的随机性源时,就会发生此漏洞。该漏洞是由以太坊引起的,它只要求时间戳大于其父块的时间戳并且在当前时钟的900秒内。
生成随机性:例如,许多赌博和彩票合同随机选择中奖者,通常基于一些初始的私人种子(例如块编号, 块.时间戳,block.difficity或blockhash)生成伪随机数。然而,这些种子完全由矿工控制,这意味着恶意矿工可以操纵这些变量,使自己成为赢家。此漏洞是由**纵的熵源造成的。
2数据层漏洞
不可区分链:当以太坊被划分为ETH和etc链[13]时,首先从跨链重放攻击中观察到此漏洞。回想一下,以太坊使用ECDSA对事务进行签名。在eip-155[7]硬分叉之前,每个事务包含六个字段(即随机数、接收者、值、输入、gasprice和gaslimit)。
然而,数字签名不是特定于链的,因为那时甚至不知道特定于链的信息。因此,为一个链创建的事务可以被另一个链重用。通过将chainid合并到字段中,此漏洞已被消除。
状态trie中的“空帐户”:此漏洞最初是从[12][13]中报告的DOS攻击中发现的。
3共识层漏洞
外包挑战:回想一下以太坊使用了一个名为ETHash的POW挑战,该挑战旨在**asic并限制并行计算的使用(因为事实上,大多数矿工的工作将是读取数据集)。通过有限的内存带宽)。然而,狡猾的矿工仍然可以将寻找难题解决方案的任务分成几个较小的任务,然后外包出去。该漏洞是由ETHash造成的,ETHash只使谜题解在原始图像搜索中部分连续,而不是依赖于序列pow。
概率终结性:该漏洞是由以太坊区块链偏好可用性而非一致性造成的,这是根据cap定理[14]选择的。
带有块填充的DOS:这个漏洞是在fomo3d契约中**发现的[15]。该漏洞只会导致攻击者的事务包含在新挖矿的块中,而其他事务则被矿工放弃一段时间。当攻击者提供更高的价格来鼓励矿工选择攻击者的交易时,可能会发生这种情况。这个漏洞是由贪婪的挖矿激励机制造成的。在撰写本文时,还没有解决方案来防止此漏洞。
诚实挖矿假设:这种脆弱性是由一致同意造成的,因为它不符合激励机制,见[16]。在撰写本文时,此漏洞仍然是一个悬而未决的问题。
区块奖励:区块奖励机制,用于处理区块快速生成导致的旧区块增加。然而,这种机制有一个副作用,就是让自私的矿工把老矿块变成矿块,获得回报,从而有效地激发了自私的挖矿和双重消费。
验证者困境:这个漏洞在参考文献[17]中**报道,这意味着当验证一个新的事务需要简单的计算时,无论矿工是否选择验证该事务,它都会受到攻击。如果矿工用大量的计算来验证交易,他们将花费大量的时间,为攻击者在下一个区块的竞争中提供优势;如果矿工未经验证就接受交易,区块链可能包含不正确的交易。此漏洞是由以太坊中验证资源需求事务的高成本造成的。可以通过限制验证块中所有事务所需的计算量来缓解此漏洞[17]。然而,目前尚不清楚如何消除这一漏洞。
4网络层漏洞
无限节点创建:此漏洞特定于gETH client 1.8之前的版本。在以太坊网络中,每个节点由一个唯一的ID标识,该ID是一个64字节的ECDSA公钥。攻击者可以在一台计算机上创建无限数量的节点(即具有相同IP地址的节点),然后利用这些节点垄断一些受害节点的传入和传出连接,从而有效地将受害节点与网络中的其他对等节点隔离开来。
此漏洞是由对节点生成过程的弱限制造成的。通过将IP地址和公钥组合用作节点ID,可以消除此漏洞。GETH开发人员尚未采用此策略,他们认为这会对客户端的可用性产生负面影响。
无限制的传入连接:此漏洞存在于版本1.8[18]之前的gETH客户端中。每个节点在任何时间点都可以拥有总数量的maxpeers连接(默认值为25),并且可以与其他节点发起最多1(1+maxpeers)/2个出站TCP连接。
但是,其他节点发起的传入TCP连接数没有上限。通过在没有出站连接的情况下为maxpeers与受害者节点建立许多传入连接,攻击者有机会掩盖受害者。在gETHv1.8中,通过限制到节点的传入TCP连接的数量来消除此漏洞,默认值为⌊maxpeers/3⌋=8。
公共对等选择:此漏洞是在gETH client 1.8[18]之前的版本中检测到的。
对等选择:该漏洞是指当gETH client从其路由表中选择节点以建立出站连接时,它总是获得随机选择的bucket的头部。由于每个bucket中的节点都是按活动排序的,因此攻击者可以定期向gETH客户机发送消息,使其节点始终位于其他节点之前。
在gETHv1.9中,通过从路由表中的所有节点中心化随机选择统一节点,而不是从每个bucket的头中随机选择节点,消除了此漏洞。
独立块同步:允许攻击者在不独占受害者客户端连接的情况下对以太坊 P2P网络进行分区。回想一下,每个块标题都包含一个记录块的挖矿难度的难度字段。区块链的总难度由totalcofficity表示,totalcofficity是当前区块的难度总和。
rpcapi暴露:这个漏洞最初是通过对gETH和奇偶校验客户端的攻击发现的[19]。
文章链接:https://www.btchangqing.cn/207071.html
更新时间:2021年06月12日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。