CN115795479A - 一种智能合约的漏洞检测方法、电子设备和存储介质 - Google Patents
一种智能合约的漏洞检测方法、电子设备和存储介质 Download PDFInfo
- Publication number
- CN115795479A CN115795479A CN202211496270.7A CN202211496270A CN115795479A CN 115795479 A CN115795479 A CN 115795479A CN 202211496270 A CN202211496270 A CN 202211496270A CN 115795479 A CN115795479 A CN 115795479A
- Authority
- CN
- China
- Prior art keywords
- target
- test sample
- initial
- initial test
- test samples
- 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.)
- Pending
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本申请公开了一种智能合约的漏洞检测方法、电子设备和存储介质,该方法包括:获取若干初始测试样例和目标合约源码;按照若干初始测试样例的优先级依序对若干初始测试样例进行变异,得到若干目标测试样例;分别利用各目标测试样例多次执行目标合约源码,得到若干执行结果;基于若干执行结果,确定目标合约源码的漏洞。通过上述方式,本申请能够实现对智能合约中的漏洞的检测。
Description
技术领域
本申请涉及软件测试技术领域,特别是涉及一种智能合约的漏洞检测方法、电子设备和存储介质。
背景技术
随着互联网的日益发展,代码作为互联网不可或缺的组成部分也逐渐变得越来越重要。然而在web2.0的时代,代码往往运行在中心化的服务器上面,代码的安全性、使用者的隐私都没有得到较好的保障。智能合约是部署在区块链上的代码,可以被任意的用户通过发布交易来调用。智能合约都是开源、公开的代码,受到所有参与者共同维护、共同监督。从根本上解决了闭源、隐私泄露的问题。
无论是普通的代码还是智能合约的代码,如何保证其安全性以及功能的正确性都是至关重要的问题。对于普通的代码来说,其安全性主要依赖于代码更新。当用户触发漏洞、或安全检测工具检测到漏洞后,通过更新代码可以有效解决漏洞带来的安全问题。然而对于智能合约来说,其一大特点在于区块链的不可篡改性。智能合约一旦部署到链上就没有办法进行更改,因此如何提前检测出智能合约当中的漏洞是目前我们面对的首要难题。
发明内容
本申请主要解决的技术问题是提供一种智能合约的漏洞检测方法、电子设备和存储介质,能够实现对智能合约中的漏洞的检测。
为解决上述技术问题,本申请第一方面提供了一种智能合约的漏洞检测方法,该方法包括:获取若干初始测试样例和目标合约源码;按照若干初始测试样例的优先级依序对若干初始测试样例进行变异,得到若干目标测试样例;分别利用各目标测试样例多次执行目标合约源码,得到若干执行结果;基于若干执行结果,确定目标合约源码的漏洞。
为解决上述技术问题,本申请第二方面提供了一种电子设备,该电子设备包括相互耦接的存储器和处理器,存储器存储有程序指令;处理器用于执行存储器中存储的程序指令,以实现上述第一方面所述的方法。
为解决上述技术问题,本申请第三方面提供了一种计算机可读存储介质,该计算机可读存储介质用于存储程序指令,程序指令能够被执行以实现上述第一方面所述的方法。
本申请的有益效果是:区别于现有技术的情况,本申请获取若干初始测试样例和目标合约源码后;按照若干初始测试样例的优先级依序对若干初始测试样例进行变异,得到若干目标测试样例;通过对初始测试样例进行变异,即可自动生成目标测试样例,无需测试人员重新进行编写;进一步,分别利用各目标测试样例多次执行目标合约源码,得到若干执行结果;基于若干执行结果,确定目标合约源码的漏洞,通过利用多个目标测试样例多次执行目标合约源码,即可检测目标合约源码是否存在漏洞。
附图说明
图1是本申请提供的智能合约的漏洞检测方法第一实施方式的流程示意图;
图2是本申请中获取目标合约源码一实施方式的简化示意图;
图3是本申请提供的智能合约的漏洞检测方法第二实施方式的流程示意图;
图4是本申请提供的控制流图一实施方式的简化示意图;
图5是本申请提供的控制流图另一实施方式的简化示意图;
图6是本申请提供的智能合约的漏洞检测方法第三实施方式的流程示意图;
图7是本申请提供的智能合约的漏洞检测方法第四实施方式的流程示意图;
图8是本申请提供的智能合约的漏洞检测装置一实施方式的框架示意图;
图9是本申请提供的电子设备一实施方式的框架结构示意图;
图10是本申请提供的计算机可读存储介质一实施方式的框架示意图。
具体实施方式
下面结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性的劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
需要说明的是,本申请实施例中有涉及“第一”、“第二”等的描述,该“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。
在本文中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本发明的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域技术人员显式地和隐式地理解的是,本文所描述的实施例可以与其它实施例相结合。
智能合约本质上是存储在以太坊区块链一个特定地址上的一组代码和数据。通常,开发者使用高级语言来编写智能合约,最终智能合约被编译为字节码并通过对应的执行环境(虚拟机)来运行。每个智能合约都维持着一块持久化内存区称为存储,用于保存状态变量。为了执行智能合约中定义的函数,用户需要对智能合约发起一笔交易,交易包含了函数调用的信息和发送的以太币数量。智能合约接收到交易后,会执行相关的程序代码,并将结果记录在区块链上。智能合约当中的漏洞会带来不可逆的严重危害,因此本申请提供一种智能合约的漏洞检测方法,在智能合约上线前对其进行检测,若发现存在漏洞,则对其进行修改。
请参阅图1和图2,图1是本申请提供的智能合约的漏洞检测方法第一实施方式的流程示意图,图2是本申请中获取目标合约源码一实施方式的简化示意图;该方法包括:
S11:获取若干初始测试样例和目标合约源码。
在一实施方式中,若干初始测试样例是利用随机数生成器生成的。具体地,先获取用户提供的初始合约源码,基于初始合约源码和编译器,得到初始合约源码的二进制接口信息,二进制接口信息可以包含接口名称、地址以及接口可接收何种信息作为参数等。根据二进制接口信息,利用随机数生成器为接口生成初始测试样例。可以理解地,初始合约源码对应的接口可以为多个,则获取的二进制接口信息也为多个,可以利用随机数生成器为每个接口生成一个初始测试样例,也可以为每个接口生成多个初始测试样例,得到若干初始测试样例。例如,初始合约源码对应的接口包含转账接口,假设该接口可以接收转账参数和数量参数,转账参数和数量参数分别为一个包含若干位的二进制数,如地址参数是一个包含240位的二进制数,则利用随机数生成器生成该240位的二进制数,数量参数和地址参数的生成方式相同,将生成的转账参数和数量参数作为初始测试样例。
在另一实施方式中,初始测试样例为前一次漏洞检测过程中使用的目标测试样例。具体地,在前一次漏洞检测过程中,会按照若干初始测试样例的优先级依序对若干初始测试样例进行变异,得到若干目标测试样例;分别利用各目标测试样例多次执行目标合约源码,得到若干执行结果以及若干初始测试样例对应的执行路径信息。将前一次漏洞检测过程中使用的目标测试样例作为当前漏洞检测过程的初始测试样例,前一次漏洞检测过程得到的若干初始测试样例对应的执行路径信息被用于在当前漏洞检测过程中对初始测试样例(即前一次漏洞检测过程中使用的目标测试样例)进行变异的过程。
在一实施方式中,目标合约源码可以是对初始合约源码进行插桩得到的,进行插桩是为了判断目标合约源码执行过程中,是否触发指定的漏洞。具体地,获取初始合约源码和测试准则,测试准则包含匹配策略和生成策略,测试准则由用户提供,初始合约源码中包含若干初始语句,获取初始合约源码中与匹配策略匹配的初始语句,利用与匹配策略匹配的初始语句和生成策略,生成目标语句,将初始合约源码中与匹配策略匹配的初始语句替换为目标语句,得到目标合约源码。其中,目标语句可以为断言语句,当目标合约源码在执行过程中出现指定问题时,则会中断或者报错;匹配策略可以为算数运算符、关系运算符、条件运算符、条件语句、函数声明语句、变量声明语句等。例如,针对整数溢出问题,假设匹配策略为匹配初始合约源码中进行加减法的语句,则获取初始合约源码所有进行加减法的初始语句,并提取出加减法的对象。如图2所示,匹配得到的初始语句为accountFromValue-=amount,提取得到的对象包括accountFromValue和amount,利用生成策略和提取得到的对象生成目标语句,进而得到目标合约源码。此时执行目标合约源码,当accountFromValue小于amount,则继续执行,否则执行过程中断。
S12:按照若干初始测试样例的优先级依序对若干初始测试样例进行变异,得到若干目标测试样例。
在一实施方式中,若初始测试样例是利用随机数生成器生成的,则可以将初始测试样例作为目标测试样例,即不对初始测试样例进行变异。
在另一实施方式中,初始测试样例为前一次漏洞检测过程中使用的目标测试样例。则获取初始测试样例在前一次漏洞检测过程得到的执行路径信息,即初始测试样例对应的执行路径信息,基于初始测试样例对应的执行路径信息,确定与初始测试样例关联的第一距离,根据若干与初始测试样例关联的第一距离,确定若干初始测试样例的优先级。在一实施方式中,按照第一距离从小到大的顺序依序对若干初始测试样例进行变异,即第一距离越小,则对应的初始测试样例先变异。其中,与初始测试样例关联的第一距离表示初始测试样例与若干未达分支的距离。未达分支的概念在下文进行详述,此处先不做描述。
对若干初始测试样例进行变异可以将每个初始测试样例进行二进制转换,得到转换测试样例,转换测试样例包含若干二进制位,对转换测试样例的部分二进制位进行翻转、加减运算、替换中的至少一种变异,得到目标测试样例。
本实施方式得到的目标测试样例可以作为下一次漏洞检测过程的初始测试样例。
S13:分别利用各目标测试样例多次执行目标合约源码,得到若干执行结果。
在一实施方式中,初始合约源码是采用Java语言编写得到的,目标合约源码对初始合约源码进行插桩得到的,则将目标测试样例和目标合约源码输入至Java虚拟机,执行目标合约源码,得到执行结果。具体地,可以每次输入一个目标测试样例和目标合约源码至Java虚拟机,得到多个执行结果。可以理解地,也可以一次输入目标合约源码和多个目标测试样例,得到多个执行结果。其中,执行结果包含目标合约源码执行过程中有无出现报错、中断以及在什么位置出现报错、中断等信息。
进一步地,Java虚拟机还可以输出初始测试样例对应的执行路径信息,即目标合约源码执行过程中,初始测试样例经过的路径信息。
S14:基于若干执行结果,确定目标合约源码的漏洞。
根据执行结果有无出现异常,则可以分析得到目标合约源码的漏洞。
上述方式获取若干初始测试样例和目标合约源码后;按照若干初始测试样例的优先级依序对若干初始测试样例进行变异,得到若干目标测试样例;通过对初始测试样例进行变异,即可自动生成目标测试样例,无需测试人员重新进行编写;进一步,分别利用各目标测试样例多次执行目标合约源码,得到若干执行结果;基于若干执行结果,确定目标合约源码的漏洞,通过利用多个目标测试样例多次执行目标合约源码,即可检测目标合约源码是否存在漏洞。
请参阅图3-5,图3是本申请提供的智能合约的漏洞检测方法第二实施方式的流程示意图,图4是本申请提供的控制流图一实施方式的简化示意图,图5是本申请提供的控制流图另一实施方式的简化示意图;该方法包括:
S31:获取若干初始测试样例和目标合约源码。
S32:获取若干初始测试样例对应的执行路径信息。
本实施方式中,初始测试样例是前一次漏洞检测过程中使用的目标测试样例。具体地,在前一次漏洞检测过程中,将变异得到的测试样例作为目标测试样例输入至java虚拟机,java虚拟机利用目标测试样例执行目标合约源码,得到执行结果以及初始测试样例对应的执行路径信息,初始测试样例对应的执行路径信息是基于初始测试样例在控制流图中的跳转情况获取得到的。
初始测试样例对应的执行路径信息包含初始测试样例经过的若干个分支路径的执行信息。在一具体实施方式中,如图4所示,图4左侧为目标合约源码,假设input为100,则可以得到start->1->4->end的路径序列,可以将该路径序列作为初始测试样例对应的执行路径信息,从该路径序列可知初始测试样例经过两个分支,两个分支分别为由节点2和节点4组成的第一分支,以及由节点5和节点end组成的第二分支。
在另一实施方式中,在执行步骤S32之前,智能合约的漏洞检测方法还包括:获取初始合约源码;对初始合约源码进行编译,得到字节码;基于字节码中具有跳转关系的若干操作码,将字节码分割为若干操作码序列;每段操作码序列只能从头部开始执行,从尾部结束,不存在任何执行情况跳转到该操作码序列中间任何位置开始执行,一段操作码序列执行完毕后,将跳转到与其具有跳转关系的另一段操作码序列,并执行另一段操作码序列。响应于用户的控制流图构建指令,构建控制流图;其中,控制流图中包含若干个节点和若干条连接节点的边,若干个节点对应若干个操作码序列,若干条边对应跳转关系。如图5所示,根据目标合约代码在节点2的执行结果,跳转到节点3或节点4,例如,节点2对应的代码逻辑为判断输入的参数是否大于预设参数,若是,则跳转到节点3,若否,跳转到节点4。
进一步地,已知控制流图的字节码,可以对字节码进行插桩,此时插桩是为了获取初始测试样例对应的执行路径信息,具体地,可以对每条边叫上一段记录跳转目标位置的记录代码,记录代码用于记录初始测试样例在控制流图中的跳转情况;基于初始测试样例在所述控制流图中的跳转情况,即可得到初始测试样例对应的执行路径信息。
S33:基于若干初始测试样例对应的执行路径信息,确定若干与初始测试样例关联的第一距离。
在一实施方式中,对于每个初始测试样例,其执行的路径可以包含多个分支路径,利用初始测试样例对应的若干个分支路径的执行信息,分别计算初始测试样例与每个分支路径中的未达分支之间的第二距离。
将初始合约源码以控制流图的形式展现后,所述分支路径即为控制流图中的边和节点。如图5所示,假设初始测试样例的执行路径为节点1-节点2-节点4-节点6,初始测试样例经过第一分支路径和第二分支路径,然而初始测试用例仅经过第一分支路径的节点4和第二分支路径的节点6,则对于第一分支路径来说,从节点2到节点3路径即为第一分支路径的未达分支,同理,对于第二分支路径来说,从节点4到节点5的路径即为第二分支路径的未达分支。
其中,在一实施方式中,对于各分支路径,计算初始测试样例与分支路径中的未达分支之间的第二距离时,可以判断分支路径对应的目标节点的第一参数和分支路径的执行信息关联的第二参数是否满足预设条件;若是,则将第一参数和第二参数的差值与预设数值的和作为第二距离;若否,则将预设数值作为第二距离;其中,目标节点为每个分支路径中的未达分支所包含的节点,分支路径的执行信息关联的第二参数可以是初始测试用例中的数据,也可以是执行信息中的数据。具体地,可以通过下述公式得到第二距离:
公式1中,db(s,bri)表示初始测试样例s与第i个分支的未达分支的第二距离;k为预设数值,本申请中为1;b为目标节点的第一参数;a为分支路径的执行信息关联的第二参数;ei为分支路径的执行信息;预设条件为if ei is a==b or a>=b or a>b or a<=bor a<b。
如图5所示,对于第一分支路径,计算初始测试样例与第一分支路径中的未达分支之间的第二距离时,可以判断分支路径对应的目标节点(即节点2)的第一参数和分支路径的执行信息关联的第二参数是否满足预设条件,例如第一参数a为100,第二参数b也为100,预设条件为a>b,通过判断可知第一参数a不大于第二参数b,则初始测试样例与第一分支路径中的未达分支之间的第二距离为|a-b|+k,本申请中k为1,则初始测试样例与第一分支路径中的未达分支之间的第二距离为1。同理,初始测试样例与第二分支路径中的未达分支之间的第二距离也采用该方式计算。
对于每个初始测试样例,获取初始测试样例与每个分支路径中的未达分支之间的第二距离后,可以基于初始测试样例与多个未达分支之间的多个未达距离,得到与初始测试样例关联的第一距离。具体地,可以利用下述公式2得到第一距离。
公式2中,d(s,Bt)为与初始测试样例关联的第一距离,α为1,db(s,bri)表示初始测试样例s与第i个分支的未达分支的第二距离。
S34:基于若干与初始测试样例关联的第一距离,确定若干初始测试样例的优先级。
在一实施方式中,可以按照若干与初始测试样例关联的第一距离的大小进行排序,例如从小到大排列,对第一距离小的初始测试样例优先进行变异。可以理解地,测试人员可以选择性地对部分或全部初始测试样例进行变异。
S35:按照若干初始测试样例的优先级依序对若干初始测试样例进行变异,得到若干目标测试样例。
S36:分别利用各目标测试样例多次执行目标合约源码,得到若干执行结果。
S37:基于若干执行结果,确定目标合约源码的漏洞。
本实施方式中,步骤S31以及步骤S35-S37请参考第一实施方式的步骤S11-S14,此处不再赘述。
通过本实施方式,可以确定若干初始测试样例的优先级,按照若干初始测试样例的优先级依序对若干初始测试样例进行变异,得到目标测试样例,再利用目标测试样例检测目标合约源码中的漏洞,可以提高检测效率。
请参阅图6,图6是本申请提供的智能合约的漏洞检测方法第三实施方式的流程示意图,该方法包括:
S61:获取若干初始测试样例和目标合约源码。
S62:对于每个初始测试样例,将初始测试样例进行二进制转换;得到转换测试样例;每个转换测试样例包含若干二进制位。
S63:对转换测试样例包含的至少部分二进制位进行翻转、加减运算、替换中的至少一种变异,得到至少一个目标测试样例。
在一实施方式中,对转换测试样例包含的至少二进制位进行翻转可以按照每n个步长从头开始翻转,n为任意整数。例如,转换测试样例为10101010,n为2,则翻转得到的目标测试样例可以是01101010、10011010、10100110或10101001。
对转换测试样例包含的至少部分二进制位进行加减运算,可以利用转换测试样例包含的至少部分二进制位和预定义的算数种子集中的算数种子样例进行加减运算。具体地,可以每次对转换测试样例中的n个二进制位进行加减运算,算数种子样例也包含n个二进制位。例如,对转换测试样例中的8个二进制位进行运算,则算数种子样例也包含8个二进制位,且算数种子集中包含由8个二进制位组成的所有情况,每个8位二进制数为一个算数种子样例,如算数种子样例为10101100、00101100、01010110等。可以理解地,用户可以从算数种子集中选择部分算数种子样例与转换测试样例包含的至少部分二进制位进行加减运算。
对转换测试样例包含的至少部分二进制位进行替换可以是利用预定义的特殊种子集中的特殊测试样例进行替换,也可以是利用其它任一初始测试样例中的部分二进制位进行替换。具体地,利用预定义的特殊种子集中的特殊测试样例进行替换可以每次替换n个二进制位,按照每n个二进制位从转换测试样例的头部开始进行替换。如转换测试样例为10101010,每次替换四个二进制位,替换位0101,则得到的目标测试样例是01011010或10100101。预定义的特殊种子集可以包含一些特殊样例,例如需要对转换测试样例包含的至少部分二进制位进行替换,则特殊样例也包含至少部分二进制位,且表示特殊样例的二进制数为最大数、最小数或中间数,如转换测试样例为10101010,包含8个二进制位,则特殊样例可以为11111111、00000000等。
利用其它任一初始测试样例中的部分二进制位进行替换可以是随机将转换测试样例和其它任一初始测试样例进行裁剪后拼接得到目标测试样例。
本实施方式中,每次对转换测试样例可以执行一种变异,分别执行多次,得到多个目标测试样例;还可以每次对一个测试样例进行多种变异,得到多个目标测试样例。
S64:分别利用各目标测试样例多次执行目标合约源码,得到若干执行结果。
S65:基于若干执行结果,确定目标合约源码的漏洞。
步骤S64和S65请参考智能合约的漏洞检测方法第一实施方式的步骤S13和S14,此处不再赘述。
请参阅图7,图7是本申请提供的智能合约的漏洞检测方法第四实施方式的流程示意图,该方法包括:
S71:获取初始合约源码、匹配策略和生成策略;以及,获取初始合约源码中的初始语句。
在一实施方式中,初始合约源码、匹配策略和生成策略均由用户提供,匹配策略可以为算数运算符、关系运算符、条件运算符、条件语句、函数声明语句、变量声明语句等,生成策略可以为生成assert语句,可以理解地,匹配策略和生成策略均由用户根据具体测试要求进行定义,此处不做具体限定。
S72:利用与匹配策略匹配的初始语句和生成策略,生成目标语句。
S73:将初始合约源码中初始语句替换为目标语句,得到目标合约源码。
S74:获取若干初始测试样例和目标合约源码。
S75:按照若干初始测试样例的优先级依序对若干初始测试样例进行变异,得到若干目标测试样例。
S76:分别利用各目标测试样例多次执行目标合约源码,得到若干执行结果。
S77:基于若干执行结果,确定目标合约源码的漏洞。
其中,步骤S74-S77请参考智能合约的漏洞检测方法第一实施方式的步骤S11-S14,此处不再赘述。
S78:获取更新后的匹配策略和更新后的生成策略,以及,获取目标合约源码中与更新后的匹配策略匹配的目标语句。
S79:利用与更新后的匹配策略匹配的目标语句和更新后的生成策略,生成更新后的目标语句。
S710:将目标合约源码中与更新后的匹配策略匹配的目标语句替换为更新后的目标语句,得到更新后的目标合约源码。
S711:分别利用目标测试样例多次执行更新后的目标合约源码,得到若干更新后的执行结果。
本实施方式中将初始合约源码中初始语句替换为目标语句,是为了判断在何种情况下中断程序报出崩溃信息。若完成目标合约源码中某一具体漏洞的检测后,用户需要进一步检测其它漏洞,则可以更新匹配策略和生成策略,利用更新后的匹配策略匹配的目标语句和更新后的生成策略,生成更新后的目标语句。进一步将目标合约源码中的目标语句替换为更新后的目标语句,得到更新后的目标合约源码,分别利用目标测试样例多次执行更新后的目标合约源码,得到若干更新后的执行结果,基于若干更新后的执行结果,判断目标合约源码中是否存在对应的漏洞。
请参阅图8,图8是本申请提供的智能合约的漏洞检测装置一实施方式的框架示意图,该漏洞检测装置80包含测试样例生成模块801、测试模块802、测试准则生成模块803。
测试样例生成模块801用于获取若干初始测试样例,并按照若干初始测试样例的优先级依序对若干初始测试样例进行变异,得到若干目标测试样例。其中,初始测试样例可以是前一次漏洞检测过程得到的目标测试样例,也可以是利用随机数生成器生成的,具体可参考上述智能合约的漏洞检测方法第一实施方式中的相关描述。若初始测试样例可以是前一次漏洞检测过程得到的目标测试样例,则测试样例生成模块801还可以获取前一次漏洞检测过程得到的目标测试样例的执行信息,利用该执行信息确定当前漏洞检测过程中的若干初始测试样例的优先级顺序,优先级顺序的具体确定步骤也请参考上述智能合约的漏洞检测方法实施例,此处不再赘述。测试样例生成模块801从生成的若干目标测试样例中选择至少一个目标测试样例输入至测试模块802。
测试模块802获取嵌入测试准则的目标合约源码以及测试样例生成模块801提供的目标测试样例,利用目标测试样例和java虚拟机执行目标合约源码,得到目标测试样例对应的执行信息以及执行结果,将执行结果输入至测试准则生成模块803,测试准则生成模块803基于执行结果得到目标合约源码的漏洞;将目标测试样例对应的执行信息输入至测试样例生成模块801,使得测试样例生成模块801在下一次漏洞检测过程中可以基于目标测试样例对应的执行信息对当前测试样例漏洞检测过程使用的若干目标测试样例进行优先级排序。其中,嵌入测试准则的目标合约源码表示目标合约源码中包含利用测试准则的生成策略生成的目标语句;具体地,测试准则包含匹配策略和生成策略,获取初始合约源码与匹配策略匹配的初始语句,利用生成策略和初始语句生成目标语句,将初始合约源码中的初始语句替换为目标语句,即可得到目标合约源码。
测试准则生成模块803可以用于基于执行结果,确定测试结果,测试结果即为目标合约源码中是否存在对应的漏洞。进一步地,测试准则生成模块803还可以确定测试准则,用户可以提供自定义的测试准则对测试准则模块进行更新。由于测试准则模块与合约测试模块互相分离的设计,测试准则模块的更新不会对其他模块产生影响。
请参阅图9,图9是本申请提供的电子设备一实施方式的框架结构示意图。
电子设备90包括相互耦接的存储器91和处理器92,存储器91存储有程序指令,处理器92用于执行存储器91中存储的程序指令,以实现上述任一方法实施方式的步骤。在一个具体的实施场景中,电子设备90可以包括但不限于:微型计算机、服务器,此外,电子设备90还可以包括笔记本电脑、平板电脑等移动设备,在此不做限定。
具体而言,处理器92用于控制其自身以及存储器91以实现上述任一组织体系构建方法实施方式的步骤。处理器92还可以称为CPU(Central Processing Unit,中央处理单元)。处理器92可能是一种集成电路芯片,具有信号的处理能力。处理器92还可以是通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(ApplicationSpecific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable GateArray,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。另外,处理器92可以由集成电路芯片共同实现。
请参阅图10,图10是本申请提供的计算机可读存储介质一实施方式的框架示意图。
计算机可读存储介质100存储有程序指令101,程序指令101被处理器执行时,用以实现上述任一方法实施例中的步骤。
计算机可读存储介质100具体可以为U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等可以存储计算机程序的介质,或者也可以为存储有该计算机程序的服务器,该服务器可将存储的计算机程序发送给其它设备运行,或者也可以自运行该存储的计算机程序。
若本申请技术方案涉及个人信息,应用本申请技术方案的产品在处理个人信息前,已明确告知个人信息处理规则,并取得个人自主同意。若本申请技术方案涉及敏感个人信息,应用本申请技术方案的产品在处理敏感个人信息前,已取得个人单独同意,并且同时满足“明示同意”的要求。例如,在摄像头等个人信息采集装置处,设置明确显著的标识告知已进入个人信息采集范围,将会对个人信息进行采集,若个人自愿进入采集范围即视为同意对其个人信息进行采集;或者在个人信息处理的装置上,利用明显的标识/信息告知个人信息处理规则的情况下,通过弹窗信息或请个人自行上传其个人信息等方式获得个人授权;其中,个人信息处理规则可包括个人信息处理者、个人信息处理目的、处理方式以及处理的个人信息种类等信息。
以上所述仅为本申请的实施方式,并非因此限制本申请的专利范围,凡是利用本申请说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本申请的专利保护范围内。
Claims (10)
1.一种智能合约的漏洞检测方法,其特征在于,所述方法包括:
获取若干初始测试样例和目标合约源码;
按照所述若干初始测试样例的优先级依序对所述若干初始测试样例进行变异,得到若干目标测试样例;
分别利用各所述目标测试样例多次执行所述目标合约源码,得到若干执行结果;
基于所述若干执行结果,确定所述目标合约源码的漏洞。
2.根据权利要求1所述的方法,其特征在于,在所述获取若干初始测试样例之后,所述方法还包括:
获取所述若干初始测试样例对应的执行路径信息;
基于所述若干初始测试样例对应的执行路径信息,确定若干与所述初始测试样例关联的第一距离;
基于所述若干与所述初始测试样例关联的第一距离,确定所述若干初始测试样例的优先级;其中,所述第一距离小的所述初始测试样例优先进行变异。
3.根据权利要求2所述的方法,其特征在于,所述初始测试样例对应的执行路径信息包含初始测试样例经过的若干个分支路径的执行信息;
所述基于所述若干初始测试样例对应的执行路径信息,确定若干与所述初始测试样例关联的第一距离,包括:
对于每个初始测试样例,利用所述初始测试样例对应的若干个分支路径的执行信息,分别计算所述初始测试样例与每个分支路径中的未达分支之间的第二距离;
基于所述初始测试样例与每个分支路径中的未达分支之间的第二距离,确定与所述初始测试样例关联的第一距离。
4.根据权利要求3所述的方法,其特征在于,在所述获取所述若干初始测试样例对应的执行路径信息之前,所述方法还包括:
对初始合约源码进行编译,得到字节码;
基于所述字节码中具有操作关系的若干操作码,将所述字节码分割为若干操作码序列;
响应于用户的控制流图构建指令,构建控制流图;其中,所述控制流图中包含若干个节点和若干条连接所述节点的边,所述若干个节点对应所述若干个操作码序列,所述若干条边对应所述跳转关系;
所述获取所述若干初始测试样例对应的执行路径信息,包括:
在所述控制流图中记录所述若干初始测试样例在所述控制流图中的跳转情况;其中,所述跳转情况是通过所述控制流图的边对应的记录代码得到;
基于所述若干初始测试样例在所述控制流图中的跳转情况,获取所述若干初始测试样例对应的执行路径信息。
5.根据权利要求4所述的方法,其特征在于,所述节点包含第一参数和预设条件;
所述利用所述初始测试样例对应的若干个分支路径的执行信息,分别计算所述初始测试样例与每个分支路径中的未达分支之间的第二距离,包括:
对于各所述分支路径,判断所述分支路径对应的目标节点的第一参数和所述分支路径的执行信息关联的第二参数是否满足预设条件;若是,则将所述第一参数和所述第二参数的差值与预设数值的和作为所述第二距离;若否,则将所述预设数值作为所述第二距离;其中,所述目标节点为所述每个分支路径中的未达分支所包含的节点。
6.根据权利要求1所述的方法,其特征在于,所述按照若干初始测试样例的优先级依序对所述若干初始测试样例进行变异,得到若干目标测试样例,包括:
对于每个初始测试样例,将所述初始测试样例进行二进制转换;得到转换测试样例;每个转换测试样例包含若干二进制位;
对所述转换测试样例包含的至少部分所述二进制位进行翻转、加减运算、替换中的至少一种变异,得到至少一个目标测试样例。
7.根据权利要求1所述的方法,其特征在于,在所述获取若干初始测试样例和目标合约源码之前,还包括:
获取初始合约源码、匹配策略和生成策略;以及,获取所述初始合约源码中的初始语句;
利用与所述匹配策略匹配的初始语句和所述生成策略,生成目标语句;
将所述初始合约源码中所述初始语句替换为所述目标语句,得到所述目标合约源码。
8.根据权利要求7所述的方法,其特征在于,在所述基于所述若干执行结果,确定所述目标合约源码的漏洞之后,还包括:
获取更新后的匹配策略和更新后的生成策略,以及,获取所述目标合约源码中与所述更新后的匹配策略匹配的目标语句;
利用与所述更新后的匹配策略匹配的目标语句和所述更新后的生成策略,生成更新后的目标语句;
将所述目标合约源码中与更新后的匹配策略匹配的目标语句替换为所述更新后的目标语句,得到更新后的目标合约源码;
分别利用所述目标测试样例多次执行所述更新后的目标合约源码,得到若干更新后的执行结果。
9.一种电子设备,其特征在于,所述电子设备包括相互耦接的存储器和处理器,
所述存储器存储有程序指令;
所述处理器用于执行所述存储器中存储的程序指令,以实现权利要求1-8任一项所述的方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质用于存储程序指令,所述程序指令能够被执行以实现如权利要求1-8任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211496270.7A CN115795479A (zh) | 2022-11-24 | 2022-11-24 | 一种智能合约的漏洞检测方法、电子设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211496270.7A CN115795479A (zh) | 2022-11-24 | 2022-11-24 | 一种智能合约的漏洞检测方法、电子设备和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115795479A true CN115795479A (zh) | 2023-03-14 |
Family
ID=85441902
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211496270.7A Pending CN115795479A (zh) | 2022-11-24 | 2022-11-24 | 一种智能合约的漏洞检测方法、电子设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115795479A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116702157A (zh) * | 2023-06-21 | 2023-09-05 | 烟台大学 | 一种基于神经网络的智能合约漏洞检测方法 |
-
2022
- 2022-11-24 CN CN202211496270.7A patent/CN115795479A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116702157A (zh) * | 2023-06-21 | 2023-09-05 | 烟台大学 | 一种基于神经网络的智能合约漏洞检测方法 |
CN116702157B (zh) * | 2023-06-21 | 2023-12-26 | 烟台大学 | 一种基于神经网络的智能合约漏洞检测方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
TWI493464B (zh) | 用於晚期繫結可程式化輔助的系統與方法 | |
JP7201078B2 (ja) | データ引数を動的に識別し、ソースコードを計装するためのシステムと方法 | |
Elberzhager et al. | Reducing test effort: A systematic mapping study on existing approaches | |
US7451439B2 (en) | System and method for automatically identifying compound refactorings of program code through quantitative metric analysis | |
US10365905B1 (en) | Systems and methods for evaluating application performance changes via comparative call graphs | |
CN109376535B (zh) | 一种基于智能化符号执行的漏洞分析方法及*** | |
US20110016452A1 (en) | Method and system for identifying regression test cases for a software | |
US20100050155A1 (en) | Method, computer program product, and hardware product for providing program individuality analysis for source code programs | |
Jimenez et al. | Profiling android vulnerabilities | |
Zhang et al. | {APICraft}: Fuzz driver generation for closed-source {SDK} libraries | |
JP6904043B2 (ja) | 未知のプログラムバイナリのための入力発見 | |
CN108984416B (zh) | 一种评估Maven环境中依赖冲突危险级别的方法 | |
US20210182039A1 (en) | Apparatus and method for source code optimisation | |
Wang et al. | Lightweight global and local contexts guided method name recommendation with prior knowledge | |
Arcelli et al. | EASIER: an Evolutionary Approach for multi-objective Software archItecturE Refactoring | |
JP2021533485A (ja) | プログラムの機能を向上するための制御フローシステム、非一時的可読媒体、および方法 | |
CN115659358B (zh) | 一种智能合约模糊测试方法及装置 | |
CN115795479A (zh) | 一种智能合约的漏洞检测方法、电子设备和存储介质 | |
US20210405980A1 (en) | Long method autofix engine | |
Do et al. | Explaining static analysis with rule graphs | |
Zhang et al. | An empirical study on clone consistency prediction based on machine learning | |
Campos et al. | GUIsurfer: A reverse engineering framework for user interface software | |
CN116702157B (zh) | 一种基于神经网络的智能合约漏洞检测方法 | |
Saumya et al. | Xstressor: Automatic generation of large-scale worst-case test inputs by inferring path conditions | |
Ngo et al. | Ranking warnings of static analysis tools using representation learning |
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 |