Slither:智能合约的领先静态分析工具
我们已在国际软件工程区块链新兴趋势研讨会(WETSEB,与ICSE联合举办)上发表了关于Slither的学术论文。Slither是我们的智能合约静态分析框架。
论文表明,Slither在速度、鲁棒性以及检测与误报平衡方面,其错误检测能力优于其他静态分析工具。论文详细介绍了基于静态单赋值(SSA)形式的复杂中间语言的使用,这是现代优化编译器发展的关键进步,使Slither能够快速有效地工作,并易于扩展到新任务。
概述与应用
首先,我们描述Slither的设计及其功能。Slither被设计为一个静态分析框架,提供关于智能合约代码的细粒度信息,并具有支持多种应用的灵活性。该框架目前用于以下方面:
- 自动化漏洞检测:无需用户干预或额外规范工作即可检测多种智能合约错误。
- 自动化优化检测:Slither检测编译器遗漏的代码优化。
- 代码理解:Slither总结并显示合约信息,以帮助您研究代码库。
- 辅助代码审查:用户可以通过其API与Slither交互。
Slither的工作流程如下:
- 它将以Solidity编译器生成的Solidity抽象语法树(AST)作为初始输入。Slither开箱即用,支持最常见的框架,包括Truffle、Embark和Dapp。您只需指向要分析的合约。
- 然后生成重要信息,例如合约的继承图、控制流图(CFG)以及合约中所有表达式的列表。
- Slither将合约代码转换为SlithIR,这是一种内部表示语言,使精确和准确的分析更易于编写。
- 最后,Slither运行一组预定义的分析,为其他模块提供增强信息(例如,计算数据流、受保护的函数调用等)。
图1:Slither的工作原理
Slither与其他工具的对比
我们论文的重要部分侧重于将Slither与其他智能合约静态分析工具进行比较。我们将Slither(版本0.5.0)与其他开源静态分析工具进行对比,以检测以太坊智能合约中的漏洞:Securify(修订版37e2984)、SmartCheck(修订版4d3367a)和Solhint(版本1.1.10)。我们决定几乎完全专注于工具的重入检测器,因为重入是最古老、最易理解且最危险的安全问题之一。图2显示了一个简单的可重入合约的经典示例,该合约可通过使用回调函数再次调用withdrawBalance来耗尽所有以太币。
图2:可被利用的重入合约
重入检测器是我们评估的所有工具中少数可用的检测器之一。此外,我们实验了一千个最常用的合约(交易数量最多的合约),Etherscan提供了源代码,以获得以下结果:
图3:Slither在各个方面均优于其他工具
使用一千个合约的数据集,每个工具在每个合约上运行,超时时间为120秒,仅使用重入检测器。我们手动禁用了其他检测规则,以避免在测量中引入偏差。
总之,我们在漏洞检测方面观察到以下优势:
- 准确性:误报、标记合约和每合约检测行总结了准确性结果。我们的实验显示,Slither是最准确的工具,误报率最低,为10.9%;其次是Securify,为25%。相反,SmartCheck和Solhint的误报率极高:分别为73.6%和91.3%(!)。
此外,我们还包括检测到至少一个重入的合约数量(标记合约)和每个标记合约的平均发现数。一方面,SmartCheck标记了更多合约,证实了其高误报率(它标记的合约数量约为Slither的七倍,误报率也大约高七倍)。另一方面,Securify标记的合约数量非常少,这表明该工具未能检测到其他工具发现的一些真正阳性;请注意,Securify标记的合约远少于Slither,但仍然标记了更多误报。
-
性能:平均执行时间和超时分析行总结了性能结果,确认Slither是最快的工具,其次是Solhint、SmartCheck,最后是Securify。在我们的实验中,Slither通常与简单的linter一样快。其他工具,如Solhint和SmartCheck,解析Solidity源代码或分析预编译合约,如Securify。
-
鲁棒性:失败分析行总结了鲁棒性结果,显示Slither是最鲁棒的工具,其次是Solhint、SmartCheck和Securify。Slither仅对0.1%的合约失败;同时,Solhint失败约为1.2%。SmartCheck和Securify的鲁棒性较差,分别失败10.22%和11.20%的时间。
我们还比较了Slither与Surya,这是最相似的智能合约代码理解工具。我们发现Slither包含了Surya提供的所有重要信息,但由于其执行的静态分析,能够集成更高级的信息。未包含更深层次分析的代码理解工具仅限于表面信息,而Slither易于扩展到更复杂的代码摘要任务。
演讲
本文将由我们的安全工程师Josselin Feist和Gustavo Grieco在2019年5月27日上午11点的WETSEB 2019上展示。
超越论文
Slither在不断进化。我们最近发布了版本0.6.4,自撰写论文以来添加了多项改进和功能,包括可升级合约的自动化检查和Visual Studio集成。我们自豪地拥有30多个开源检测器,Slither还有大约相同数量的私有检测器,用于竞态条件、弱加密和其他关键缺陷。
Slither是crytic.io的核心,我们的持续保障系统(想象为“Travis-CI但用于以太坊”),它释放所有Slither分析以保护智能合约。
如果您需要帮助将Slither集成到开发过程中,或想了解更多关于Slither的功能,请联系我们或加入Empire Hacking Slack。
如果您喜欢这篇文章,请分享: Twitter LinkedIn GitHub Mastodon Hacker News