DIT:智能合约开发必读:这10个Solidity安全问题不容忽视,防失业_SOLID价格

值得关注的其他问题

尽管有一个安全问题排名很不错,但它往往一些有趣的细节,因为某些细节与排名列表并不完全一致。在深入挖掘10大问题之前,必要阐述一下原始研究中一些值得关注的亮点问题:

在2018年,最主要的两个问题是外部合约拒绝服务和重入。但是现在这些问题有所缓解。可以从我们的研究博客中了解更多有关Reentrancy的信息:从安全角度出发审视智能合约。

译者注:实际上由于DeFi应用之间的组合应用,又导致了多起严重的重入攻击事件。

现在Solidityv0.6.x发布了,它带来了许多重大变化,然而扫描的智能合约中有50%甚至还没有准备好使用Solidityv0.5.0编译器。另外30%智能合约使用了过时的语法,并且83%的合约在指定编译器版本存在规范问题。

DeFi项目Spartan建议将目前SPARTA代币兑换,此前受攻击损失约3000万美元:DeFi项目Spartan建议兑换代币使所有用户受益最大化。所有现存的SPARTA代币均可按1:1的比例进行兑换;对V2版本的影响最小;提供解决LP损失的方法;代币名称尚未决定;即将公布详细信息。

此前消息,DeFi项目Spartan遭受攻击,损失约3000万美元。[2021/5/6 21:29:16]

译者注:Solidity0.6在语义上更明确了,有助于编译器及时发现问题,让代码更安全,

尽管可见性问题没有出现在2018年的前10位,也没有出现今年的前10,但可见性问题增加了48%,值得关注。

下表比较了2018年和2020年十大常见问题列表之间的变化。这些问题按严重程度和流行程度排序:

币赢CoinW平台DeFi币种 OIN领涨:据币赢行情数据显示,截止今日10:00(GMT+8),平台内DeFi币种今日UNC领涨,今日涨幅为41.12%,现价0.3923USDT;PUCKLE今日涨幅13.4%,现价57.9956USDT;UNC今日涨幅11.76%,现价0.0124USDT;REN今日涨幅为11.71%,现价0.2549USDT。风险提示:近期行情波动较大,请注意控制风险[2020/9/27]

1.未检查的外部调用

在2018年Solidity十大安全问题榜单上未检查的外部调用是第三个常见问题。由于现在前两个解决了,因此未检查的外部调用成为了2020年更新列表中最常见的问题。

Solidity底层调用方法,(例如

address.call()

)不会抛出异常。而是在遇到错误,返回

false

当前DeFi中锁定资产总价值达54.26亿美元:金色财经报道,据DeBank数据显示,当前以太坊DeFi协议锁定资产总价值达54.26亿美元,Maker以14亿美元排在首位、Compound锁定资产总价值为7.97亿美元、Synthetix锁定资产总价值7.84亿美元。

注:总锁仓量(TVL)是衡量一个DeFi项目使用规模时最重要的指标,通过计算所有锁定在该项目智能合约中的ETH及各类ERC-20代币的总价值(美元)之和而得到。[2020/8/12]

而如果使用合约调用

ExternalContract.doSomething()

时,如果

doSomething()

抛出异常,则异常会继续「冒泡」传播。

应该通过检查返回值来显式处理不成功的情况,以下使用

addr.send()

进行以太币转账是一个很好的例子,这对于其他外部调用也有效。

西班牙公司通过智能合同质量控制向区块链发送橄榄油:西班牙是世界上最大的橄榄油生产国,每年生产100万吨的橄榄油。大宗商品供应链中两个最大的问题是价格波动和质量控制,Olivacoin希望能为橄榄油行业解决这两个问题。该公司还为橄榄油的买家和卖家提供了一个支付平台,该公司已经开发出了用于分析橄榄油的硬件,以确保产品的质量是有保障的。如果达到条件,那么支付就会被智能合同所激活。该公司的创始人伊斯梅尔?圣地亚哥认为,Olivacoin可能会成为该行业最大的公司,但不拥有农田、树木或任何加工厂。希望通过将加密货币与物联网技术结合在一起,扩大公司的公司,成为在原材料区块链追溯性方面无可争议的世界领导者。[2018/5/1]

if(!addr.send(1)){revert(。

2.高成本循环

高成本循环从Solidity安全榜单的第四名上升至第二名。受该问题影响的智能合约数量增长了近30%。

大家都知道,以太坊上的运算是需要付费的。因此,减少完成操作所需的计算,不仅仅是优化问题,还涉及到成本费用。

美国田纳西州法律现已认可区块链和智能合约:公共记录显示,田纳西州州长周四签署了一项法案,根据该州法律合法地认可区块链数据和智能合约。公共记录显示,田纳西州州长Bill Haslam周四签署了一项法案,根据州法律合法地认可区块链数据和智能合约。根据LegiScan的数据,该法案自1月份提出以来一直在立法机构讨论,一致通过了参议两院。该法案承认使用区块链技术和智能合约进行电子交易的法定权力,保护区受区块链技术保护的某些信息的所有权。[2018/3/24]

循环是一个昂贵的操作,这里有一个很好的例子:数组中包含的元素越多,就需要更多迭代才能完成循环。最终,无限循环会耗尽所有可用GAS。

for(uint256i=0;i<elements.length;i++){//dosomething}

如果攻击者能够影响元素数组的长度,则上述代码将导致拒绝服务(执行无法跳出循环)。而在扫描的智能合约中发现有8%的合约存在数组长度操纵问题。

3.权力过大的所有者

这是Soldiity十大安全问题新出现的问题,该问题影响了约16%的合约,某些合约与其所有者紧密相关,某些函数只能由所有者地址调用,如下例所示:

只有合约所有者能够调用

doSomething()和doSomethingElse()

函数:前者使用onlyOwner修饰器,而后者则显式执行该修饰器。这带来了严重的风险:如果所有者的私钥遭到泄露,则攻击者可以控制该合约。

4.算术精度问题

由于使用256位虚拟机,Solidity的数据类型有些复杂。Solidity不提供浮点运算,并且少于32个字节的数据类型将被打包到同一个32字节的槽位中。考虑到这一点,你应该预见以下程序精度问题:

functioncalculateBonus(uintamount)returns(uint){returnamount/DELIMITER*BONUS;}

如上例所示,在乘法之前执行的除法,可能会有巨大的舍入误差。

5.依赖tx.origin

6.溢出

Solidity的256位虚拟机存在上溢出和下溢出问题,这里有具体的分析。在

for

循环条件中使用

uint

数据类型时,开发人员要格外小心,因为它可能导致无限循环:

7.不安全的类型推导

该问题在Solidity十大安全问题排行榜中上升了两位,现在影响到的智能合约比之前多了17%以上。

8.不正确的转账

此问题在Solidity十大安全问题榜单中从第六位下降到第八位,目前影响不到1%的智能合约。

9.循环内转帐

当在循环体中进行以太币转账时,如果其中一个转账失败,那么整个交易将被回滚。

for(uinti=0;i<users.lenghth;i++){users.transfer(amount);}

在这个例子中,攻击者可能利用此行为来进行拒绝服务攻击,从而阻止其他用户接收以太币。

10.时间戳依赖

如果你的应用需要随机性,可以参考RANDAO合约,该合约基于任何人都可以参与的去中心化自治组织,是所有参与者共同生成的随机数。

总结

比较2018年和2020年十大常见问题时,我们可以观察到开发最佳实践的一些进展,尤其是那些影响安全性的实践。看到2018年排名前2位的问题:外部合约拒绝服务和重入,已经不再榜单了,这是一个积极的信号,但仍然需要采取措施来避免这类常见错误。

请记住,智能合约在设计上是不可变的,这意味着一旦创建,就无法修补源代码。这对安全性构成了巨大挑战,开发人员应利用可用的安全测试工具来确保在部署之前对源代码进行了充分的测试和审核。

Solidity是一种非常新且仍在成熟的编程语言,Solidityv0.6.0引入了一些重大更改,并且预计在以后的版本中还会有更多更改。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

区块博客

[0:0ms0-3:906ms