Empirical Review of Automated Analysis Tools on 47,587 Ethereum Smart Contracts

Empirical Review of Automated Analysis Tools on 47,587 Ethereum Smart Contracts

论文题目:(2020-ICSE) Empirical Review of Automated Analysis Tools on 47,587 Ethereum Smart Contracts —— 自动分析工具对47,587个以太坊智能合约的进行实证评估

论文引用:Durieux T, Ferreira J F, Abreu R, et al. Empirical review of automated analysis tools on 47,587 Ethereum smart contracts[C]//Proceedings of the ACM/IEEE 42nd International Conference on Software Engineering. 2020: 530-541.

代码开源:SmartBugs

image-20210412114934942

一、MAIN CONTENT

本文想要分析当前最新检测智能合约漏洞工具的有效性和实用性,选择了35种主流的自动分析工具,按照自定义的四个标准筛选出了9个不同的工具;为了能够执行和比较自动分析工具,从而为公平比较奠定基础,作者提供了两个Solidity智能合约数据集:

  • 第一个数据集包含69个手动注释的智能合约,可用于评估分析工具的精度。
  • 第二个数据集包含以太坊区块链中所有可用的智能合约,这些合约在撰写本文时在Etherscan上具有Solidity源代码(总共47,518个合约)

并且已经在两个数据集上执行了9种最新的自动化分析工具,并对结果进行了分析,所有工具的执行需要564天3小时才能完成428,337分析。为了简化对智能合约自动分析技术的研究,提供了一个新颖的,可扩展的,易于使用的执行框架,称为SmartBugs,可以在相同的执行环境中执行这些工具;该框架当前包含9个已配置的智能合约分析工具。

结果表明,所有工具仅检测到注释数据集中的漏洞的42%,并且最新技术无法检测DASP10的两类漏洞:随机性差(Bad Randomness)和短地址(Short Addresses);其中Mythtil具有更高的准确性(27%),此外本文还提到如果要兼顾准确性和执行成本,那么Mythril和Slither的组合可以检测到总共42/115(37%)的漏洞,这是最佳折衷方案;

而对另一个数据集进行漏洞检测时,有97%的合同至少被一种工具检测到漏洞,这表明每种工具都可能存在着大量误报,而其中Oyente更是当仁不让地检测到73%的合同中的漏洞。总之表明,最先进的技术远非完美无缺,依然有很大改进的空间。

总而言之,本文的贡献是:

(1)带有注释的易受攻击的Solidity智能合约数据集;
(2)一个包含以太坊区块链(Etherscan)中所有可用的智能合约的数据集,并且合约具有Solidity源代码;
(3)一个执行框架SmartBugs,包括9个预配置的智能合约分析工具;
(4)对47,587份智能合约执行9种工具的分析。

二、BACKGROUND

研究者已经开发了一些自动分析工具,以查找和消除智能合约中的漏洞。但是,比较和复制这项研究并不容易:即使有几种工具是公开可用的,但使用的数据集却不是。如果新工具的开发人员想将新工具与现有工作进行比较,当前的方法是与替代工具的作者联系,并希望他们能够访问其数据集。

三、STUDY DESIGN

image-20210412115007168

Research Questions

  1. [Effectiveness] What is the effectiveness of current analysis tools in detecting vulnerabilities in Solidity smart contracts?

    探究最新的分析工具在检测已知智能合约中的漏洞方面的精确度如何

  2. [Production] How many vulnerabilities are present in the Ethereum blockchain?

    调查了从以太坊区块链中提取的合约中检测到的漏洞,考虑了最流行的漏洞,随时间的演变的漏洞以及自动分析工具的不同组合之间的共同漏洞。

  3. [Performance] How long do the tools require to analyze the smart contracts?

    比较分析工具的性能。目的是确定哪种工具效率最好

Subject Tools

根据一些已有的文献和作者自己的搜查,列出了35种工具:

TABLE 1 确定为该研究潜在的工具
# Tools URLs
1 contractLarva https://github.com/gordonpace/contractLarva
2 E-EVM https://github.com/pisocrob/E-EVM
3 Echidna https://github.com/crytic/echidna
4 Erays https://github.com/teamnsrg/erays
5 Ether N/A
6 Ethersplay https://github.com/crytic/ethersplay
7 EtherTrust https://www.netidee.at/ethertrust
8 EthIR https://github.com/costa-group/EthIR
9 FSolidM https://github.com/anmavrid/smart-contracts
10 Gasper N/A
11 HoneyBadger https://github.com/christoftorres/HoneyBadger
12 KEVM https://github.com/kframework/evmsemantics
13 MadMax https://github.com/nevillegrech/MadMax
14 Maian https://github.com/MAIAN-tool/MAIAN
15 Manticore https://github.com/trailofbits/manticore/
16 Mythril https://github.com/ConsenSys/mythril-classic
17 Octopus https://github.com/quoscient/octopus
18 Osiris https://github.com/christoftorres/Osiris
19 Oyente https://github.com/melonproject/oyente
20 Porosity https://github.com/comaeio/porosity
21 rattle https://github.com/crytic/rattle
22 ReGuard N/A
23 Remix https://github.com/ethereum/remix
24 SASC N/A
25 sCompile N/A
26 Securify https://github.com/eth-sri/securify
27 Slither https://github.com/crytic/slither
28 Smartcheck https://github.com/smartdec/smartcheck
29 Solgraph https://github.com/raineorshine/solgraph
30 Solhint https://github.com/protofire/solhint
31 SolMet https://github.com/chicxurug/SolMet-Solidity-parser
32 teEther https://github.com/nescio007/teether
33 Vandal https://github.com/usyd-blockchain/vandal
34 VeriSol https://github.com/microsoft/verisol
35 Zeus N/A

其中只有满足四个纳入条件(inclusion criteria)的工具才会被应用到最后的研究。三个纳入条件如下:

  1. Available and CLI:该工具是公开可用的,并支持命令行界面(command-line interface,CLI);CLI促进了分析的可伸缩性
  2. Compatible Input:该工具将Solidity合同作为输入。这不包括仅考虑仅以EVM字节码为输入的工具。
  3. Only Source:该工具仅需要合同的源代码即可运行分析。这不包括需要测试套件(test suite)或带有断言注释的合同(contracts annotated with assertions)的工具。
  4. Vulnerability Finding:该工具可以识别智能合约中的漏洞或不良实践(bad practices)。这排除了仅构造诸如控制流程图之类的工件的分析类工具(analysis tools)

在检查了表1中列出的所有35种分析工具之后,发现有9种工具符合概述的纳入标准。表2列出了排除和包含的工具,对于排除的工具,还显示了它们不符合哪些标准。

TABLE 2 根据作者的纳入标准排除和包含的分析工具

image-20201009161520383

HoneyBadger

由卢森堡大学的一组研究人员开发,是基于Oyente的工具,该工具采用符号执行和一组启发式方法(a set of heuristics)来确定智能合约中的漏洞(honeypots,这里用了蜜罐指代)。honeypots是指在设计上似乎有明显的缺陷的智能合约,假设用户先验将一定数量的以太币转移到合约中,则任意用户都可以从合约中消耗Ether。当HoneyBadger检测到合同似乎易受攻击时,这意味着合同的开发人员希望使合同看起来易受攻击,但并不易受攻击。

Maian

由新加坡国立大学和伦敦大学学院的研究人员联合开发的,也是基于Oyente工具的。Maian会寻找可以自毁(self-destructed)合同、从任意地址抽取以太的合同,以及不具有付款功能的却接受以太的合同;然后使用私有区块链中的动态分析(dynamic analysis)来减少误报的数量。

Manticore

由TrailOfBits开发,使用符号执行在EVM字节码中搜索引起重入(reentrancy)漏洞和可达到自毁(reachable self-destruct)执行路径的漏洞。

Mythril

由ConsenSys开发的产品,依赖于EVM字节码的调和分析(concolic analysis),污点分析(taint analysis)和控制流检查(control flow checking),以修剪搜索空间并查找可以利用智能合约中的漏洞的价值。

Osiris

由卢森堡大学的一组研究人员开发的Oyente扩展了功能,可以检测智能合约中的整数错误(integer bugs)。

Oyente

由Melonport AG开发的,是最早的智能合约分析工具之一。它也被用作Maian和Osiris等其他几种方法的基础。 Oyente在EVM字节码上使用符号执行来识别漏洞。

Securify

由苏黎世联邦理工学院的ICE中心开发,使用Souffle Datalog求解器静态分析EVM字节码,以推断出与合同有关的精确语义信息。然后,它将检查合规性(compliance)和违规(violation)模式,以捕获足够的条件来证明财产是否成立。

Slither

由TrailOfBits开发的是一种静态分析框架,该框架将Solidity智能合约转换为称为SlithIR的中间表示形式,并应用已知的程序分析技术,例如数据流和污点跟踪(taint tracking),来提取和改进信息。

Smartcheck

由SmartDec开发的是一种静态分析工具,用于查找漏洞模式和不良的编程行为(bad coding practices);它在Solidity源代码上运行词法和句法分析(lexical and syntactical analysis)。

Datasets of Smart Contracts

A Dataset of 69 Vulnerable Smart Contracts

SBcuratedSB^{curated},包含69个易受攻击的智能合约:此数据集中的合同或者是已被识别为易受攻击的真实合同,或者是为了说明易受攻击性而故意创建的。该数据集的目标是拥有一组标记有漏洞的位置和类别的已知漏洞合同。此数据集可用于评估智能合约分析工具识别漏洞的有效性。

DASP3DASP^3中提供的分类法来描述以太坊智能合约的漏洞。每个收集的合同都归为十类之一。通过从三个不同的来源收集合同来创建此数据集:

  1. GitHub存储库;
  2. 分析合同的博客文章;
  3. 以太坊网络。

其中80%的合同是从GitHub存储库中收集的。每行包含一个漏洞类别。对于每个类别都提供一个描述(Description)、可以减轻攻击的级别(Level)、该类别中可用的合同数量(Contracts)以及该类别的合同中的代码行总数(lines of code,LOC)。

TABLE 3 数据集中可用漏洞的类别

image-20201009193623965

作者提供获取合同的URL及其作者来确保每个合同的可追溯性;数据集包含69个合约和115个带标签的漏洞,分为十类漏洞。并且将此数据集开源在SmartBugs

47,518 Contracts from the Ethereum Blockchain

SBWILDSB^{WILD},包含从以太坊区块链中提取的47,518个合约:这些合同的漏洞集是未知的;但是,该数据集可用于识别具有(潜在)漏洞并指示特定问题发生频率的真实合同。它也可以用于比较诸如性能等指标的分析工具。

TABLE 4 从以太坊区块链收集Solidity智能合约的统计数据。

image-20201009194431486

该数据集可在GitHub 上获得。数据集包含47,518个合约中每个合约的Solidity源代码。合同以合同地址命名;还为该数据集附加了其他信息,以便将该数据集用于其他类型的研究。它包含:

  • 合同名称;
  • 已用于编译合同的Solidity版本;
  • 重复合同的地址;
  • 与合同相关的交易数量;
  • 以Solidity代码行为单位的合同大小;
  • 2,263,096个合同的最后交易日期;
  • 2,263,096个合同的创建日期;
  • 972,975个有可用源代码的以太坊余额的合约。

The Execution Framework:SmartBugs

SmartBugs,这是一个执行框架,旨在简化智能合约数据集上分析工具的执行。
SmartBugs具有以下功能:

  • 一个插件系统,可基于Docker映像轻松添加新的分析工具;
  • 并行执行工具以加快执行时间;
  • 一种输出机制,可标准化工具输出结果的方式,并简化跨工具的输出过程。

Architecture

SmartBugs由五个主要部分组成:

  1. 第一个由使用SmartBug的命令行界面组成。
  2. 第二部分包含工具插件。每个工具插件均包含工具的配置。该配置包含Docker映像的名称,工具的名称,运行该工具的命令行,该工具的描述以及结果输出的位置。
  3. 存储在Docker Hub上的Docker映像。当已有Docker映像时,将使用工具的Docker映像;否则,将创建自己的映像(所有Docker映像(包括作者的)都可以在Docker Hub上公开获得)。
  4. 智能合约的数据集。
  5. SmartBugs的运行程序将SmartBugs的所有部分放在一起,以执行智能合约上的分析工具。

Dataset Interface Details

数据集接口详细信息:SmartBugs提供了一个命令行界面,可简化智能合约分析工具的执行。它需要一套工具名称和一个Solidity文件的路径来进行分析,并在每次执行时生成两个文件:

  1. 包含执行标准输出的result.log文件
  2. 包含执行结果的result.json文件,以可解析的格式进行分析。我们提供了处理这些输出的脚本,并将它们呈现在可读的表中。

Data Collection and Analysis

使用SmartBugs在两个数据集上执行了9种工具,收集了输出并用于进一步分析。

Tools’ Setup

我们将时间预算设置为每次分析30分钟。为了为一次执行一项工具而不是一份合约确定合适的时间预算,我们首先在摘要化的数据集上执行了所有工具。
然后,我们选择的时间预算要高于平均执行时间(1分44秒)。如果花费了时间预算,我们将停止执行并收集执行的部分结果。在执行实验期间,Manticore是唯一面临超时的工具

Large-scale Execution.

总共对47,518张合同执行了9种分析工具。这代表了428,337次分析,这些分析大约需要564天和3个小时的组合执行时间,超过一年的连续执行时间。使用了两个云提供商来租用该实验所需的服务器。
第一个提供商是Scaleway,我们在其中使用了三台服务器,这些服务器具有32个vCPU和128 GB的RAM。我们增加了500€的预算,并支出了474.99€。

第二个提供商是Google Cloud,使用了三台服务器和32个 vCPU,30GB RAM。我们在Google Cloud上花费了1038.46€。
我们总共花费了1513.45 €(折合11,971.44人民币)来执行本文中讨论的实验。

四、RESULTS

Precision of the Analysis Tools

用来该分析工具的精确度的方法如下:

  1. 我们在69个合同上执行了9个工具
  2. 将工具检测到的所有漏洞提取到JSON文件中。
  3. 我们将检测到的漏洞映射到漏洞类别。

手动将已检测到的所有漏洞类型注释为十个DASP类别之一。例如,Oyente检测到一个名为Integer Overflow的漏洞,该漏洞已链接到Arithmetic类别;总共确定了141个漏洞类型,其中97个已被标记。不幸的是,发现这9个工具中没有一个能够检测到不良随机性(Bad Randomness)和短地址(Short Addresses)类别的漏洞,工具不会检测某些类别的漏洞,因为它们并非旨在识别所有类型的漏洞。

TABLE 5 每个工具按类别识别的漏洞

image-20201009211425151

括号中显示了单个工具识别的漏洞数量

TABLE 6 每个工具检测到的漏洞总数

image-20201009211556647

回答RQ1:当前的分析工具在检测Solidity智能合约上的漏洞时的准确性如何?

通过将9个工具组合在一起,它们只能检测到所有漏洞的42%。这表明仍然存在提高智能合约漏洞检测方法的准确性的空间。我们注意到,在以下三个类别中,该工具在检测漏洞方面表现不佳:访问控制(Access Control),拒绝服务(Denial of service)和前端运行(Front running)。
它们无法通过设计漏洞来检测不良随机性和短地址类别中的漏洞。此外观察到,Mythril在检测到的漏洞数量(31/115,占27%)和针对的漏洞类别数量(5/9类别)方面胜过其他工具。
Mythril和Slither的组合可以检测到总共42/115(37%)的漏洞,这是准确性和执行成本之间的最佳折衷方案。

Vulnerabilities in Production Smart Contracts

为了研究检测合同中漏洞的能力,分析了9种选定工具从数据集sbwild中查找漏洞。我们采用了与先前研究问题相同的方法,但是,对于SBWILDSB^{WILD}来说,这里没有确定漏洞的预言。

表7列出了在47,518个合同上执行9个工具的结果。它表明,这9个工具能够检测八种不同类别的漏洞。请注意,HoneyBadger检测到的漏洞是看起来很脆弱但其实并不是漏洞的合同——它们旨在看上去容易受到攻击,以便从试图利用此漏洞的人们那里窃取以太币。总共,44,589份合同(93%)至少有一个漏洞被9种工具中的一种检测到。

TABLE 7 具有至少一个漏洞的合同总数

image-20201009214242623

image-20201009214917011

Figure 1:由一、二、三、四个或四个以上工具(4+)标识的漏洞比例

回答RQ2:以太坊区块链中存在多少个漏洞?
这9种工具可识别93%的合同中的漏洞,这表明误报率很高。仅Oyente,就能在73%的合同中检测到漏洞。通过组合使用工具来达成共识,观察到只有少数漏洞获得了四个或更多工具的共识:937个Arithmetic漏洞和133个Reentrancy漏洞。

Execution Time of the Analysis Tools

在本节中,我们介绍了分析sbwild数据集47,518所需的工具执行时间。为了衡量执行时间,我们记录了每个分析的开始时间和结束时间。

单个执行由以下步骤组成:

  1. 启动Docker镜像,将合同绑定到Docker实例;
  2. 清洗Docker容器;
  3. 解析日志并将其输出到results文件夹中。

表8列出了每种工具使用的平均时间和总时间。平均执行时间是在每个合同上执行该工具,包括编译,构建IR、图形、分析和解析结果。

Table 8: 每个工具的平均执行时间

image-20201009215326143

在表中,我们可以观察到三组不同的执行时间:执行需要几秒钟的工具,花费几分钟的工具和花费24分钟的Manticore。

  • Oyente,Osiris,Slither,Smartcheck和Solhint是速度更快的工具,平均需要5到30秒才能分析智能合约。
  • HoneyBadger,Maian,Mythril和Securify的执行速度较慢,执行时间介于1m24到6m37之间。
  • 最后,Manticore需要24分28秒。

工具之间执行时间的差异取决于每个工具使用的技术。诸如Smartcheck和Slither之类的纯静态分析工具之所以快速,是因为它们无需编译或执行合同即可识别漏洞和不良做法(bad practices)。

Securify,Maian,Mythril和Manticore分析合同的EVM字节码。这意味着这些工具需要在进行分析之前编译合同,附加的编译步骤会减慢分析速度。
Manticore是所有工具中最慢的,因为该工具一次仅分析一个内部合同(Solidity源文件可以包含任意数量的合同定义)。

回答RQ3:这些工具需要多长时间来分析智能合约?
这些工具平均需要4分31秒来分析一份合同。但是,各工具的执行时间差异很大。
Slither是最快的工具,平均只需5秒钟即可分析合同。
Manticore是最慢的工具。分析合同平均需要24分28秒。

我们还注意到执行速度并不是影响工具性能的唯一因素;Securify比Maian花费了更多的时间来执行,但是Securify可以很容易地并行化,因此分析47,518个合同的速度比Maian快得多。最后,并没有观察到准确性和执行时间之间的相关性。

五、SUMMARY & REVIEW

本文作者制作了两个很有用的数据集,并将它们公开出来。参考DASP10智能合约漏洞类别作为对漏洞进行分类,发现当前的技术水平无法检测DASP10的两类漏洞:随机性差和短地址。。最后,使用创建的可拓展的执行框架SmartBugs在两个数据集上执行9个自动化分析工具。

结果表明,所有工具仅检测到注释数据集中的漏洞的42%,其中Mythtil具有更高的准确性(27%),此外本文还提到如果要兼顾准确性和执行成本,那么Mythril和Slither的组合可以检测到总共42/115(37%)的漏洞,这是最佳折衷方案;

而对另一个数据集进行漏洞检测时,有97%的合同至少被一种工具检测到漏洞,这表明每种工具都可能存在着大量误报,而其中Oyente更是当仁不让地检测到73%的合同中的漏洞。

此外,本文提出现有的工具的检测能力还有待提高,而其中Mythril是具有较高准确性的工具,并且能够检测到31/115(27%)的漏洞。当对更大的数据集进行漏洞检测时,有97%的合同被确定为易受攻击,这表明存在着大量误报。

感觉文本作者不足在于,为了使得实验更加方便的进行或许排除了一些更加有用的方法,可能考虑地不是那么全面。