EVM *:从以太网虚拟机的离线检测到在线加固

EVM *:从以太网虚拟机的离线检测到在线加固

摘要

对以太坊交易的攻击可能是危险的,因为它们可能导致巨额资金损失。有许多工具可以检测智能合约中的漏洞,以避免潜在的攻击。但是,我们发现合同中仍有许多错过的漏洞。受此启发,我们提出了一种方法,可以强化EVM,即使智能合约包含漏洞,也能实时阻止危险交易。基本上,该方法包括三个步骤:监控策略定义,操作码结构维护和EVM仪器。监控策略定义是指在事务执行期间测试是否存在危险操作的特定规则。操作码结构维护是维护一个结构来存储规则相关的操作码并在操作执行之前对其进行分析。 EVM仪器在EVM源代码中插入监视策略,中断机制和操作码结构操作。为了评估,我们在js-evm上实现了EVM *,这是一个用javascript编写的广泛使用的EVM平台。我们使用已知错误在线收集10份合同并使用每份合同执行危险交易,所有这些合同都被我们强化的EVM *打断,而原始EVM允许所有攻击交易。对于时间开销,增强的EVM *比原始的EVM *慢20-30%,这对于金融关键应用是可以容忍的。

介绍

为解决安全问题,许多研究人员试图提高智能合约的稳健性。 智能合约的测试工具主要利用模糊测试和符号执行技术。 基于模糊测试的工具包括Echidna [1]和ContractFuzzer [2],[3]。 这些工具模拟大量事务的执行,以查找合同中的漏洞。 一些着名的符号执行工具是Oyente [4],[5],Manticore [6]和Mythril [7]。 符号执行工具可以触发关键路径并检测安全漏洞。 所有这些工具在检测智能合约中的潜在威胁方面表现良好。

但是,在行业惯例中,我们发现上述工具往往会漏掉某些漏洞。例如,我们在具有已知时间戳错误的合同上运行ContractFuzzer 2小时,但未检测到该错误。这表明仅关注合同级别是不完整的,因此我们尝试在EVM级别解决此问题。在本文中,我们提出了一种强化EVM平台的方法。它包括三个步骤:监控策略定义,操作码结构维护和EVM仪器。监视策略定义提供了一种特定的方法来确定在执行事务期间是否存在危险操作.操作码结构维护是在执行任何操作之前维护一个结构来存储有趣的操作码以进行分析。 EVM仪器是在EVM源代码的适当位置插入监视策略,中断机制和操作结构操作的过程。通过这种方式,强化的EVM *可以实时阻止危险的交易。

加固方法

我们现在描述加强EVM的方法。增强型EVM *的框架包含三个主要组件,如图1所示。 监控策略是指定义操作码序列是否危险以及如何停止危险事务的方法。 操作码结构维护包含三个部分 - 初始化,记录和运行时决策分析。 最后一个组件是EVM仪器。 在此组件中,监控策略和结构操作将插入到EVM源代码中,从而导致EVM *的强化。

EVM *:从以太网虚拟机的离线检测到在线加固

图1:强化EVM *的框架。 它主要由三部分组成:运行时错误检测的监控策略定义,操作监控的操作码结构

A.监测战略

监控策略是强化EVM *中最重要的部分。具体策略由两部分组成:有趣的操作码和操作码序列的约束。

作为示例,我们将解释如何定义溢出错误和时间戳错误的策略。

1)溢出错误:为了推断在事务中是否发生溢出操作,有趣的操作码可能包含ADD,SUB,MUL,ADDMOD,MULMOD和EXP。在溢出情况下,需要满足的约束如下所示。违反任何这些约束可能会导致溢出问题。

•如果两个正数执行添加操作,但操作结果为负

•如果两个负数执行添加操作,但操作的结果为正。

•如果正数减去负数,但结果为负数。

•如果负数减去正数,但结果为正数。

•如果两个正数执行乘法运算,但运算结果为负。

•如果两个负数执行乘法运算,但运算结果为负。

2)时间戳错误:时间戳错误的敏感操作码是TIMESTAMP。如果调用call()函数(即事务的开头)的值大于零,或者call()函数尝试将一些以太符号发送到其他合约,那么如果发生TIMESTAMP操作码,则可能存在时间戳错误。

B.操作码结构维护

操作码结构是用户定义的结构,用于记录与危险操作分析相关的有趣操作码和运行时信息。 在每个调用过程中,首先将初始化结构。 在执行每个操作码之前,将更新和分析结构。 如果结构中的操作码序列被认为是危险的,违反了监控策略模块中定义的任何约束,则将执行中断过程。

C. EVM仪器

EVM仪器模块--仪器监控EVM源代码中的策略和中断机制。应在EVM项目文件夹中的新文件中监视策略。每个策略都需要包装到一个返回布尔类型的函数中。中断机制可以包装成能够终止EVM的功能。对于操作码结构的操作,应该在检测到CALL操作码之后的位置插入结构的初始化过程。在每个操作执行之前,应使用每个监视策略函数测试操作码结构。整个检测过程显示在Algorithm 1中。仪表过程的输入是监控策略和中断机制。如第1-2行所示,应定义新功能以实施监控和中断过程。对于事务的每个操作码,如果它是一个CALL操作码,则初始化一个名为op_Stack的新堆栈,并将第一个项目推入堆栈,如第4-7行所示。如果它是我们关注的一个有趣的操作码,那么它将首先被推入堆栈。然后,每个监控策略将测试当前堆栈是否安全。如果通过任何策略检测到堆栈是危险的,则执行被中断,如第10-13行所示。如果未检测到危险操作,则操作码将按第15行所示执行。

EVM *:从以太网虚拟机的离线检测到在线加固

评估

在我们对强化EVM *的评估中,我们将回答以下问题:

Q1。 强化的EVM *平台能否检测到交易中的漏洞并阻止易受攻击的执行?

Q2。 加强EVM *执行不同交易的时间开销是多少?

为了回答第二个问题,我们使用模糊测试环境在原始EVM上进行交易并强化EVM *。我们计算两个版本在时间限制内进行的交易量,以评估时间开销。

强化EVM的有效性:

EVM *:从以太网虚拟机的离线检测到在线加固

表I列出了增强型EVM *与原始EVM相比的实验结果。 表中的圆圈符号表示基于合同执行的所有交易直到

从表的第三列和第四列,我们发现对于原始EVM,允许所有危险事务都在运行。 但是,强化的EVM *已经阻止了所有危险交易的执行。 此外,正如第二列所示,模糊测试环境只检测到50%的漏洞,这意味着可以通过手动修改合同来避免检测到的漏洞,其他50%仍然可以利用。 强化的EVM *可以成功地阻止危险事务在检测到任何问题时执行,这可以有效地确保事务的安全性,即使已部署的合同存在漏洞。

在模糊测试未检测到的五个合同中,我们分析了其中一个名为overflow_simple_add.sol的合同。 合同的源代码是:

EVM *:从以太网虚拟机的离线检测到在线加固

该合约只有一个名为add的函数,该函数接收名为deposit的输入,其类型为uint256。 在函数add中,将一个名为balance的变量与输入变量一起添加,结果将存储在变量balance中。 但是,因为变量余额的值是1,所以只有当存款的值是uint256可以表示的最大数量时,才会发生溢出.Fuzzing工具很难生成输入,这个输入可能是uint256的最大数量。 因此很难发生溢出情况。 但是当我们输入最大值以进行危险的事务时,强化的EVM *成功地阻止了事务的执行。 在模糊测试工具和符号执行工具中,常见的问题是测试无法找到某些极端情况下会出现的错误。 但是,增强的EVM *能够实时检测错误并及时停止交易。

增强型EVM的时间开销*:

我们计算每个合同实验期间的总交易额。结果如图2所示。

EVM *:从以太网虚拟机的离线检测到在线加固

图2:强化EVM上交易执行的时间开销*

表中数字的单位按每秒事务数计算,缩写为tx / s。我们使用四种类型的EVM计算交易:原始EVM,具有溢出策略的EVM *,具有时间戳策略的EVM *以及具有两种策略的EVM *。对于每个版本,我们计算每个合约的最小,最大和平均交易金额。如数据所示,交易金额受合约规模的影响很大,因为合约越大,交易需要调用的功能越多。此外,具有溢出策略的强化EVM *比原始速度慢22.16%。采用时间戳策略的增强型EVM速度降低了28.98%。两种策略的强化EVM较慢,降幅为32.95%。时间开销主要来自结构的维护以及遇到有趣操作码时每个监控策略的遍历。总之,强化EVM *的时间开销与我们添加到EVM中的监控策略的数量和合同规模有关。与模糊测试时间相比,金融关键应用程序的开销是可以容忍的。

讨论:

加强EVM *的一个潜在威胁是用于监控漏洞的策略的设计。 我们提出的方法只是说明如何加强原始的EVM,但应该认真考虑和设计详细的策略。 第三节介绍了用于测试溢出和时间戳错误的监控策略。 不恰当的策略可能会导致一些错误警报以及一些错过警报。

此外,监控策略对增强型EVM的时间开销有很大影响。 我们还对三种类型的错误实施了强化,五种策略的开销不会增加太多,因为主要的开销是由仪器和操作码收集引起的,而不是由约束检查引起的。

结论

我们提出了框架EVM *来强化EVM平台并保护交易不受攻击。与原始EVM相比,强化EVM *可以实时停止危险交易的执行。此外,我们的工作可以弥补测试工具。 测试工具可能会错过某些错误,而强化的EVM *可能会在发现可疑操作时中断事务。 对于时间开销,增强型EVM *平均比原始速度慢20-30%。 我们未来的工作将侧重于探测策略的探索,并尝试涵盖更多类型的错误,如危险的委托调用和重入错误。 此外,我们将尝试在更多EVM版本上实施我们的方法。

参考文献:

[1] trailofbits, "echidna: Ethereum fuzz testing framework.",https://github.com/trailofbits/echidna, accessed 14-November-2018 [2] trailofbits, "The Ethereum Smart Contract Fuzzer for Security Vulnerability Detection", https://github.com/trailofbits/echidna, accessed 14-November-2018

[3] Jiang B , Liu Y , Chan W K . ContractFuzzer: Fuzzing Smart Contracts for Vulnerability Detection[J]. 2018.

[4] melonproject, "Oyente: An Analysis Tool for Smart Contracts.", https://github.com/melonproject/oyente, accessed 14-November-2018

[5] Luu L, Chu D H, Olickel H, et al. Making Smart Contracts Smarter[C]//

ACM Sigsac Conference on Computer and Communications Security.ACM, 2016:254-269.

[6] trailofbits, "Manticore",https://github.com/trailofbits/manticore,accessed 14-November-2018

[7] mythril-classic, "Mythril-classic", https://github.com/ConsenSys/mythril classic/tree/develop/mythril/ethereum/interface/rpc, accessed 14-November-2018

致谢

本文由南京大学软件学院2019级硕士刘芳潇翻译转述


分享到:


相關文章: