智能合约开发必读:这 10 个 Solidity 常见安全问题值得关注

智能合约安全堪忧,了解 2020 年 Solidity 常见的 10 个安全问题。

原文标题:《Solidity 十大常见安全问题》
 撰文:Erez Yalon
 翻译:登链社区

在 2018 年,我们(CheckMarx)曾对智能合约安全状况进行过初步研究,重点是 Solidity[1] 编写的智能合约。当时,我们根据公开的合约源代码(译者注:本文称之为已扫描合约,本文出现的 x% 是以此为基数)编写了最常见的 10 个智能合约安全问题。两年过去了该更新研究并评估智能合约安全性发展的如何了。

值得关注的其他问题

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

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

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

现在 Solidity v0.6.x 发布 [3] 了,它带来了许多重大变化 [4],然而扫描的智能合约中有 50%甚至还没有准备好使用 Solidity v0.5.0 编译器。另外 30% 智能合约使用了过时的语法(例如:使用 sha3、throw 、constant 等),并且 83%的合约在指定编译器版本存在规范问题(pragma)。

译者注:Solidity 0.6 在语义上更明确了(例如 0.6 版本在继承方面的升级 [5]),有助于编译器及时发现问题,让代码更安全,

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

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

智能合约开发必读:这 10 个 Solidity 常见安全问题值得关注

1. 未检查的外部调用

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

Solidity 底层调用方法,(例如 address.call()) 不会抛出异常。而是在遇到错误,返回 false

而如果使用合约调用 ExternalContract.doSomething() 时,如果 doSomething() 抛出异常,则异常会继续「冒泡」传播。

应该通过检查返回值来显式处理不成功的情况,以下使用 addr.send() 进行以太币转账是一个很好的例子,这对于其他外部调用也有效。

 if(!addr.send(1)) { revert() } 
*本文转载自网络转载,版权归原作者所有。本站只是转载分享,不代表赞同其中观点。请自行判断风险,本文不构成投资建议。*