CN115659358B - 一种智能合约模糊测试方法及装置 - Google Patents

一种智能合约模糊测试方法及装置 Download PDF

Info

Publication number
CN115659358B
CN115659358B CN202211693514.0A CN202211693514A CN115659358B CN 115659358 B CN115659358 B CN 115659358B CN 202211693514 A CN202211693514 A CN 202211693514A CN 115659358 B CN115659358 B CN 115659358B
Authority
CN
China
Prior art keywords
transaction sequence
function
transaction
intelligent contract
read
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202211693514.0A
Other languages
English (en)
Other versions
CN115659358A (zh
Inventor
李钊
秦素娟
王森淼
陈淼
涂腾飞
张华�
金正平
李文敏
王程
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing University of Posts and Telecommunications
Original Assignee
Beijing University of Posts and Telecommunications
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing University of Posts and Telecommunications filed Critical Beijing University of Posts and Telecommunications
Priority to CN202211693514.0A priority Critical patent/CN115659358B/zh
Publication of CN115659358A publication Critical patent/CN115659358A/zh
Application granted granted Critical
Publication of CN115659358B publication Critical patent/CN115659358B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

本申请实施例提供一种智能合约模糊测试方法及装置,包括:解析智能合约,获得函数及函数所读、写的状态变量;根据函数读、写状态变量的关系,构建以函数为节点,函数间读写状态变量的关系为边的合约控制流向图;基于合约控制流向图,构建交易序列池;对于交易序列池中的待测交易序列,通过变异生成待测交易序列中各函数的函数参数,并根据待测交易序列和函数参数生成测试用例;在插桩的智能合约中执行测试用例,得到执行结果;将执行结果与预设的漏洞规则进行匹配,根据匹配结果确定智能合约是否存在漏洞。本申请能够检测智能合约可能存在的漏洞,提高检测准确性。

Description

一种智能合约模糊测试方法及装置
技术领域
本申请实施例涉及信息安全技术领域,尤其涉及一种智能合约模糊测试方法及装置。
背景技术
智能合约是在区块链上执行的程序,允许没有第三方的情况下进行可信交易,随着区块链技术的发展,智能合约的应用越来越广泛。智能合约经编译后部署于区块链,部署之后即无法修改。然而,智能合约可能存在的漏洞会使得合约处于永久攻击的状态,造成严重的安全问题。
发明内容
有鉴于此,本申请实施例的目的在于提出一种智能合约模糊测试方法及装置,能够测试智能合约可能存在的漏洞。
基于上述目的,本申请实施例提供了一种智能合约模糊测试方法,包括:
解析智能合约,获得函数及函数所读、写的状态变量;
根据函数读、写状态变量的关系,构建以函数为节点,函数间读写状态变量的关系为边的合约控制流向图;
基于所述合约控制流向图,构建交易序列池;其中,所述交易序列池包括多个交易序列,每个交易序列与所述合约控制流向图中的一条可行路径相对应;
对于所述交易序列池中的待测交易序列,通过变异生成所述待测交易序列中各函数的函数参数,并根据所述待测交易序列和函数参数生成测试用例;
在插桩的智能合约中执行所述测试用例,得到执行结果;
将所述执行结果与预设的漏洞规则进行匹配,根据匹配结果确定所述智能合约是否存在漏洞。
可选的,所述解析智能合约,获得函数及函数所读、写的状态变量,包括:
编译所述智能合约,生成字节码文件和应用程序二进制接口文件;
解析所述字节码文件和应用程序二进制接口文件,得到所有函数及各函数所读、写的状态变量。
可选的,所述根据函数读、写状态变量的关系,构建以函数为节点,函数间读写状态变量的关系为边的合约控制流向图,包括:
确定写目标状态变量的第一函数和读所述目标状态变量的第二函数,以所述第一函数为第一节点,所述第二函数为第二节点,构建所述第一节点指向所述第二节点的边。
可选的,所述函数参数的类型包括整数、地址、字符串、以太币数量、Gas limit数量、时间戳和块号,所述通过变异生成交易序列中各函数的函数参数,包括:
按照预设的变异规则对相应类型的函数参数进行变异处理,生成变异的函数参数;其中,所述变异规则包括位反转、加减运算、字节交换、字节删除和参数拼接。
可选的,所述根据匹配结果确定所述智能合约是否存在漏洞之后,还包括:
根据所述执行结果确定所述测试用例的代码覆盖率;
如果所述代码覆盖率的增加值大于预设的变化阈值,或者,所述智能合约存在漏洞,将所述待测交易序列添加于所述交易序列池中,将所述函数参数添加于预设的种子池中。
可选的,所述方法还包括:
对所述交易序列池中的交易序列进行变异处理,得到变异后的交易序列,将所述变异后的交易序列添加于所述交易序列池中。
可选的,对所述交易序列池中的交易序列进行变异处理,包括:
从所述交易序列池中选取两个交易序列,该两个交易序列对同一个状态变量分别具有读、写关系;
根据该两个交易序列对同一个状态变量的读、写关系,组成新的交易序列;
对所述新的交易序列进行变异,得到变异后的交易序列。
可选的,从所述交易序列池中选取两个交易序列,包括:
计算所述交易序列池中每个交易序列的价值;
选取价值最大的一个交易序列;
根据该交易序列,选取另一个交易序列,两个交易序列对同一个状态变量具有读、写关系。
可选的,将所述执行结果与预设的漏洞规则进行匹配,根据匹配结果确定所述智能合约是否存在漏洞,包括:
判断所述执行结果中是否存在与特定漏洞类型所对应的特定指令,如果是,确定所述智能合约存在特定漏洞。
本申请实施例还提供一种智能合约模糊测试装置,包括:
解析模块,用于解析智能合约,获得函数及函数所读、写的状态变量;
第一构建模块,用于根据函数读、写状态变量的关系,构建以函数为节点,函数间读写状态变量的关系为边的合约控制流向图;
第二构建模块,用于基于所述合约控制流向图,构建交易序列池;其中,所述交易序列池包括多个交易序列,每个交易序列与所述合约控制流向图中的一条可行路径相对应;
用例生成模块,用于对所述交易序列池中的待测交易序列,通过变异生成所述待测交易序列中各函数的函数参数,并根据所述待测交易序列和函数参数生成测试用例;
测试模块,用于在插桩的智能合约中执行所述测试用例,得到执行结果;
匹配模块,用于将所述执行结果与预设的漏洞规则进行匹配,根据匹配结果确定所述智能合约是否存在漏洞。
从上面所述可以看出,本申请实施例提供的智能合约模糊测试方法及装置,通过解析智能合约,获得函数及函数所读、写的状态变量,根据函数读、写状态变量的关系,构建合约控制流向图,基于合约控制流向图,构建交易序列池,对于交易序列池中的待测交易序列,通过变异生成待测交易序列中各函数的函数参数,并根据待测交易序列和函数参数生成测试用例,在插桩的智能合约中执行测试用例,得到执行结果,将执行结果与预设的漏洞规则进行匹配,根据匹配结果确定智能合约是否存在漏洞。本申请能够检测智能合约可能存在的漏洞,提高检测准确性。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例的方法流程示意图;
图2为本申请实施例的合约控制流向图的示意图;
图3为本申请实施例的交易序列池的示意图;
图4为本申请实施例的模糊测试流程框图;
图5为本申请实施例的装置结构框图;
图6为本申请实施例的电子设备结构框图。
具体实施方式
为使本公开的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本公开进一步详细说明。
需要说明的是,除非另外定义,本申请实施例使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。本申请实施例中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。“上”、“下”、“左”、“右”等仅用于表示相对位置关系,当被描述对象的绝对位置改变后,则该相对位置关系也可能相应地改变。
如背景技术部分所述,智能合约一旦部署于区块链即无法修改,由于编程语言存在的缺陷以及开发过程中存在的缺陷等,智能合约可能存在各种漏洞,需要在智能合约部署之前对其进行漏洞检测。相关技术中,采用静态分析对智能合约进行漏洞检测,检测结果存在大量的误报,采用随机组合交易序列的模糊测试方法,检测效率不高,检测结果存在漏报。
有鉴于此,本申请实施例提供一种智能合约模糊测试方法,根据智能合约的函数及函数所读、写的状态变量,构建合约控制流向图,根据合约控制流向图构建交易序列池,对于其中的交易序列,变异生成各函数的函数参数,基于交易序列和函数参数生成测试用例,在插桩的智能合约上运行测试用例,并记录执行结果,将执行结果与预设的漏洞规则进行匹配,判断智能合约是否存在漏洞。
以下,通过具体的实施例进一步详细说明本申请的技术方案。
如图1所示,本申请实施例提供一种智能合约模糊测试方法,包括:
S101:解析智能合约,获得函数及函数所读、写的状态变量;
本实施例中,对智能合约进行编译得到字节码文件和应用程序二进制接口文件(ABI文件),对字节码文件和应用程序二进制接口文件进行解析,可得到所有函数及各函数读的状态变量和写的状态变量、各函数的函数参数等。
可选的,对于使用solidity语言编码的智能合约,可使用solidity版本管理工具获得智能合约的版本信息,并使用相应版本的编译器对智能合约进行编译,以获得相应的字节码文件和应用程序二进制接口文件。
S102:根据函数读、写状态变量的关系,构建以函数为节点,函数间读写状态变量的关系为边的合约控制流向图;
本实施例中,解析出智能合约的所有函数及函数所读和/或写的状态变量之后,根据读写状态变量的关系,构建合约控制流向图,包括:确定写目标状态变量的第一函数和读目标状态变量的第二函数,以第一函数为第一节点,第二函数为第二节点,构建第一节点指向第二节点的边。即,通过解析出的函数及所读写的状态变量,确定分别读、写同一状态变量的第一函数和第二函数,根据状态变量的变化关系,确定第一函数与第二函数之间的关系,再根据第一函数与第二函数之间的关系,构建以函数为节点、函数间关系为边的合约控制流向图。
举例来说,如图2所示,解析智能合约获得函数Fun1及该函数Fun1写状态变量stateA,函数Fun2及该函数Fun2写状态变量stateB、读状态变量stateA,函数Fun3及该函数Fun3读状态变量stateB、读状态变量stateA;根据三个函数及分别读写的状态变量,确定写状态变量stateA的函数Fun1、读状态变量stateA的函数Fun2和函数Fun3,确定写状态变量stateB的函数Fun2、读状态变量stateB的函数Fun3;根据写到读状态变量stateA的函数Fun1和函数Fun2,建立函数Fun1节点到函数Fun2节点的边,同理建立函数Fun1节点到函数Fun3节点的边,根据写到读状态变量stateB的函数Fun2到函数Fun3,建立函数Fun2节点到函数Fun3节点的边,得到包括函数Fun1节点、函数Fun2节点、函数Fun3节点及各节点之间关系的合约控制流向图。该合约控制流向图也可表示为G =(V, G),其中,节点集合V ={Fun1, Fun2, Fun3},边集合G = {(Fun1, Fun3), (Fun2, Fun3), (Fun1, Fun2)}。
S103:基于合约控制流向图,构建交易序列池;其中,交易序列池包括多个交易序列,每个交易序列与合约控制流向图中的一条可行路径相对应;
本实施例中,根据所有函数及各函数所读写的状态变量,构建合约控制流向图之后,进一步构建交易序列池。确定合约控制流向图中的所有可行路径,且所确定出的可行路径唯一,根据每条可行路径上的函数及函数关系确定相应的交易序列,由所有可行路径分别对应的交易序列构成交易序列池。
结合图3所示,该合约控制流向图包括两条可行路径,第一条是从函数Fun1节点经过函数Fun2节点到函数Fun3节点的路径,该条可行路径对应的交易序列为函数Fun1到函数Fun2到函数Fun3,表示为交易序列S1: Fun1-> Fun2-> Fun3;第二条是函数Fun1节点到函数Fun3节点的路径,其对应的交易序列为函数Fun1到函数Fun3,表示为S2: Fun1-> Fun3。
S104:对于交易序列池中的待测交易序列,通过变异生成待测交易序列中各函数的函数参数,并根据待测交易序列和函数参数生成测试用例;
本实施例中,构建交易序列池之后,可以从交易序列池中任意选取交易序列进行模糊测试。对于选取出的待测交易序列,确定其所包含的各函数以及各函数的函数参数,不同的函数所对应的函数参数可能不同,函数参数的类型包括整数、地址、字符串、以太币数量、Gas limit数量、时间戳和块号等。进行模糊测试时,对待测交易序列所包含的函数的函数参数进行变异处理,得到变异的函数参数,根据待侧交易序列和变异的函数参数生成测试用例。
一些实施方式中,变异生成函数参数的方法包括:按照预设的变异规则对相应类型的函数参数进行变异处理,生成变异的函数参数;其中,变异规则包括位反转、加减运算、字节交换、字节删除和参数拼接。具体的,位反转是指按位进行翻转,将0变为1,1变为0;加减运算是指分别以1字节、2字节、4字节为单位进行整数加减运算;字节交换是指分别以1字节、2字节、4字节为单位进行交换;字节删除是指随机删除部分字节,形成新的参数;参数拼接是指将两个参数进行拼接得到一个新参数。
一些方式中,针对不同类型的函数参数,可以预先构建相应类型的种子池,包括整数种子池、地址种子池、字符串种子池、以太币数量种子池、Gas limit数量种子池、时间戳种子池和块号种子池等。针对不同的数据类型,按照不同的约束条件初始化每个种子池,例如,对于整数种子池,整数参数分为32位整数和64位整数,初始化设置整数参数的极大值和极小值。对于地址种子池,其中的每个地址参数的长度均为20字节,且初始化设置了合约地址和部署地址,其中,合约地址是一个映射着账户地址以及余额的智能合约,即合约地址就表示一个合约,合约地址在合约部署时会自动生成,部署地址是部署此合约的用户账户地址。对于字符串种子池,将字符串参数初始化为字节码文件中sstore指令后的字符串。对于以太币数量种子池,初始化设置以太币数量的极小值(为0)和极大值。对于Gas limit数量种子池,将Gas limit数量参数初始化为2300。对于时间戳种子池,将时间戳参数初始化为当前合约时间戳。对于块号种子池,将块号参数初始化为当前块号。
结合图4所示,在模糊测试过程中,对于交易序列池中的待测交易序列,确定其包含的一个或多个函数,确定各函数的函数参数;根据函数参数的类型从相应的种子池中选取初始种子,对初始种子进行变异处理,得到变异的函数参数;之后,基于待测交易序列和变异的函数参数生成表示交易事务的测试用例,在预先插桩的智能合约中运行测试用例,得到相应的执行结果。
举例来说,待测交易序列包括的函数的函数类型包括字符串和整数,从字符串种子池中选取初始种子,然后采用位反转的变异方式对初始种子进行变异处理,得到变异后的字符串参数,从整数种子池中选取初始种子,采用加法运算的变异方式对初始种子进行变异处理,得到变异后的整数参数;之后,由函数及变异后的字符串参数、整数参数组成交易事务,在插桩的智能合约上运行。
一些方式中,对于不同数据类型的函数参数,采用不同的变异规则进行变异。函数参数的数据类型主要包括整数、字符串和地址,其中,以太币数量、Gas limit数量、时间戳和块号都属于整数类型,对于整数类型的函数参数可采用位反转、加减运算的变异规则进行变异;对于字符串类型的函数参数可采用位反转、字节交换、字节删除和参数拼接的变异规则进行变异;对于地址类型的函数参数可采用位反转、字节交换的变异规则进行变异。
S105:在插桩的智能合约中执行测试用例,得到执行结果;
S106:将执行结果与预设的漏洞规则进行匹配,根据匹配结果确定智能合约是否存在漏洞。
本实施例中,确定了模糊测试用的测试用例之后,在插桩的智能合约上运行测试用例。其中,插桩是在保证原有程序逻辑的基础上,在程序中插入探针,通过探测采集代码中的信息在特定的位置插入代码段,用于收集程序运行时的动态上下文信息。本申请中,在插桩的智能合约中执行测试用例,通过探针的执行收集智能合约的执行路径的控制流和数据流信息,将探针收集的信息作为执行结果。
可选的,执行结果包括记录的各类指令及指令的返回结果、指令的执行路径、指令的调用方信息、关键参数值、写入的数据及数据的存储位置、读出的数据及数据的存储位置等。其中,各类指令例如包括跳转指令(例如,JUMPI、JUMP跳转指令)及跳转指令的次数,返回指令(例如,RETURN、REVERT返回指令)及返回指令的次数,操作指令(例如,ADD、MUL或者SUB操作指令),调用指令(例如,CALL调用指令),加载指令(例如,SLOAD、LOAD加载指令)、存储指令(例如,SSTORE存储指令)等等。
一些实施例中,在获得执行结果之后,将执行结果与预设的漏洞规则进行匹配,判断执行结果中是否存在漏洞。结合表1所示,判断智能合约是否存在漏洞的方法包括:判断执行结果中是否存在与特定漏洞类型所对应的特定指令,如果是,确定智能合约存在特定漏洞。具体的:
判断执行结果中是否存在ASSERTFAIL或者INVALID指令,如果存在,确定智能合约存在断言失败漏洞。
判断执行结果中是否存在ADD、MUL或者SUB操作指令,如果存在,从堆栈中提取操作指令对应的操作数和操作结果,按照操作指令对操作数进行运算得到操作结果;之后,将计算出的操作结果与提取出的操作结果进行比较,如果二者不同,确定智能合约存在整数溢出漏洞。
判断执行结果中是否存在Gas值大于2300的CALL调用指令,以及在CALL调用指令之前是否执行了SLOAD加载指令,在CALL调用指令之后是否执行了SSTORE存储指令,且与LOAD加载指令共享同一内存空间,如果存在上述情况,确定智能合约存在重入漏洞。
判断执行结果中是否存在具有两个不同发送方的执行过程,且在第一个执行过程将数据写入特定存储位置后,第二个执行过程从该特定存储位置读取数据,如果存在上述情况,确定智能合约存在竞争条件漏洞。其中,根据记录的每个交易的交易发送方的地址(即from字段的值),判断是否存在两个不同的交易发送方的执行过程。
判断执行结果中是否存在BLOCKHASH指令、COINBASE指令、TIMESTAMP指令、NUMBER指令、DIFFICULTY指令和/或GASLIMIT指令等,如果存在,确定智能合约存在块依赖关系漏洞。其中,BLOCKHASH指令用于获取指定高度的祖先区块的头部哈希;COINBASE指令用于获取区块的矿工账户地址;TIMESTAMP指令用于获取区块的时间戳;NUMBER指令用于获取区块的号码;DIFFICULTY指令用于获得区块的难度;GASLIMIT指令用于获得区块的Gas上限。
判断执行结果中是否存在CALL调用指令,如果存在,且CALL调用指令的返回结果为1,表明调用过程发生异常,进一步判断调用结果是否流入新的JUMPL跳转指令中,如果指令结束异常均未被处理,确定智能合约存在处理异常漏洞。
判断执行结果中是否存在DELEGATECALL调用指令和STOP结束指令,如果存在,进一步判断调用指令的发送方的地址是否属于预设的攻击地址,如果是,确定智能合约存在委托调用非可信合约漏洞。
判断执行结果中是否存在CALL调用指令,如果存在,判断调用指令的接收方的地址是否属于预设的攻击地址,且该地址在之前的交易中从未向合约发生以太币,该地址是由其他正常地址作为参数传递,如果存在上述情况,确定智能合约存在以太泄露漏洞。
判断执行结果中是否包含CREATE指令、CALL调用指令、DELEGATECALL调用指令、SELFDESTRUCT自毁指令和value值(value值是一个交易中携带的以太币数量,即转的币的数量),如果不包含上述指令,且value值大于0,确定智能合约只能接收以太币而不能发送以太币,智能合约存在以太冻结漏洞。
判断执行结果中是否存在SELELFDESTRUCT自毁指令,如果存在,且自毁指令的调用者属于预设的攻击者,确定智能合约存在无保护自毁漏洞。
表1 智能合约的漏洞信息
Figure 956646DEST_PATH_IMAGE002
Figure 404945DEST_PATH_IMAGE004
Figure 450261DEST_PATH_IMAGE006
一些实施例中,根据执行结果确定智能合约是否存在漏洞之后,测试方法还包括:
根据执行结果确定测试用例的代码覆盖率;
如果代码覆盖率的增加值大于预设的变化阈值,或者,智能合约存在漏洞,将测试用例对应的待测交易序列添加于交易序列池中,将测试用例对应的函数参数添加于相应的种子池中。
本实施例中,代码覆盖率是检测测试用例有效性的关键指标,在插桩的智能合约中执行测试用例,得到该测试用例的代码覆盖率,判断该测试用例的所覆盖的新增代码分支是否大于设置的变异阈值(例如,10%),如果是,则确定测试用例为有效的测试用例,将对应的待测交易序列重新添加于交易序列池中,如果否,则该测试用例对应的待测交易序列淘汰。或者是,检测出智能合约存在漏洞的测试用例是有效的测试用例,将对应的待测交易序列重新添加于交易序列池中,将未检测出漏洞的测试用例所对应的待测交易序列淘汰。
利用插桩的智能合约运行测试用例并得到执行结果之后,根据执行结果确定测试用例的代码覆盖率,如果代码覆盖率的增加值大于变化阈值,或者通过分析执行结果判断智能合约存在某种漏洞,则认为测试用例对应的交易序列和函数参数是有用的测试样本,将函数参数按照类型添加于相应的种子池中,将交易序列添加于交易序列池后,即将有用的样本添加于待测样本池中,继续利用有用的样本对智能合约进行测试,提高测试准确性。
一些方式中,根据执行结果确定测试用例的代码覆盖率,包括:计算执行结果中记录的覆盖指令的数量和智能合约中全部指令的数量之间的比值,将该比值作为代码覆盖率。其中,对于每个测试用例的代码覆盖率,如果本次执行的代码覆盖率相较于上次执行的代码覆盖率增加了变化阈值,则认为本次的测试用例覆盖了更多的新的代码分支,为有用的测试用例。
一些实施例中,为丰富交易序列池中交易序列的丰富性,提高测试准确性,方法还包括:
对交易序列池中的交易序列进行变异处理,得到变异后的交易序列,并将变异后的交易序列添加于交易序列池中。
其中,对交易序列进行变异的方法包括:
从交易序列池中选取两个交易序列,其中,该两个交易序列对同一个状态变量分别具有读、写关系;
根据两个交易序列对同一状态变量的读、写关系,分别从写后读的交接位置进行交换,组成新的交易序列;
对新的交易序列进行变异,得到变异后的交易序列。
具体的,从交易序列池中选择两个交易序列的方法包括:计算交易序列池中每个 交易序列的价值,选取价值最大的一个交易序列;选择与该交易序列具有数据流相关关系 的另一个交易序列。其中,利用价值函数计算交易序列i的价值
Figure DEST_PATH_IMAGE007
,表示为:
Figure DEST_PATH_IMAGE008
(1)
式中,t为当前合约执行的次数,
Figure DEST_PATH_IMAGE010
为交易序列i的执行次数,
Figure DEST_PATH_IMAGE011
为交易序列i的适 应度值,适应度值是指交易序列覆盖的代码分支数,可通过统计执行中覆盖的JUMP指令数 所确定。
基于选择的两个交易序列,根据二者的数据依赖关系,分别从写后读的交接位置进行交换,重新组成新的交易序列,新的交易序列要求依旧保持写后读的数据关系。例如:对于选取出的交易序列a:fun1->fun2->fun3,交易序列b:fun4->fun5->fun6,交易序列a的fun2读取状态变量A,交易序列b的fun5写状态变量A,在写函数fun5后加入读函数fun2,组成新的交易序列c: fun4->fun5->fun2->fun3,重组的交易序列仍然保持对同一状态变量先写后读的关系。
之后,通过删除、增加写函数对重组的交易序列进行变异。例如:对于重组的交易序列c:fun4->fun5->fun2->fun3,可以在写函数fun5之前增加写函数fun5,得到变异的交易序列d:fun5-> fun4-> fun5-> fun2-> fun3,也可删除写函数fun5得到变异的交易序列e:fun4->fun2->fun3。
需要说明的是,本申请实施例的方法可以由单个设备执行,例如一台计算机或服务器等。本实施例的方法也可以应用于分布式场景下,由多台设备相互配合来完成。在这种分布式场景的情况下,这多台设备中的一台设备可以只执行本申请实施例的方法中的某一个或多个步骤,这多台设备相互之间会进行交互以完成所述的方法。
需要说明的是,上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
如图5所示,本申请实施例提供一种智能合约模糊测试装置,包括:
解析模块,用于解析智能合约,获得函数及函数所读、写的状态变量;
第一构建模块,用于根据函数读、写状态变量的关系,构建以函数为节点,函数间读写状态变量的关系为边的合约控制流向图;
第二构建模块,用于基于合约控制流向图,构建交易序列池;其中,交易序列池包括多个交易序列,每个交易序列与合约控制流向图中的一条可行路径相对应;
用例生成模块,用于对交易序列池中的待测交易序列,通过变异生成待测交易序列中各函数的函数参数,并根据待测交易序列和函数参数生成测试用例;
测试模块,用于在插桩的智能合约中执行测试用例,得到执行结果;
匹配模块,用于将执行结果与预设的漏洞规则进行匹配,根据匹配结果确定智能合约是否存在漏洞。
为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本申请实施例时可以把各模块的功能在同一个或多个软件和/或硬件中实现。
上述实施例的装置用于实现前述实施例中相应的方法,并且具有相应的方法实施例的有益效果,在此不再赘述。
图6示出了本实施例所提供的一种更为具体的电子设备硬件结构示意图,该设备可以包括:处理器1010、存储器1020、输入/输出接口1030、通信接口1040和总线 1050。其中处理器1010、存储器1020、输入/输出接口1030和通信接口1040通过总线1050实现彼此之间在设备内部的通信连接。
处理器1010可以采用通用的CPU(Central Processing Unit,中央处理器)、微处理器、应用专用集成电路(Application Specific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本说明书实施例所提供的技术方案。
存储器1020可以采用ROM(Read Only Memory,只读存储器)、RAM(Random AccessMemory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器1020可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器1020中,并由处理器1010来调用执行。
输入/输出接口1030用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。
通信接口1040用于连接通信模块(图中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信。
总线1050包括一通路,在设备的各个组件(例如处理器1010、存储器1020、输入/输出接口1030和通信接口1040)之间传输信息。
需要说明的是,尽管上述设备仅示出了处理器1010、存储器1020、输入/输出接口1030、通信接口1040以及总线1050,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本说明书实施例方案所必需的组件,而不必包含图中所示的全部组件。
上述实施例的电子设备用于实现前述实施例中相应的方法,并且具有相应的方法实施例的有益效果,在此不再赘述。
本实施例的计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。
所属领域的普通技术人员应当理解:以上任何实施例的讨论仅为示例性的,并非旨在暗示本公开的范围(包括权利要求)被限于这些例子;在本公开的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,步骤可以以任意顺序实现,并存在如上所述的本申请实施例的不同方面的许多其它变化,为了简明它们没有在细节中提供。
另外,为简化说明和讨论,并且为了不会使本申请实施例难以理解,在所提供的附图中可以示出或可以不示出与集成电路(IC)芯片和其它部件的公知的电源/接地连接。此外,可以以框图的形式示出装置,以便避免使本申请实施例难以理解,并且这也考虑了以下事实,即关于这些框图装置的实施方式的细节是高度取决于将要实施本申请实施例的平台的(即,这些细节应当完全处于本领域技术人员的理解范围内)。在阐述了具体细节(例如,电路)以描述本公开的示例性实施例的情况下,对本领域技术人员来说显而易见的是,可以在没有这些具体细节的情况下或者这些具体细节有变化的情况下实施本申请实施例。因此,这些描述应被认为是说明性的而不是限制性的。
尽管已经结合了本公开的具体实施例对本公开进行了描述,但是根据前面的描述,这些实施例的很多替换、修改和变型对本领域普通技术人员来说将是显而易见的。例如,其它存储器架构(例如,动态RAM(DRAM))可以使用所讨论的实施例。
本申请实施例旨在涵盖落入所附权利要求的宽泛范围之内的所有这样的替换、修改和变型。因此,凡在本申请实施例的精神和原则之内,所做的任何省略、修改、等同替换、改进等,均应包含在本公开的保护范围之内。

Claims (7)

1.一种智能合约模糊测试方法,其特征在于,包括:
解析智能合约,获得函数及函数所读、写的状态变量;
根据函数读、写状态变量的关系,构建以函数为节点,函数间读写状态变量的关系为边的合约控制流向图;
基于所述合约控制流向图,构建交易序列池;其中,所述交易序列池包括多个交易序列,每个交易序列与所述合约控制流向图中的一条可行路径相对应;
对于所述交易序列池中的待测交易序列,通过变异生成所述待测交易序列中各函数的函数参数,并根据所述待测交易序列和函数参数生成测试用例;
在插桩的智能合约中执行所述测试用例,得到执行结果;
将所述执行结果与预设的漏洞规则进行匹配,根据匹配结果确定所述智能合约是否存在漏洞;
对所述交易序列池中的交易序列进行变异处理,得到变异后的交易序列,将所述变异后的交易序列添加于所述交易序列池中;其中,对所述交易序列池中的交易序列进行变异处理,包括:计算所述交易序列池中每个交易序列的价值;选取价值最大的一个交易序列;根据该交易序列,选取另一个交易序列,两个交易序列对同一个状态变量具有读、写关系;根据两个交易序列对同一个状态变量的读、写关系,组成新的交易序列;对所述新的交易序列进行变异,得到变异后的交易序列。
2.根据权利要求1所述的方法,其特征在于,所述解析智能合约,获得函数及函数所读、写的状态变量,包括:
编译所述智能合约,生成字节码文件和应用程序二进制接口文件;
解析所述字节码文件和应用程序二进制接口文件,得到所有函数及各函数所读、写的状态变量。
3.根据权利要求1所述的方法,其特征在于,所述根据函数读、写状态变量的关系,构建以函数为节点,函数间读写状态变量的关系为边的合约控制流向图,包括:
确定写目标状态变量的第一函数和读所述目标状态变量的第二函数,以所述第一函数为第一节点,所述第二函数为第二节点,构建所述第一节点指向所述第二节点的边。
4. 根据权利要求1所述的方法,其特征在于,所述函数参数的类型包括整数、地址、字符串、以太币数量、Gas limit数量、时间戳和块号,所述通过变异生成交易序列中各函数的函数参数,包括:
按照预设的变异规则对相应类型的函数参数进行变异处理,生成变异的函数参数;其中,所述变异规则包括位反转、加减运算、字节交换、字节删除和参数拼接。
5.根据权利要求1所述的方法,其特征在于,所述根据匹配结果确定所述智能合约是否存在漏洞之后,还包括:
根据所述执行结果确定所述测试用例的代码覆盖率;
如果所述代码覆盖率的增加值大于预设的变化阈值,或者,所述智能合约存在漏洞,将所述待测交易序列添加于所述交易序列池中,将所述函数参数添加于预设的种子池中。
6.根据权利要求1所述的方法,其特征在于,将所述执行结果与预设的漏洞规则进行匹配,根据匹配结果确定所述智能合约是否存在漏洞,包括:
判断所述执行结果中是否存在与特定漏洞类型所对应的特定指令,如果是,确定所述智能合约存在特定漏洞。
7.一种智能合约模糊测试装置,其特征在于,包括:
解析模块,用于解析智能合约,获得函数及函数所读、写的状态变量;
第一构建模块,用于根据函数读、写状态变量的关系,构建以函数为节点,函数间读写状态变量的关系为边的合约控制流向图;
第二构建模块,用于基于所述合约控制流向图,构建交易序列池;其中,所述交易序列池包括多个交易序列,每个交易序列与所述合约控制流向图中的一条可行路径相对应;
用例生成模块,用于对所述交易序列池中的待测交易序列,通过变异生成所述待测交易序列中各函数的函数参数,并根据所述待测交易序列和函数参数生成测试用例;
测试模块,用于在插桩的智能合约中执行所述测试用例,得到执行结果;
匹配模块,用于将所述执行结果与预设的漏洞规则进行匹配,根据匹配结果确定所述智能合约是否存在漏洞;
序列生成模块,用于对所述交易序列池中的交易序列进行变异处理,得到变异后的交易序列,将所述变异后的交易序列添加于所述交易序列池中;其中,对所述交易序列池中的交易序列进行变异处理,包括:计算所述交易序列池中每个交易序列的价值;选取价值最大的一个交易序列;根据该交易序列,选取另一个交易序列,两个交易序列对同一个状态变量具有读、写关系;根据两个交易序列对同一个状态变量的读、写关系,组成新的交易序列;对所述新的交易序列进行变异,得到变异后的交易序列。
CN202211693514.0A 2022-12-28 2022-12-28 一种智能合约模糊测试方法及装置 Active CN115659358B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211693514.0A CN115659358B (zh) 2022-12-28 2022-12-28 一种智能合约模糊测试方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211693514.0A CN115659358B (zh) 2022-12-28 2022-12-28 一种智能合约模糊测试方法及装置

Publications (2)

Publication Number Publication Date
CN115659358A CN115659358A (zh) 2023-01-31
CN115659358B true CN115659358B (zh) 2023-03-17

Family

ID=85023372

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211693514.0A Active CN115659358B (zh) 2022-12-28 2022-12-28 一种智能合约模糊测试方法及装置

Country Status (1)

Country Link
CN (1) CN115659358B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116303097B (zh) * 2023-05-16 2023-08-22 中国工商银行股份有限公司 智能合约的模糊测试方法、装置、设备、介质和程序产品
CN117009980B (zh) * 2023-08-10 2024-03-15 哈尔滨工业大学 一种针对智能合约漏洞检测的有指导的模糊测试方法

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111563742A (zh) * 2020-05-11 2020-08-21 西安邮电大学 智能合约交易顺序依赖漏洞变异模糊测试方法
CN112860588A (zh) * 2021-04-07 2021-05-28 中国科学技术大学 一种针对智能合约跨合约漏洞的模糊测试方法
CN114356755A (zh) * 2021-12-20 2022-04-15 北京航空航天大学 一种智能合约模糊测试系统
CN115114166A (zh) * 2022-07-05 2022-09-27 四川大学 一种以太坊智能合约安全测试方法

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110399730B (zh) * 2019-07-24 2021-05-04 上海交通大学 智能合约漏洞的检查方法、系统及介质
CN112131115B (zh) * 2020-09-23 2021-06-22 腾讯科技(深圳)有限公司 一种智能合约模糊测试的方法、装置及存储介质
CN111897742B (zh) * 2020-09-30 2021-01-15 支付宝(杭州)信息技术有限公司 生成智能合约测试案例的方法和装置
CN113326050B (zh) * 2021-07-07 2023-10-17 浙江工商大学 基于神经网络与动态模糊测试结合的智能合约漏洞检测方法
CN115455435A (zh) * 2022-10-12 2022-12-09 中山大学 一种智能合约模糊测试方法、装置、存储介质及电子设备

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111563742A (zh) * 2020-05-11 2020-08-21 西安邮电大学 智能合约交易顺序依赖漏洞变异模糊测试方法
CN112860588A (zh) * 2021-04-07 2021-05-28 中国科学技术大学 一种针对智能合约跨合约漏洞的模糊测试方法
CN114356755A (zh) * 2021-12-20 2022-04-15 北京航空航天大学 一种智能合约模糊测试系统
CN115114166A (zh) * 2022-07-05 2022-09-27 四川大学 一种以太坊智能合约安全测试方法

Also Published As

Publication number Publication date
CN115659358A (zh) 2023-01-31

Similar Documents

Publication Publication Date Title
Chen et al. Defining smart contract defects on ethereum
CN115659358B (zh) 一种智能合约模糊测试方法及装置
Nguyen et al. sfuzz: An efficient adaptive fuzzer for solidity smart contracts
Dingman et al. Defects and vulnerabilities in smart contracts, a classification using the NIST bugs framework
KR20200021993A (ko) 블록체인 컴파일러
Grishchenko et al. Ethertrust: Sound static analysis of ethereum bytecode
CN111124926B (zh) 模糊测试方法、装置、电子设备及存储介质
CN109101237A (zh) 代码的加密编译方法及装置
Zhang et al. BDA: practical dependence analysis for binary executables by unbiased whole-program path sampling and per-path abstract interpretation
CN112749389B (zh) 一种检测智能合约破坏敏感数据漏洞的检测方法及装置
Chen et al. {SelectiveTaint}: Efficient Data Flow Tracking With Static Binary Rewriting
Padhye et al. Travioli: A dynamic analysis for detecting data-structure traversals
CN115455435A (zh) 一种智能合约模糊测试方法、装置、存储介质及电子设备
Li et al. Detecting standard violation errors in smart contracts
CN113312618A (zh) 程序漏洞检测方法、装置、电子设备及介质
Dingman et al. Classification of smart contract bugs using the nist bugs framework
Li et al. Towards verifying Ethereum smart contracts at intermediate language level
Wichelmann et al. Microwalk-CI: Practical side-channel analysis for JavaScript applications
CN115292172A (zh) 一种提高智能合约检测覆盖率的方法、电子设备及存储介质
Singh et al. Parallel chopped symbolic execution
Qian et al. Demystifying random number in ethereum smart contract: taxonomy, vulnerability identification, and attack detection
Hamadouche et al. Virus in a smart card: Myth or reality?
CN115659344B (zh) 一种软件供应链检测方法及装置
Zeng et al. MazeRunner: evaluating the attack surface of control-flow integrity policies
CN115795479A (zh) 一种智能合约的漏洞检测方法、电子设备和存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant