一种提高智能合约检测覆盖率的方法、电子设备及存储介质技术

技术编号:35481917 阅读:15 留言:0更新日期:2022-11-05 16:33
一种提高智能合约检测覆盖率的方法、电子设备及存储介质,属于以太坊智能合约安全技术领域。为解决现有智能合约检测工具分支覆盖率低的问题。本发明专利技术提取智能合约的字节码和ABI作为函数的输入参数;生成测试用例,然后执行智能合约的模糊测试,采用智能合约中特定指令作为污点源,识别函数的输入参数,将其标记为污点,并存储污点信息;定义污点的传播策略,对于执行智能合约的模糊测试过程中未覆盖的分支语句设为污点汇识别并记录语句中包含的污点信息,然后选择被突变的输入参数,固定其他输入参数不变,进行测试用例的突变,将得到的突变的测试用例集执行智能合约,进行模糊测试,直到达到预设的时间或满足所有的分支。本发明专利技术分支覆盖率高。发明专利技术分支覆盖率高。发明专利技术分支覆盖率高。

【技术实现步骤摘要】
一种提高智能合约检测覆盖率的方法、电子设备及存储介质


[0001]本专利技术属于以太坊智能合约安全
,具体涉及一种提高智能合约检测覆盖率的方法、电子设备及存储介质。

技术介绍

[0002]近年来,以太坊因创造性地将智能合约部署到区块链而迅速发展,其总市值成为仅次于比特币的第二大加密货币。智能合约是可以在区块链上执行的图灵完备程序。它允许在不同的匿名方之间执行受信任的事务和协议,而不需要第三方。这些交易和协议是可追溯的、不可逆的、透明的。因此,智能合约被广泛的用来管理有价值的数字资产。
[0003]然而,由于图灵完备性,Solidity发展时间较短,相对于传统的编程语言而言更容易出错,这使得智能合约成为区块链安全中最薄弱的环节之一。另外,在区块链中引入智能合约的目的是利用区块链特征来保证智能合约的可信性,但由于智能合约存在漏洞,会违反这些特征,使其失去意义。为了解决这个问题,以太坊发生了硬分叉,不仅造成了经济上的损失,还引发了关于区块链不可变性的巨大争议。因此,在智能合约部署上链之前,安全检测尤其必要。
[0004]目前已经提出了一些用于测试智能合约漏洞的工具,在这些工具中使用的一种重要方法是模糊测试。与符号执行相比,模糊测试可扩展且高效。模糊测试依赖于运行时信息,目前先进的工具如ContractFuzzer、sFuzz等均使用了模糊测试技术,其以发展成为智能合约测试和漏洞检测的主流技术。虽然现有的智能合约模糊测试器在漏洞检测方面取得了很大进展,但是没有考虑程序中的数据流,随机的改变输入参数,不能有效地满足深度嵌套约束等难以覆盖的条件语句,这导致了较低的检测效率和分支覆盖率,使得深层次的条件分支难以覆盖。更严重的是,如果智能合约模糊测试器不能检查这些难以覆盖的条件语句,它们可能为对手提供机会注入漏洞,然后在智能合约部署后发起攻击

技术实现思路

[0005]本专利技术要解决的问题是现有智能合约检测工具分支覆盖率低的问题,本专利技术提出一种提高智能合约检测覆盖率的方法、电子设备及存储介质,基于动态污点分析的高效的、有针对性的突变方法,解决分支覆盖率低的问题。
[0006]为实现上述目的,本专利技术通过以下技术方案实现:
[0007]一种提高智能合约检测覆盖率的方法,包括如下步骤:
[0008]S1、利用智能合约的字节码和ABI作为输入;
[0009]S2、生成测试用例:根据步骤S1的ABI生成多笔交易,每笔交易调用智能合约中的一个函数,其中交易涉及的函数的输入参数随机生成,将多笔交易组合,生成函数的调用序列,即为测试用例;
[0010]S3、执行智能合约的模糊测试:根据步骤S2生成的测试用例执行智能合约的字节码,设初始的种子集为空,一个测试用例执行到一个新的分支时将该测试用例添加到种子
集中,对于未被覆盖的分支,将距离未覆盖分支距离最近的测试用例添加到种子集中,其中距离的定义利用绝对距离,并执行步骤S4的动态污点分析;
[0011]S4、动态污点分析:采用智能合约中CALLDATALOAD指令作为污点源,识别步骤S2中包括的函数的输入参数,将每个函数的输入参数标记为污点,并存储污点信息;定义污点的传播策略,并在执行智能合约的模糊测试过程中跟踪污点的传播,并记录执行路径上遇到的分支语句中包含的污点信息;对于执行智能合约的模糊测试过程中未覆盖的分支语句设为污点汇识别并记录语句中包含的污点信息;
[0012]S5、选择被突变的输入参数:定义智能合约模糊测试过程中被突变输入参数的选择策略,并根据步骤S4动态污点分析的结果寻找被突变的输入参数集合,若存在,则该输入参数集合被突变,若不存在突变的输入参数集合,则根据记录的执行路径上所遇到的分支语句中包含的污点信息以及未覆盖分支中包含的污点信息,将分支中涉及的污点中包括的输入参数取并集,作为被突变的输入参数集合;
[0013]S6、根据步骤S5得到的被突变的输入参数集合突变种子集中对应该分支所保存的测试用例中涉及的函数输入参数,固定其他的输入参数,减少无效突变,突变种子集中的测试用例,突变的策略遵循AFL设定;
[0014]S7、根据步骤S6得到的突变的测试用例集执行智能合约,进行模糊测试;
[0015]S8、重复步骤S4到S7的过程,直到模糊测试过程达到预设的时间或满足所有的分支。
[0016]进一步的,步骤S1中若提供了智能合约的源代码,则将智能合约的源代码编译为字节码和ABI。
[0017]进一步的,步骤S4中CALLDATALOAD指令从交易的数据部分读取函数的参数并压入堆栈的顶部,其操作数为该参数在数据中的偏移量,将该指令作为污点源,当程序执行到该指令时,向程序中引入污点,采用key

value的形式存储污点信息,key为堆栈顶部的位置,value为输入参数的偏移量,使用value来区分不同的输入参数。
[0018]进一步的,步骤S4中定义污点的传播策略的具体实现方法包括如下步骤:
[0019]S4.1、根据以太坊虚拟机中stack、memory和storage不同的数据存储类型,将其命名为污点信息1,污点信息2,污点信息3,为了描述污点的传播过程,考虑污点在不同的数据存储类型中的传播,对三个不同键

值对结构存储污点信息进行维护;
[0020]S4.2、采用过污染的污点传播策略,当指令的操作数中存在污点数据时,将操作结果标记为污点数据,污点标记为操作数拥有的标记;
[0021]S4.3、当调用POP指令,污点数据从stack中移除出去,则污点数据对应的污点信息删除。
[0022]进一步的,步骤S4中动态污点分析具体实现方法包括如下步骤:
[0023]S4.4、将JUMPI指令定义为污点汇;
[0024]S4.5、检测流入条件的污点信息,然后将涉及的输入参数的污点信息存储到键

值对的数据结构中,命名为Jumpi污点信息,该数据结构的键是JUMPI指令对应的程序计数器,值是流入该分支条件中涉及的污点集合;
[0025]S4.6、保存位于同一函数中的分支语句的依赖关系,用来对需要突变的输入参数进行筛选,命名为支配污点信息,该数据结构的键是JUMPI指令对应的程序计数器,值是执
行路径上涉及的程序计数器的集合。
[0026]进一步的,步骤S5定义智能合约模糊测试过程中被突变输入参数的选择策略的具体实现方法包括如下步骤:
[0027]S5.1、根据步骤S4动态污点分析的结果,找到未覆盖分支语句中包含的输入参数集合,记为Q,即Q为以当前指令的程序计数器为键所对应的Jumpi污点信息中的值;
[0028]S5.2、根据步骤S4动态污点分析的结果,找到执行路径上涉及的全部条件语句,记为P,即P为以当前指令的程序计数器为键所对应的支配污点信息中的值,并对P中包括的语句中包含的输入参数取并集,记为N,即N为以P中包括的程序计数器为键所对应的Jumpi污本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种提高智能合约检测覆盖率的方法,其特征在于:包括如下步骤:S1、利用智能合约的字节码和ABI作为输入;S2、生成测试用例:根据步骤S1的ABI生成多笔交易,每笔交易调用智能合约中的一个函数,其中交易涉及的函数的输入参数随机生成,将多笔交易组合,生成函数的调用序列,即为测试用例;S3、执行智能合约的模糊测试:根据步骤S2生成的测试用例执行智能合约的字节码,设初始的种子集为空,一个测试用例执行到一个新的分支时将该测试用例添加到种子集中,对于未被覆盖的分支,将距离未覆盖分支距离最近的测试用例添加到种子集中,其中距离的定义利用绝对距离,并执行步骤S4的动态污点分析;S4、动态污点分析:采用智能合约中CALLDATALOAD指令作为污点源,识别步骤S2中包括的函数的输入参数,将每个函数的输入参数标记为污点,并存储污点信息;定义污点的传播策略,并在执行智能合约的模糊测试过程中跟踪污点的传播,并记录执行路径上遇到的分支语句中包含的污点信息;对于执行智能合约的模糊测试过程中未覆盖的分支语句设为污点汇识别并记录语句中包含的污点信息;S5、选择被突变的输入参数:定义智能合约模糊测试过程中被突变输入参数的选择策略,并根据步骤S4动态污点分析的结果寻找被突变的输入参数集合,若存在,则该输入参数集合被突变,若不存在突变的输入参数集合,则根据记录的执行路径上所遇到的分支语句中包含的污点信息以及未覆盖分支中包含的污点信息,将分支中涉及的污点中包括的输入参数取并集,作为被突变的输入参数集合;S6、根据步骤S5得到的被突变的输入参数集合突变种子集中对应该分支所保存的测试用例中涉及的函数输入参数,固定其他的输入参数,减少无效突变,突变种子集中的测试用例,突变的策略遵循AFL设定;S7、根据步骤S6得到的突变的测试用例集执行智能合约,进行模糊测试;S8、重复步骤S4到S7的过程,直到模糊测试过程达到预设的时间或满足所有的分支。2.根据权利要求1所述的一种提高智能合约检测覆盖率的方法,其特征在于:步骤S1中若提供了智能合约的源代码,则将智能合约的源代码编译为字节码和ABI。3.根据权利要求1或2所述的一种提高智能合约检测覆盖率的方法,其特征在于:步骤S4中CALLDATALOAD指令从交易的数据部分读取函数的参数并压入堆栈的顶部,其操作数为该参数在数据中的偏移量,将该指令作为污点源,当程序执行到该指令时,向程序中引入污点,采用key

value的形式存储污点信息,key为堆栈顶部的位置,value为输入参数的偏移量,使用value来区分不同的输入参数。4.根据权利要求3所述的一种提高智能合约检测覆盖率的方法,其特征在于:步骤S4中定义污点的传播策略的具体实现方法...

【专利技术属性】
技术研发人员:董剑计松言任潇
申请(专利权)人:哈尔滨工业大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1