Slither:智能合约的领先静态分析工具
我们已在国际软件工程区块链新兴趋势研讨会(WETSEB)上发表了关于Slither的学术论文,该研讨会与ICSE联合举办。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并利用回调函数再次调用withdrawBalance来耗尽所有以太币。
图2:一个可 exploited 的重入合约
重入检测器是我们评估的所有工具中少数可用的之一。此外,我们实验了一千个最常用合约(交易量最大的合约),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