一种以太坊虚拟机的模糊测试方法
- 国知局
- 2024-08-05 12:14:17
本发明涉及软件测试领域,具体涉及一种以太坊虚拟机的模糊测试方法。
背景技术:
1、区块链是一种去中心化的分布式数据库技术,通过将数据以区块的形式链接起来,实现了对交易信息的不可篡改和可追溯性。其中,以太坊(ethereum)是一种基于区块链技术的开源平台,旨在为智能合约的部署和执行提供支持。相较于比特币等其它区块链平台,以太坊最大的特点在于其具有图灵完备的虚拟机,使得开发者可以编写复杂的智能合约和去中心化应用。
2、以太坊虚拟机(ethereum virtual machine, evm)是以太坊网络中智能合约的运行环境,它是一个基于栈的虚拟机,专门用于执行以太坊智能合约的字节码。evm采用了简单而高效的指令集,通过栈来处理数据和执行计算。不同于传统计算机的物理硬件虚拟机,evm是一个完全虚拟的运行环境,存在于以太坊网络的每个节点上,确保了智能合约的执行结果在整个网络中的一致性。
3、以太坊的蓬勃发展吸引了其它区块链平台的注意,一些区块链为了复用以太坊生态丰富的工具链,同时为了避免以太坊主网上高额的燃料费用并获得更快的交易处理速度,实现了自己的evm以提供对以太坊智能合约的支持。如果这些虚拟机的实现中存在错误,则可能导致智能合约被错误执行,对用户链上资产造成损失乃至影响相关区块链平台的稳定运行。
4、现有工作在执行目标合约时,只提供了固定的前置状态,无法生成更复杂的账户状态,即除了待执行的合约外,其它账户的状态是固定的,这限制了挖掘以太坊虚拟机漏洞的能力。 同时,现有的以太坊虚拟机模糊测试方法基于真实智能合约的抽象语法树进行变异来生成虚拟机字节码。这种方式无法进行更细粒度的,字节码级别的变异,故而无法检测虚拟机更底层的操作是否实现正确。此外,现有工作仅通过比较燃料消耗费用和操作码序列长度是否一致来发现漏洞,忽略了执行时虚拟机的状态以及执行结束后各个账户的状态,这可能导致潜在的缺陷被遗漏。
技术实现思路
1、为解决上述工作中存在的问题,本发明提供一种以太坊虚拟机的模糊测试方法,该方法通过生成复杂的以太坊交易和执行交易前的以太坊状态,能够更有效地挖掘不同以太坊虚拟机实现中的漏洞。
2、本发明的目的通过如下的技术方案来实现:
3、一种以太坊虚拟机的模糊测试方法,包括以下步骤:
4、步骤一:对以太坊虚拟机进行代码插桩,以收集测试用例执行过程中覆盖的代码执行路径;
5、步骤二:构建种子测试用例,组成初始的测试用例集合,并根据覆盖的代码路径和执行时长对测试用例进行排序:
6、所述测试用例包括一条以太坊交易的描述和执行交易前的以太坊账户状态;所述执行交易前的以太坊账户状态包括多个以太坊账户,每个以太坊账户对应一个唯一的地址,其状态包括余额、随机数、存储和部署的代码;
7、测试用例集合中的测试用例排序规则为:按照覆盖的代码路径的数量从高到低进行排序;对于覆盖的代码路径的数量完全相同的测试用例,则按照执行时长从短到长进行排序;
8、步骤三:从所述测试用例集合中选择一个排序靠前的测试用例,对其进行一个随机的变异操作来修改被选中测试用例的内容;
9、步骤四:将变异后的测试用例提供给不同以太坊虚拟机作为输入,不同以太坊虚拟机根据测试用例设置执行交易前相关以太坊账户的状态,随后执行该测试用例中的以太坊交易;收集所述以太坊虚拟机执行过程中覆盖的代码路径和用于比较的状态;
10、步骤五:如果测试用例在执行时覆盖了新的代码路径,则将其添加到所述测试用例集合中;随后对所有以太坊虚拟机上收集到的状态进行比较,如果存在差异,则说明被测试虚拟机的实现存在问题,输出当前的测试用例,随后结束测试;否则返回步骤三。
11、进一步地,所述步骤三中的所述变异操作包括:
12、随机修改以太坊交易中的字段;
13、随机增加或者删除一个以太坊账户;
14、随机修改一个以太坊账户的余额;
15、随机修改一个以太坊账户的随机数;
16、随机修改一个以太坊账户的存储;
17、随机修改一个以太坊账户部署的代码。
18、进一步地,在随机修改以太坊交易中的字段时,结合以太坊虚拟机的语义和当前以太坊账户状态进行变异;
19、对于交易中的燃料限制字段,在一定范围内随机生成一个数值,该范围能确保虚拟机既不会由于燃料过少而拒绝交易,也不会因为燃料数目过大而进入无限循环;
20、对于交易中的接收者和区块创建者字段,从当前测试用例的所有以太坊账户的地址中随机选择一个作为其新值;
21、对于交易中的输入字段,若当前交易属于一条合约创建交易,则将输入视作一段账户的代码进行变异,否则将其视作随机的字节数组进行变异;
22、对于访问列表字段,基于当前测试用例中存在的所有以太坊账户地址和存储来随机生成;
23、对于其它字段,则采用随机数生成器直接生成。
24、进一步地,对于访问列表字段,基于当前测试用例的所有以太坊账户的地址和存储来随机生成,具体包括:
25、随机增加一个元组,其包含一个地址和一个由多个存储键值组成的列表;
26、随机复制一个元组;
27、随机删除一个元组;
28、随机选择一个元组,并在存储键值列表中随机增加一个存储键值;
29、随机选择一个元组,并在存储键值列表中随机复制一个存储键值;
30、随机选择一个元组,并在存储键值列表中随机删除一个存储键值。
31、进一步地,在随机修改一个以太坊账户部署的代码时,首先利用模拟执行技术将字节码转换成一种线性中间表示,随后基于所述线性中间表示进行变异,在变异结束后重新将所述线性中间表示转换成字节码。
32、进一步地,利用模拟执行技术将字节码转换成一种线性中间表示,具体包括:
33、需要根据以太坊虚拟机字节码的规范,基于一个模拟栈来执行待变异的字节码;在执行过程中,针对所有非push、pop、dup或swap的字节码,生成一条对应的指令,并根据所述规范将栈顶相应数量的元素弹出作为指令的参数;若该字节码产生返回值,则还要生成一个新的变量,作为指令的返回值并将其压入栈顶;执行过程中所有的指令被依次添加到一个列表中,执行结束后,该列表即为生成的线性中间表示。
34、进一步地,基于所述线性中间表示进行变异,具体包括:
35、随机生成一条指令;
36、随机复制一条指令;
37、随机删除一条指令;
38、随机将一条指令替换成另外一条返回值类型相同的指令;
39、根据指令的规范随机修改一条指令的参数;
40、进一步地,所述步骤四中,所述用于比较的状态包括:虚拟机执行过程中栈、内存、程序计数器、字节码的值以及执行结束后各个以太坊账户的状态。
41、一种以太坊虚拟机的模糊测试装置,包括一个或多个处理器,用于实现以太坊虚拟机的模糊测试方法。
42、一种电子设备,包括:
43、一个或多个处理器;
44、存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述电子设备执行时,使得所述电子设备实现以太坊虚拟机的模糊测试方法。
45、本发明的有益效果如下:
46、本发明支持生成复杂的账户状态和交易,以测试各个虚拟机在复杂账户状态下的执行结果是否一致,从而挖掘到更多潜在的漏洞。本发明基于中间表示来生成以太坊虚拟机的底层字节码,支持更细粒度的变异,进而能够更有效地检测虚拟机底层的操作是否实现正确。
本文地址:https://www.jishuxx.com/zhuanli/20240802/261724.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 YYfuon@163.com 举报,一经查实,本站将立刻删除。
下一篇
返回列表