来自 防护 2021-10-11 13:13 的文章

国内高防cdn_中小网站安全防护_免费试用

国内高防cdn_中小网站安全防护_免费试用

2018年,山石防火墙防御内网ddos,我们对智能合约背景下的安全现状进行了初步研究,高防cdn目标客户,重点研究了以Solidity编写的"一种面向合同的高级智能合约实现语言"。当时,我们根据公开的智能合约源代码编制了十大最常见的智能合约安全问题列表。现在是时候更新这项研究,并评估自那时以来智能合约安全性是如何演变的。虽然前10个列表很好,但它们往往不会突出其他有趣的细节,因为有些细节与前10个列表并不完全一致。在深入了解更新后的智能合约前10名名单之前,我们的原始研究中有一些亮点:2018年,外部合同拒绝服务和可重入性是前两大问题。然而,这些问题现在已经得到解决。您可以在我们最近的研究博客Checkmarx research:Solidity and Smart Contracts from a Security positions了解更多有关可重入性的信息。当Solidity v0.6.x发布时,服务器防御防止ddos攻击,引入了许多突破性的变化,50%的扫描智能合约甚至还没有准备好用于Solidity编译器v0.5.0。这一点变得更加相关,因为30%的智能合约使用不推荐的构造(例如sha3、throw constant等),83%的智能合约存在编译器版本规范(pragma)的问题。尽管能见度问题并没有进入2018年前10名的榜单,也没有在这次更新的版本中出现,但已经增加了48%。你可以在我们之前的博客和官方文档中阅读更多关于这个问题的信息。下表比较了2018年和2020年十大常见问题清单之间的变化。这些问题按严重程度和流行程度分类。Solidity十大常见问题S1–未检查的外部呼叫这是我们之前十大最常见的问题。由于前2个问题现已解决,ddos防御相关视频,未经检查的外部呼叫已上升到2020年更新列表中最常见的问题。可靠的低级调用方法(例如。,地址.呼叫())不要引发异常。相反,如果调用遇到异常,则返回false。另一方面,合同要求(例如。,外部合同。剂量测定())如果doSomething()抛出,则自动传播抛出。传输乙醚使用发送地址()是一个很好的例子,其中不成功的传输应该通过检查返回值来显式处理,但这对于其他外部调用也是有效的。S2–昂贵的环路昂贵的循环从前十名的第四名上升到第二名。尽管我们之前列出的前两个问题已经解决,但受影响的智能合约数量增加了近30%。以太坊环境的计算能力是付费的(使用乙醚)。因此,减少完成一个操作所需的计算步骤不仅是一个优化问题,而且也是一个成本效率问题。循环是代价高昂的操作的一个很好的例子:由于一个数组有许多元素,所以需要更多的迭代来完成循环。正如你所料,无限循环会耗尽所有可用的气体。如果攻击者能够影响元素数组的长度,那么它们将能够引起拒绝服务,防止执行跳出循环。虽然这远远不是前十大常见问题,但在扫描的智能合约中,有8%发现了阵列长度操纵。S3–超动力车主这是前10名中的一个新条目,影响了大约16%的扫描智能合约。有些契约与它们的所有者紧密耦合,使得一些函数只能由所有者地址调用,如下例所示。doSomething()和doSomethingElse()函数都只能由合同所有者调用:前者使用onlyOwner修饰符,而后者则显式地执行它。这带来了一个严重的风险:如果所有者的私钥被泄露,那么攻击者就可以获得对合同的控制权。S4–算术精度由于256位虚拟机(EVM),Solidity数据类型非常麻烦。该语言不提供浮点表示,小于32字节的数据类型被打包到同一个32字节槽中。考虑到这一点,您应该预料到精度问题。当在乘法之前执行除法时,如上面的示例中所示,您应该会遇到巨大的舍入错误。S5–依赖发送来源合同不应依赖发送来源对于身份验证,由于恶意合同可能会在中间发挥作用,耗尽所有资金:消息发送者应该改为使用。你会发现一个详细的解释Tx源攻击索里蒂的文件。长话短说,发送来源总是呼叫链中的第一个帐户,而消息发送者是直接来电者。如果链中的最后一个合同依赖于发送来源对于身份验证,中间的合同将能够耗尽资金,因为没有对呼叫方进行验证(消息发送者).S6–溢流/下溢Solidity的256位虚拟机(EVM)带来了溢出和下溢问题,如这里所示。开发人员在for-loop条件下使用uint数据类型时应该格外小心,因为这可能会导致无限循环。在上面的例子中,i的下一个值为0时将是2256-1,这使得条件始终为真。开发者应该更喜欢!=和==用于比较。S7–不安全类型推断这个问题上升了两个位置,现在影响了比之前多17%的智能合约。Solidity支持类型推断,但也有一些奇怪之处。例如,文本0类型推断为byte,而不是我们预期的int。在下面的示例中,i的类型被推断为uint8:足以存储右侧值的最小整数类型。如果元素的元素数超过256个,则应该会发生溢出。建议显式声明数据类型,服务器怎么防御cc,以避免意外行为和/或错误。S8–不当转移这一问题在前10名中从第六名下降到第八名,目前影响到扫描的智能合约不到1%。在合同之间转移乙醚的方法不止一种。尽管打电话给地址转移(x) 函数是推荐的方法,我们仍然使用send()函数找到契约。请注意地址转移(x) 如果传输不成功,则自动引发异常,从而减轻前面讨论的未检查外部调用问题:S1。S9–环路传输当以太在循环中传输时,如果其中一个契约无法接收它,则整个事务将被还原。攻击者可以利用此行为造成拒绝服务,阻止其他协定接收乙醚。S10–时间戳相关性这在前一个版本的前十名中排名第五。重要的是要记住,智能合约在不同的时间在多个节点上运行。以太坊虚拟机(EVM)不提供时钟时间,now变量(通常用于获取时间戳)实际上是一个环境变量(的别名块.时间戳)矿工可以操纵。由于矿工目前可以操作环境变量,因此其值只应用于不等式>、=、和