智能合约安全堪忧,了解 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 年十大常见问题列表之间的变化。这些问题按严重程度和流行程度排序: 1. 未检查的外部调用 在 2018 年 Solidity 十大安全问题榜单上未检查的外部调用是第三个常见问题。由于现在前两个解决了, 因此未检查的外部调用成为了 2020 年更新列表中最常见的问题。 Solidity 底层调用方法,(例如 address.call()) 不会抛出异常。而是在遇到错误,返回 false。 而如果使用合约调用 ExternalContract.doSomething() 时,如果 doSomething() 抛出异常,则异常会继续「冒泡」传播。 应该通过检查返回值来显式处理不成功的情况,以下使用 (责任编辑:admin1) |