智能合约是一旦部署,就可以在区块链上自主执行的程序。根据正在使用的区块链(以及智能合约部署的方法),这些智能合约可以在较小或较大程度上一成不变。一成不变的意义是,一旦部署,它们的创建者就不能修改它们。

如果您曾经开发过一款重要的软件,那么您就知道首次部署正确的软件是极其困难的,因为您开发的软件可能包含各种错误:

  • 逻辑错误
  • 业务错误
  • 安全漏洞

虽然逻辑和业务错误可以在一定程度上得到缓解,但区块链智能合约中的安全漏洞可能很难恢复。智能合约通常控制加密代币,这些加密货币不记名并且很容易转变为流动现金。这使得智能合同成为坏人非常有利可图的目标,他们希望利用某个错误或漏洞以快速获利,而他们被抓的风险相对较低。事实上,这是如此普遍,以至于区块链空间充斥着坏人利用智能合约谋取现实世界利益的事件。

预防胜过治愈

为了避免这些漏洞被利用,软件开发人员正在采用来自离链开发的技术,范围包括:

  • 遵循智能合同开发最佳实践
  • 通过彻底审查代码来审计他们的合约
  • 使他们部署的合约接受白帽黑客的检验

在这篇文章中,我们将重点介绍其中的第二个;审计您的智能合同,以便在部署之前发现漏洞。审计可以采取两种形式。首先,该领域的许多人都熟悉,由精通安全漏洞技术的专家团队手工审查您的智能合同的业务和编程逻辑。这些专家仔细研究您的智能合约的设计和源代码,目的是识别任何可能的漏洞。根据您的智能合同的大小和范围,此过程可能需要一周到几个月的时间,费用从5万美元到50万美元不等。智能合约审计是一项非常专业的技能,因此,该领域的许多新生项目都不太可能在项目内部拥有这样的专家。他们通常会依赖于委托外部组织进行审计。

即使有意委托外部安全审计的组织资金充足,通过这样的审计进行多次迭代的时间和成本可能仍然令人望而却步。因此,组织在将其智能合同部署到他们选择的区块链之前,会将此类审计留作最后一步。在这个敏捷开发的世界里,这感觉就像回到了瀑布式开发的旧时代。简而言之,手工安全审计是不可扩展的。

现在开始受到关注的第二种方法是使用智能合约分析工具,该工具对智能合约执行自动审查,以识别漏洞。虽然自动化分析的结果可能无法捕捉适当深入的手工安全审计所暴露的所有问题,但自动化分析确实具有相对较低的成本和比手工审计更方便的执行优势。这可以在开发周期内使用自动分析,以便在提交代码进行最终手工安全审计之前捕获潜在问题。自动化分析还使开发人员能够借助为数不多的专家级智能合约安全研究人员的成果,使自动化分析成为一种更具规模化的方法。

一种自动智能合约的漏洞分析方法

软件程序的自动化漏洞分析在Web、桌面和企业软件的离链世界中有着丰富的谱系,是一个研究得很好的领域。在设计自动化分析方法时,需要权衡两个主要领域:

  • 可重复性:需要采取哪些步骤才能准确触发漏洞,以确定漏洞是否可重现。某些分析方法可能无法捕获有关如何触发漏洞的信息,因此可能需要手动验证识别出的漏洞。
  • 语义洞察:深入了解程序或其部分的行为方式和原因。

通常,自动化分析不能同时优化重现性和语义洞察力。高重复性通常意味着低复盖率,因为要使结果可重现,分析需要能够理解如何到达被分析的代码;取消这一要求意味着分析可以实现更高的代码复盖率。但是,缺乏重复性会导致较高的误报率(即,对实际不存在的漏洞发出错误警报)。另一方面,高度的语义理解可能需要处理和存储大量数据。尝试既实现完全语义洞察又识别可重现漏洞的分析可能与通过其所有可能的输入排列来执行智能合约完全不同,对于足够复杂的智能合约而言,这通常无法做到规模化。

自动漏洞分析可以分为两种类型:

  • 静态漏洞分析:在运行智能合同之前识别缺陷
  • 动态漏洞分析:在运行智能合同之后识别漏洞

静态脆弱性分析

智能合约上的静态漏洞分析是通过对代码进行推理而不实际执行它来实现的。通常,分析是在智能合约源代码的某些表示形式上进行的,或者是源代码本身,或者是目标代码之上的某种中间形式。偶尔也可以对目标代码进行静态分析。

静态分析的优势是什么?

  • 它可以很好地覆盖正在分析的智能合约,并且通常可以覆盖所有可能的执行路径
  • 这样可以更容易地将漏洞追溯到代码中的确切位置

静态漏洞分析确实有一些不足之处:

  • 结果不可重现:通常不会捕获有关如何触发识别的漏洞的信息,因此可能需要验证漏洞以避免误报。
  • 缺乏语义洞察力:它们在较简单的数据域上操作,并且可能无法深入了解智能合约的一部分为什么会有漏洞,或者输入的哪些部分会导致行为异常

动态脆弱性分析

动态漏洞分析是通过在真实或虚拟处理器上执行智能合约并对其进行测试输入以验证其在各种条件下的行为来执行的。对智能合约进行单元测试以查找错误是最常见的动态分析方法之一。

自动动态分析技术分为两大类:具体执行和符号执行。

  • 具体的执行涉及按照用户提供的精心设计的测试用例正常运行智能合约。常见的动态具体执行技术是模糊测试,其中将格式错误的输入提供给智能合约以尝试发现漏洞。
  • 符号执行使用符号变量在仿真环境中执行智能合约,并在整个程序执行过程中跟踪智能合约的状态。在每个条件分支,分析器都会跟踪每条路径并保存路径条件。然后,分析器可以使用累积的路径条件来推断如何准确触发识别的漏洞。

但是,动态分析与静态分析相比效果如何呢?

动态分析的优势。

  • 由于您具有触发漏洞所需的输入或路径条件,因此识别出的漏洞具有很高的重复性
  • 它可以分析您无法访问实际代码的智能合约。

动态分析的缺点。

  • 模糊测试通常需要精心设计的测试用例,以避免仅识别肤浅的漏洞。
  • 与静态分析类似,模糊测试对输入的哪些部分导致漏洞被触发的语义洞察力有限。这使得追踪漏洞到代码中的确切位置变得更加困难。另一方面,符号执行提供了高度的语义洞察力。
  • 使用符号执行时,条件路径的数量导致要探索的可能路径呈指数增长,从而限制了对智能合约复杂性的分析。

由此可见,静态分析技术和动态分析技术各有优缺点。不能说一种技术绝对比另一种好。为了有效利用它们的不同属性,我们看到一些领先的智能合同分析工具供应商在其产品中同时使用这两种类型的分析。

以太坊和EOS的顶级漏洞分析工具

既然我们已经对不同的智能合约漏洞分析方法有了基本的了解,那么有哪些工具可以用来检查您的以太坊和EOS智能合约中的错误呢?

  1. MythX
    MythX logo
    将以太坊智能合约的静态、模糊和动态符号分析相结合的SaaS平台。由Consensys的一个spoke开发。提供一种API工具(如IDE、Web界面等)可用于在其应用程序中启用安全扫描。定价为每名用户199 DAI起。https://mythx.io/plans
  2. Mythril
    Mythril logo
    由MythX背后团队的一些成员开发。利用动态符号执行。开源,免费使用。
  3. Securify
    Chainsecurity logo
    用于执行静态分析的以太坊智能合同的在线开源安全扫描器。在线版是免费使用的,但需要签字转让提交的源代码的权利。
  4. Manticore
    Manticore logo
    开源的动态符号执行分析工具。可以分析以太坊智能合约和Linux ELF二进制文件。似乎一直在积极维护,在过去的3个月里对其Github存储库进行了多项更新。
  5. Smartcheck在线和开源静态分析工具,可将以太坊稳固代码转换为基于XML语言的表示形式,并根据该表示形式检查安全模式。它的Github存储库没有显示出太多最近活动的迹象。
  6. Octopus
    Octopus logo
    Octopus支持智能合约的基本分析,允许合约拆卸、控制流分析和将字节码转换为中间表示。虽然它是我们发现的为数不多的同时支持以太坊EVM和EOS的WASM字节码格式的工具之一,但它目前不能运行漏洞分析。那是通过动态符号执行的未来计划。它的Github存储库没有显示出太多最近活动的迹象。

结论

自动化漏洞分析是一个新兴领域,将有助于确保智能合约的安全。

可用的工具有多种,但这些工具主要针对以太坊生态系统。我们发现只有一款工具对EOS有最低限度的支持。

您知道我们应该在清单中包括什么工具吗?您认为自动化分析可以替代人工审查吗?请在评论中告诉我们您的想法。