一款名叫Slither的智能合约静态分析工具

2019-09-27 13:57:1011429人阅读


Slither是第一个开源的针对Solidity语言的静态分析框架。Slither速度非常快,准确性也非常高,它能够在不需要用户交互的情况下,在几秒钟之内找到真正的漏洞。该工具高度可配置,并且提供了多种API来帮助研究人员审计和分析Solidity代码。

最近有人发表了一篇关于Slither的学术论文,其中介绍了关于智能合约静态分析工具的框架。

该论文表明,Slither在检测智能合约漏洞时,其功能优于其他静态分析工具,在速度、检测准确性方面都有着先天优势。Slither包含了一整套针对Solidity(以太坊智能合约脚本语言)的专用静态分析工具,它可以用来检测可重用性、构造函数和方法访问等编码中的常见错误。本文介绍了有关如何使用基于静态单赋值(SSA)形式的复杂中间语言(这是现代优化编译器开发的一个关键进步),让Slither快速有效地完成其工作,并易于将Slither扩展到新任务。

精确的数据流分析是让编译优化能高效进行的基础。 SSA就是一种高效的数据流分析技术,目前几乎所有的现代编译器,如GCC、Open64、LLVM都有将SSA技术的支持, 不仅仅是编译器,Jikes RVM, HotSpot JVM, .Net的Mono,Python的Pypy, Andoroid的Dalvik,这些虚拟机/解释器中的Just-in-Time Compiler也有了SSA的支持。 Firefox的下一代JavaScript引擎IonMonkey中,也将为其JIT引入SSA。

可以看到,几乎所有热门的语言所用的热门编译器/解释器/虚拟机中都有了SSA。


背景介绍


首先,介绍一下Slither的设计原理以及它的功能。Slither被设计成一个静态分析框架,它提供关于智能合约代码的及其细粒度的信息,并具有支持许多应用程序所需的灵活性。该框架目前用于以下几个方面:

1.自动漏洞检测:无需用户干预或额外的规范工作,就可以检测到各种各样的智能合约漏洞。

2.自动优化检测;

3.代码理解:Slither会总结并显示合约的信息,以帮助你研究代码库;

4.辅助代码审查:用户可以通过其API与Slither进行交互。

Slither的工作原理如下:

1.它将Solidity编译器生成的Solidity Abstract Syntax Tree(AST)作为初始输入,Slither使用最常见的框架(包括Truffle,Embark和Dapp)开箱即用,你只需将Slither指向要分析的合约即可。

2.然后生成重要信息,例如合约的集合继承关系图,控制流图(CFG)以及合约中所有表达式的列表。

3.然后将合约代码翻译成SlithIR,SlithIR是一种内部表示语言,可以更容易地编写精确的分析。

4.最后,Slither运行一组预定义的分析,为其他模块(例如计算数据流、受保护的函数调用等)提供更有帮助的信息。

1560073428393545.png


Slither与其他智能合约静态分析工具进行比较


本文的一个重要部分是将Slither与其他智能合约静态分析工具进行比较,我们将Slither(版本0.5.0)与其他开源静态分析工具进行对比,以检测以太坊智能合约中的漏洞,对比的对象有:Securify(版本37e2984),SmartCheck(版本4d3367a)和Solhint(版本1.1.10)。我们决定以检测可重入漏洞作为评估检测好坏的标准,因为可重入漏洞是最古老,最易理解和最危险的安全问题之一。如果一个函数在执行完成前被调用了数次,发生意料不到的行为时,可重入漏洞就可能出现。可重入性问题在被编写到智能合约中的区块链安全漏洞中可能排在最高的位置。可重入性通过对同一事务的多个支出来消耗一个帐户。处理退款的用例适合这种利用,但是如果不在设计和编码阶段解决,这种缺陷就会影响到所有事务。在迄今为止最臭名昭著的加密货币攻击之一中,DAO黑客就利用了可重入性。没有组织领导决定如何运行DAO(分散的自治组织),使他们能够对投资的项目进行投票。

它在第一个月筹集了超过1.5亿美元的资金。2016年6月17日,黑客从该组织的“重入性”漏洞中抽走了5000万美元。从以太经典(ETC)到以太币(ETH)的硬叉导致了解决这次黑客攻击所产生问题的所有努力。

代码脆弱的可重入性逻辑看起来是这样的:

以下是处理支付()的函数过程:

1.检查交易的有效性、收款人和账户余额;

2.处理交易;

3.更新系统状态,以显示已处理了事务。

乍一看,逻辑看起来是正确和完整的,但缺陷在于步骤3之前执行步骤2的顺序。

对函数的第一次调用将继续处理步骤2,而对同一事务的另一次调用则可以输入该函数。由于状态信息仍处于初始状态,尚未在步骤3中处理,因此第二个调用将检查为要处理的有效事务。

因此,该系统第二次为同一义务支出货币。黑客在状态正确设置之前,将多个事务快速地发送到函数中。

图2显示了一个简单的可重入合约攻击的示例,该合约可以通过使用再次调用withdrawBalance的回退函数调用withdrawBalance来利用它来消耗所有以太。

1560073433234485.png

可重入性检测器是我们评估的所有工具中为数不多的可用工具之一,此外,我们对Etherscan(以太坊官方数据浏览器,一直被行业作为链上数据查询和数据分析的基础工具广泛使用)提供源代码的一千个最常用的合约(交易数量最多的合约)尝试着进行了测试,获得的测试结果如下。

1560073439589476.png

使用一千个合约的数据集,这些工具在每个合约上运行,超时时间为120秒,只使用可重入检测器。我们手动禁用了其他检测规则,以避免在测量中引入偏差。

综上所述,我们发现Slither在漏洞检测方面有以下优势:

1.准确性:每一行的误报、标记的合约和检测总结了准确性结果。测试结果表明,Slither是最准确的工具,误报率最低,为10.9%;其次是Securify,为25%。SmartCheck和Solhint的误报率极高:分别为73.6%和91.3%。

此外,我们还检测到至少一个可重入性的合约的数量(标记的合约)和每个标记的合约的平均发现数量。一方面,SmartCheck标记了更多的合同,证实了它的高误报率(它标记的协议数量是Slither的七倍,误报率大约高出七倍)。另一方面,Securify标记了非常少量的合约,这表明该工具无法检测到其他工具发现的一些真实检测。请注意,Securify标记的合约远远少于Slither,但仍会标记更多的误报。

2.性能:对比平均执行时间, Slither是最快的工具,其次是Solhint,SmartCheck,最后是Securify。在我们的测试中,Slither通常和简单的linter一样快。

3.鲁棒性:鲁棒是在异常和危险情况下系统生存的关键。比如说,计算机软件在输入错误、磁盘故障、网络过载或有意攻击情况下,能否不死机、不崩溃,就是该软件的鲁棒性。测试结果显示Slither是最强大的工具了,其次是Solhint,SmartCheck和Securify。Slither只在0.1%的合同中失败了,与此形成对比的是,Solhint是1.2%,SmartCheck和Securify的稳健性较差,分别为10.22%和11.20%。

我们还将Slither与Surya进行了比较,Surya是用于智能合约代码理解的工具。我们发现Slither包含了Surya提供的所有重要信息,但由于Slither执行的是静态分析,所以它能够获取更多更细粒度的信息。另外,Slither Slither很容易扩展到更复杂的代码汇总任务。


总结


Slither自从被开发出来,技术迭代速度很快。开发者最近发布了Slither0.6.4版,对其做了一些技术改进并添加了一些功能,包括可升级合约的自动检查和Visual Studio集成。目前Slither已经拥有30多个开源探测器,且拥有大约相同数量的私人探测器,适用于竞态条件、弱加密和其他关键漏洞的检测。

如果你需要将Slither集成到你的开发过程中,或者你想了解有关Slither功能的更多信息,请点此。 


本文翻译自:https://blog.trailofbits.com/2019/05/27/slither-the-leading-static-analyzer-for-smart-contracts/

原文地址: https://www.4hou.com/tools/18473.html

翻译作者:lucywang

0
现金券
0
兑换券
立即领取
领取成功