【论文翻译】Ferreira 2020 SmartBugs: A Framework to Analyze Solidity Smart Contracts
摘要
在过去的几年里,对Etalum智能合同的自动化分析、测试和调试进行了大量的研究。 然而,比较和复制这项研究并不是微不足道的。 为了解决这一问题,我们介绍了SmartBugs,这是一个可扩展和易于使用的执行框架,它简化了以Solidity(Etalum中使用的主要语言)编写的智能合同分析工具的执行。 智能Bugs目前分布支持10个工具和两个Solidity契约数据集。 第一个数据集可以用来评估分析工具的精度,因为它包含143个带有208个标记漏洞的带注释的脆弱契约。 第二个数据集包含通过Etherscan收集的47,518个唯一合同。我们讨论了SmartBugs如何在工具数量和执行时间上支持迄今为止最大的实验设置。 此外,我们还展示了它如何通过向工具SmartCheck提供一个新的扩展来实现分析工具的简单集成和比较,该扩展大大改进了与DASP10类BadRandomness、TimeManipulation和AccessControl相关的漏洞的检测(已识别的漏洞从11%增加到24%)。
关键词:
Smart contracts, Solidity, Ethereum, Blockchain, Tools, Debugging, Testing, Reproducible Bugs
1 导言
以太坊是最流行的基于区块链的平台之一,主要是因为它使开发人员能够基于智能合约编写分布式应用程序(Dapp),而智能合约是在分散的节点网络上执行的程序。 用于开发以太坊智能合约的主要语言是Solidity1,它是一种高级语言,遵循类似于JavaScript的,面向对象的范例。以Solidity编写的合同被编译为可以在以太坊虚拟机(EVM)上执行的字节码。
智能合约是以太坊价值的核心。 但是,正如一些研究人员所指出的[1,5],编写安全的智能合约绝非易事。 在一项针对将近一百万个以太坊智能合约的初步研究中,使用一个分析框架来验证其正确性,其中34,200个被标记为易受攻击[6]。著名的攻击,例如TheDAO exploit2和Parity wallet bug3,说明了此问题,并造成了巨大的经济损失。
研究社区已经做出了一些努力来开发自动分析工具,以查找和消除智能合约中的漏洞功能[4、5、8、9]。 但是,比较和复制该研究并不容易:即使有几种工具是公开可用的,但使用的数据集却不是。 如果新工具的开发人员想将新工具与现有工作进行比较,则当前的方法是与替代工具的作者联系,并希望他们能够访问其数据集(例如,在[7]中进行的操作)。
本文的目的是介绍SmartBugs,这是一种可扩展且易于使用的执行框架,它简化了Solidity智能合约上分析工具的执行并促进了可重复性。 我们描述了框架的体系结构,提供的工具和数据集,以及用于添加新工具和过滤数据集的方法(第2节)。 我们说明了两个可以使用SmartBug的典型用例(第3节)。 首先,我们讨论它在工具数量和执行时间上如何支持迄今为止最大的实验设置[3]。 其次,我们展示如何通过添加SmartCheck [8]的新扩展来将其用于比较工具,该扩展大大改善了与DASP10类别不良随机性,时间操纵和访问控制相关的漏洞的检测(已识别漏洞从11%增加 至24%)。
SmartBugs is open-source and is publicly available online at: https://smartbugs.github.io
2 SMARTBUGS
本节介绍SmartBug,重点介绍系统要求,可用的工具和数据集,添加工具和过滤数据集的方法以及可用的界面。 SmartBugs由五个主要部分组成:命令行界面,工具配置,工具的Docker映像,智能合约的数据集以及SmartBugs Runner,它们将所有部分结合在一起以执行分析。 工具。 我们还提供了与SmartBugs交互的基于Web的用户界面。 图1显示了如何将不同的SmartBugs组件组合在一起。
2.1 系统要求
SmartBugs需要Docker和Python3,模块PyYAML、solidity_parser和Docker。 由于Solidity版本并不总是向后兼容的,因此分析工具可能会根据所使用的Solidity编译器处理一些合同时遇到问题。 例如,Solidity v0.5.0引入了breaking change4,这会与Mythril工具的一些版本产生兼容性问题。
为了缓解这个问题,SmartBugs通过在配置文件中添加属性提供了拥有同一工具的两个不同版本的可能性。 配置文件支持默认的工具版本来编译和分析Solidityv0.5.0以上的合同(如果没有提供其他工具版本,则支持所有合同)。 还可以指定不同的工具版本来编译和分析Solidity v0.5.0以下的合同。 第2.3节对此作了说明。
2.2 可用工具和数据集
在撰写本文时,SmartBugs附带了10个准备使用的工具:蜂蜜獾,Maian,Manticore,Mythril,Osiris,Oyente,Securify,Slither,SmartCheck,Solhint。 它还分发了两个Solidity契约数据集。 第一个数据集命名为sbcurated,包含143个带注释的脆弱契约,208个带标记的漏洞,分为10类。 该数据集可用于评估分析工具的精度。 第二个数据集命名为sbwild,它包含通过Etherscan收集的47,518个唯一的5个合同。 所有合同和工具都是公开的。 本节解释了sbcurated的收集方法。 有关sbwild的详细信息,我们请读者[3]。
我们构建sbcurated的目的是提供一个可靠的数据集,其中包含一组设计为可复制的漏洞,这些漏洞遵循已知的并可作为研究社区的参考数据集。数据库跟随DASP10.由于未知类别代表未来和未发现的漏洞,我们选择将不适合这九个类别中任何其他类别的漏洞映射到这一类别(例如。 漏洞,如未初始化的数据和锁定Ether的可能性)。 为了简单起见,我们使用了其他命名法,而不是未知的未知.
6 DASP 10 taxonomy: https://dasp.co
sbcurated是通过从三个不同的来源收集智能合同而创建的:GitHub存储库、分析合同的Blog帖子和Etalum网络。 大多数合同是从GitHub存储库和Etalum网络收集的。 我们确保每个合同的可追溯性,提供他们被获取的URL及其作者,在可能的情况下。 表1显示了143份合同是如何分类的。 每一行包含一个漏洞类别。 对于每个类别,我们提供该类别中可用的合同数量以及该类别合同的漏洞总数和代码行数。
2.3 添加工具的方法
在SmartBugs中添加工具的设计是简单实用的,允许用户根据自己的需要控制工具的执行。 目前,智能Bugs中的所有工具都使用从Docker集线器中提取的Docker图像。 当可用时,我们使用预先存在的Docker图像;否则,我们创建自己的图像(所有Docker图像都在Docker集线器上公开提供)。 选择使用Docker映像是为了方便添加工具,允许执行是可复制的,并对所有工具使用相同的执行环境,允许用户在安装Python3和Docker的任何环境中执行SmartBugs。
每个工具插件都包含工具的配置。 配置包含Docker映像的名称、工具的名称、运行工具的命令,以及可选的工具描述和结果输出的位置。 一旦提供该工具的Docker映像可用,将该工具添加到SmartBugs包括添加一个新的配置文件(an .YAML文件)如下:
默认情况下,SmartBugs从每个工具打印的输出中提取结果。 如果工具将分析结果存储在Docker映像中的文件中,则应使用可选配置参数output_in_files在配置文件中定义该文件的路径,如上图所示。
最后,当向SmartBugs添加工具时,可以实现一种解析方法,以便对工具检测到的漏洞的输出进行规范化。 7
2.4 过滤数据集的方法
智能Bugs支持命名数据集的定义,它表示共享公共属性的合同子集。 例如,默认情况下已经提供的命名数据集是reentrancy:它对应于被识别为易受reentrancy攻击的合同。 命名数据集可以在配置文件(config/dataset/dataset.yaml)中指定)。 要添加自定义的命名数据集,用户只需通过添加名称和相应的路径列表来更改配置文件。 路径可以是目录、文件或两者的列表。 例如:
2.5 命令行接口
smartBugs提供了命令行接口,允许用户在可用的合同数据集上运行不同的分析工具。 用户还可以获得有关工具的信息,如果提供了,则跳过已经有结果的执行,指定分析期间要使用的进程数量(默认情况下为1),并列出可用的命名数据集和工具。 智能Bugs命令行接口可以调用为:
使用示例要运行工具Oyente和Mythril以对抗命名数据集中的契约,我们可以执行:
smartBugs.py --tool oyente mythril --dataset reentrancy
此命令创建一个输出文件夹,其中包含执行的每个工具的分析结果。 通过检查输出文件,我们可以非常快地确定哪些合同被识别为具有漏洞。 由于添加到SmartBugs中的所有工具都带有一个解析器机制来规范输出,因此创建了一个json文件,其中包含工具检测到的所有漏洞。 包含所执行工具的原始输出的文件也在同一个文件夹中生成。 此外,Smart Bugs日志存储在一个名为日志的文件夹中,该文件夹由以执行日期和时间命名的文件组成。
2.6WUI仪表板
我们还提供了一个基于Web的UI(WUI),它与SmartBugs交互。 8此仪表板为用户提供了对工具列表、可用命名数据集和映射到DASP10类别的每个可用工具检测到的漏洞的轻松访问。 图2显示了仪表板的截图。 它提供了三个分析智能合同的选项:(1)用户可以直接在浏览器中粘贴或编写智能合同;(2)用户可以通过上传文件导入智能合同;(3)用户可以在预定义的数据集上运行可用的工具(从sbcurented)。 执行后,仪表板显示了一个图表,显示了每个工具发现的安全问题的数量,对于每个工具,它显示了发现的问题。
3 用例
SmartBugs的主要设想用户是对Solidity智能合同的自动分析和调试感兴趣的研究人员。 在本节中,我们将介绍两个典型的用例。 首先,我们总结了一个经验评估,得到了SmartBugs[3]的支持。 然后,我们通过讨论如何将智能检查[8]的新扩展与原始工具进行比较,来展示如何支持工具开发人员。
3.1支持经验评价
SmartBugs可以支持那些有兴趣做大的实证评估的研究人员。 命令行接口和选项——跳过的和——过程特别有用。 我们最近使用SmartBugs来获得Solidity智能合同自动化分析工具的现状概述,并支持迄今为止在工具数量和执行时间[3]方面最大的实验设置。 我们评估了10个最先进的自动分析工具在sbwild和一个子集的sbcurd,其中包含69个合同(从那时起,sbcurded的合同数量增加了)。 总共,我们进行了428,337次分析,大约花了564天和3小时。 我们发现,只有42%的注释数据集的漏洞被所有工具检测到,工具Mythril具有更高的准确性(27%)。 当考虑最大的数据集sbwild时,我们观察到97%的合同被标记为易受伤害,从而表明了相当多的假阳性
使用SmartBugs使任务更容易,对于确保工作能够完全复制至关重要。 8智能杯仪表板
8SmartBugs Dashboard: https://github.com/smartbugs/smartbugs-dashboard
3.2支持分析工具开发人员
上述经验评估表明,自动化分析工具有改进的余地,可以发现更多的漏洞。 例如,Bad Randomness是所有工具未能检测到的类别之一。 在这一节中,我们描述了工具智能检查[8]的一个简单扩展,它能够检测与坏随机相关的漏洞,并改进对时间操纵和访问控制漏洞的检测。 9我们将我们的扩展称为智能检查扩展。
智能检查运行词汇和句法分析的固体源代码。 它使用自定义Solidity语法生成XML解析树作为中间表示(IR)。 智能检查通过在IR上使用XPath模式来检测漏洞模式。 我们改进智能检查漏洞检测的方法是以XPath模式的形式添加新规则。
我们在智能检查中增加了三个新规则。 第一个规则被命名为SOLIDITY_BAD_RANDOMNESS,目的是检测与类别坏随机相关的问题。 为此,我们创建了一个XPath模式来检测使用环境变量,如block.number、block.coinbase、block.diulty、block.gaslimit、blockhash和block.blockhash。 对于第二个规则,我们遵循了类似的方法来更新规则SOLIDITY_EXACT_TIME,已经包含在智能检查中。 我们修改了模式以查找包含block.timestamp或now的表达式,将先前定义的规则扩展到比比较更通用的情况。 这些规则是直接的词汇分析,其目的是简单地检测所引用的环境变量的使用,并标记它们的使用,作为警告。
关于访问控制,智能检查的默认规则仅限于tx.origin问题。 为了改进这一点,我们添加了一个模式来搜索“自杀”(自毁的使用)和所有权转移,其中功能没有适当的保护。 我们在一个名为SOLIDITY_UNPROTECTED的规则中构造了两个规则模式。 为了检测不受保护的问题,我们创建了一个模式,以查找所有定义的函数,不包括构造函数,这些函数没有定义为标准修饰符,仅为所有者,或者要求语句保护对定义为所有者或自毁调用的变量的值分配
智能检查扩展的源代码可以在GitHub10上作为原始智能检查的叉子。 它也包括在智能杯和准备执行。
9 Descriptions of these vulnerabilities can be found in DASP’s website: https://dasp.co
10 SmartCheck Extended: https://github.com/pedrocrvz/smartcheck
4 结论
本文介绍了SmartBugs,一种可扩展、易于使用的执行框架,它简化了Solidity智能契约上分析工具的执行。 智能Bugs的主要目标之一是促进智能合同自动化推理和测试研究的可重复性。 为了证明新工具的集成和与现有工具的比较是容易的,我们扩展了SmartCheck并使用了SmartBugs,以表明我们的扩展版本大大改进了与坏随机、时间操纵和访问控制相关的漏洞的检测。
我们相信,SmartBugs可以成为推动智能合同自动化分析研究的宝贵资产。 今后的工作包括:(一)增加新的分析工具;(二)以更多的合同扩大数据集;(三)改进文件(例如。 贡献指南),和(4)新的实证研究支持的智能杯。
致谢
This work has been co-funded by the European Union’s Horizon 2020 research and innovation programme under the QualiChain project, Grant Agreement No 822404 and supported by national funds through FCT, Fundação para a Ciência e a Tecnologia, under projects UIDB/50021/2020 and PTDC/CCI-COM/29300/2017.
参考文献
[1] Karthikeyan Bhargavan et al. 2016. Formal verification of smart contracts: Shortpaper. In PLAS.
[2] Pedro Cruz. 2019. A Study of Static Analysis Tools for Ethereum Smart Contracts. URL: https://pedrocrvz.me/assets/thesis-abstract.pdf (Accessed: 29 May 2020).
[3] Thomas Durieux, João F. Ferreira, Rui Abreu, and Pedro Cruz. 2020. Empirical Review of Automated Analysis Tools on 47,587 Ethereum Smart Contracts. In ICSE.
[4] Ilya Grishchenko, Matteo Maffei, and Clara Schneidewind. 2018. A Semantic Framework for the Security Analysis of Ethereum Smart Contracts. In Principles of Security and Trust, Lujo Bauer and Ralf Küsters (Eds.).
[5] Loi Luu, Duc-Hiep Chu, Hrishi Olickel, Prateek Saxena, and Aquinas Hobor. 2016. Making smart contracts smarter. In ACM CCS.
[6] Ivica Nikolić, Aashish Kolluri, Ilya Sergey, Prateek Saxena, and Aquinas Hobor. 2018. Finding the greedy, prodigal, and suicidal contracts at scale. In ACSAC.
[7] Daniel Perez and Benjamin Livshits. 2019. Smart Contract Vulnerabilities: Does Anyone Care? arXiv:1902.06710
[8] Sergei Tikhomirov, Ekaterina Voskresenskaya, Ivan Ivanitskiy, Ramil Takhaviev, Evgeny Marchenko, and Yaroslav Alexandrov. 2018. Smartcheck: Static analysis of Ethereum smart contracts. In IEEE/ACM 1st International Workshop on Emerging Trends in Software Engineering for Blockchain (WETSEB).
[9] Petar Tsankov, Andrei Dan, Dana Drachsler-Cohen, Arthur Gervais, Florian Buenzli, and Martin Vechev. 2018. Securify: Practical security analysis of smart contracts. In ACM CC