智能合约的利用程序获取方法、装置及存储介质与流程

专利2022-06-29  32


本申请涉及计算机技术领域,尤其涉及一种智能合约的利用程序获取方法、装置及存储介质。



背景技术:

区块链的不可篡改特性使得智能合约的更新机制与传统程序的更新机制是不同的,一旦智能合约被发布并存储在区块链上,智能合约便无法再被随意更改。与其他业务不同的是,智能合约本身带有一些金融属性,其运行时涉及账户及其资金变化等。如果发布在区块链上的智能合约存在安全漏洞,存在安全漏洞的智能合约更易被攻击者利用,从而造成数据维护等技术问题甚至法律问题。

目前对智能合约的安全漏洞检测分为漏洞和利用程序(exploit)两个层面。漏洞是已经被黑客攻击造成巨大损失或被白帽子发现的可能引发损失的代码问题。例如整型溢出漏洞、重入漏洞、时间戳依赖性漏洞等。利用程序是一段通过触发一个或几个漏洞进而达成某种目的的代码。例如存在调用路径使得某账户能获得非法盈利或者某账户能越过特权执行合约析构等危险操作。

然而,目前安全漏洞检测方法的覆盖率低、效率低并且误报率较高。所以,如何提高安全漏洞检测方法的效率、覆盖率以及降低检测方法的误报率已成为业界亟待解决的技术问题。



技术实现要素:

鉴于以上所述相关技术的缺点,本申请的目的在于提供一种智能合约的利用程序获取方法、装置及存储介质,用于解决现有技术中如何提高安全漏洞检测方法的效率、覆盖率以及降低检测方法的误报率的问题。

为实现上述目的及其他相关目的,本申请的第一方面提供一种智能合约的利用程序获取方法,包括:通过污点分析得到智能合约的污点数据所对应的一或多个合约函数的变量依赖关系;生成交易序列;其中,所述交易序列所包含的一或多个交易所使用的合约函数遵循所述变量依赖关系;将所述交易序列在合约执行环境中执行以获得执行路径;在根据所述执行路径分析获得异常事件时,判别该交易序列相关于利用程序;根据执行路径生成反馈信息,以用于对下一次待生成的交易序列的生成指导依据进行更新。

在本申请的第一方面的某些实施方式中,所述异常事件包括:出现异常动作和/或合约账户状态变化异常。

在本申请的第一方面的某些实施方式中,新增的敏感操作对应于覆盖率的变化。

在本申请的第一方面的某些实施方式中,所述生成指导依据包括:所述智能合约中的一或多个合约函数的被使用概率;所述反馈信息包括:对应引起覆盖率变化的交易序列所使用的各合约函数的概率奖励;所述概率奖励供作用至所述被使用概率。

在本申请的第一方面的某些实施方式中,所述交易所使用的合约函数的函数参数是随机生成的。

在本申请的第一方面的某些实施方式中,所述随机生成的方式包括:对于静态长度的函数参数:在该静态长度所对应的取值范围内随机选取函数参数;或者,对于动态长度的函数参数:令一数值作为构成该动态长度的函数参数的多个静态长度的静态参数的数量;在该每个静态长度所对应的取值范围内随机选取每个静态参数以满足该数量;根据各所述静态参数构成所述动态长度的函数参数。

在本申请的第一方面的某些实施方式中,所述生成指导依据包括动态种子集合,所述交易所使用的合约函数的函数参数选自动态种子集合。

在本申请的第一方面的某些实施方式中,所述反馈信息还包括:由对应引起覆盖率变化的交易序列所使用的各合约函数对应的函数参数所形成的动态种子;所述动态种子供加入至所述动态种子集合中。

在本申请的第一方面的某些实施方式中,每个函数参数对应于一子动态种子集合,并与其所对应的子动态种子集合中的各动态种子的参数类型相同。

在本申请的第一方面的某些实施方式中,所述执行路径包括:每个交易执行所涉及的指令执行状态。

在本申请的第一方面的某些实施方式中,所述指令执行状态包括:指令状态、堆栈状态、寄存器状态、及内存状态中的一种或多种组合。

在本申请的第一方面的某些实施方式中,所述合约执行环境包括:evm环境。

在本申请的第一方面的某些实施方式中,所述合约执行环境的配置中包括以下中的任意一种或多种组合:a)预设余额的合约账户、以及部署有由待检测的智能合约的代码编译得到的字节码;b)区块性质的配置接口,以提供区块性质作为待生成的交易序列中每个交易的交易属性的生成依据;c)能对合约的外部调用强制引发异常处理。

在本申请的第一方面的某些实施方式中,所述污点分析包括:将智能合约的代码转换为中间语言以进行控制流图转换获得对应的控制流图;对所述控制流图中的环路进行剪切以形成树状路径;遍历所有树状路径以得到污点数据。

在本申请的第一方面的某些实施方式中,所述污点分析为静态分析。

本申请的第二方面还提供一种智能合约的利用程序获取装置,包括:污点分析器,用于通过污点分析得到智能合约的污点数据所对应的一或多个合约函数的变量依赖关系;交易序列生成器,用于生成交易序列;其中,所述交易序列所包含的一或多个交易所使用的合约函数遵循所述变量依赖关系;合约执行环境,用于执行所述交易序列以获得执行路径;利用程序探测器,用于在根据所述执行路径分析获得异常事件时,判别该交易序列相关于利用程序;反馈生成器,用于根据执行路径生成反馈信息,以用于对交易序列生成器下一次待生成的交易序列的生成指导依据进行更新。

在本申请的第二方面的某些实施方式中,所述异常事件包括:出现异常动作和/或合约账户状态变化异常。

在本申请的第二方面的某些实施方式中,包括:反馈处理器,用于管理所述生成指导依据,并根据所述反馈信息更新所述生成指导依据。

在本申请的第二方面的某些实施方式中,新增的敏感操作对应于覆盖率的变化。

在本申请的第二方面的某些实施方式中,所述生成指导依据包括:所述智能合约中的一或多个合约函数的被使用概率;所述反馈信息包括:对应引起覆盖率变化的交易序列所使用的各合约函数的概率奖励;所述概率奖励供作用至所述被使用概率。

在本申请的第二方面的某些实施方式中,所述交易所使用的合约函数的函数参数是随机生成的。

在本申请的第二方面的某些实施方式中,所述随机生成的方式包括:对于静态长度的函数参数:在该静态长度所对应的取值范围内随机选取函数参数;或者,对于动态长度的函数参数:令一数值作为构成该动态长度的函数参数的多个静态长度的静态参数的数量;在该每个静态长度所对应的取值范围内随机选取每个静态参数以满足该数量;根据各所述静态参数构成所述动态长度的函数参数。

在本申请的第二方面的某些实施方式中,所述生成指导依据包括动态种子集合,所述交易所使用的合约函数的函数参数选自动态种子集合。

在本申请的第二方面的某些实施方式中,所述反馈信息还包括:由对应引起覆盖率变化的交易序列所使用的各合约函数对应的函数参数所形成的动态种子;所述动态种子供加入至所述动态种子集合中。

在本申请的第二方面的某些实施方式中,每个函数参数对应于一子动态种子集合,并与其所对应的子动态种子集合中的各动态种子的参数类型相同。

在本申请的第二方面的某些实施方式中,所述执行路径包括:每个交易执行所涉及的指令执行状态。

在本申请的第二方面的某些实施方式中,所述指令执行状态包括:指令状态、堆栈状态、寄存器状态、及内存状态中的一种或多种组合。

在本申请的第二方面的某些实施方式中,所述合约执行环境包括:evm环境。

在本申请的第二方面的某些实施方式中,所述合约执行环境的配置中包括以下中的任意一种或多种组合:a)预设余额的合约账户、以及部署有由待检测的智能合约的代码编译得到的字节码;b)区块性质的配置接口,以提供区块性质作为待生成的交易序列中每个交易的交易属性的生成依据;c)能对合约的外部调用强制引发异常处理。

在本申请的第二方面的某些实施方式中,所述污点分析器,用于执行污点分析,包括:将智能合约的代码转换为中间语言以进行控制流图转换获得对应的控制流图;对所述控制流图中的环路进行剪切以形成树状路径;遍历所有树状路径以得到污点数据。

在本申请的第二方面的某些实施方式中,所述污点分析为静态分析。

本申请的第三方面还提供一种计算机装置,包括:一或多个存储器,用于存储至少一程序;一或多个处理器,用于调用所述至少一程序,以执行如本申请第一方面中任一项所述的智能合约的利用程序获取方法。

本申请的第四方面还提供一种计算机可读存储介质,存储有至少一程序,所述至少一程序在被调用时执行并实现如本申请第一方面中任一项所述的智能合约的利用程序获取方法。

综上所述,本申请的智能合约的利用程序获取方法、装置及存储介质,用于测试智能合约中是否有可利用的安全漏洞。本申请的方案通过污点分析得到智能合约的污点数据所对应的一或多个合约函数的变量依赖关系;生成交易序列;将所述交易序列在合约执行环境中执行以获得执行路径;在根据所述执行路径分析获得异常事件时,判别该交易序列相关于利用程序;根据执行路径生成反馈信息,以用于对下一次待生成的交易序列的生成指导依据进行更新。本申请的方案可以通过检测基于智能合约生成的交易序列是否相关于利用程序,来确定所述智能合约中是否存在可利用的安全漏洞,并且实现了高效率、高覆盖率以及低误报率的安全漏洞检测。

附图说明

本申请所涉及的发明的具体特征如所附权利要求书所显示。通过参考下文中详细描述的示例性实施方式和附图能够更好地理解本申请所涉及发明的特点和优势。对附图简要说明书如下:

图1显示为本申请的计算机装置在一实施例中的结构示意图。

图2显示为本申请的智能合约的利用程序获取方法在一实施例中的流程示意框图。

图3a显示为环路剪切前的第二控制流图在一实施例中的示意图。

图3b显示为环路剪切后的第二控制流图在一实施例中的示意图。

图4显示为本申请的智能合约的利用程序获取装置在一实施例中的示意图。

图5显示为本申请的智能合约的利用程序获取装置在另一实施例中的示意图。

图6显示为本申请的智能合约的利用程序获取装置与客户端通信的网络架构示意图。

具体实施方式

以下由特定的具体实施例说明本申请的实施方式,熟悉此技术的人士可由本说明书所揭露的内容轻易地了解本申请的其他优点及功效。

虽然在一些实例中术语第一、第二等在本文中用来描述各种元件或参数,但是这些元件或参数不应当被这些术语限制。这些术语仅用来将一个元件或参数与另一个元件或参数进行区分。例如,第一控制流图可以被称作第二控制流图,并且类似地,第二控制流图可以被称作第一控制流图,而不脱离各种所描述的实施例的范围。第一控制流图和第二控制流图均是在描述一个控制流图,但是除非上下文以其他方式明确指出,否则它们不是同一个控制流图。

再者,如同在本文中所使用的,单数形式“一”、“一个”和“该”旨在也包括复数形式,除非上下文中有相反的指示。应当进一步理解,术语“包含”、“包括”表明存在所述的特征、步骤、操作、元件、组件、项目、种类、和/或组,但不排除一个或多个其他特征、步骤、操作、元件、组件、项目、种类、和/或组的存在、出现或添加。此处使用的术语“或”和“和/或”被解释为包括性的,或意味着任一个或任何组合。因此,“a、b或c”或者“a、b和/或c”意味着“以下任一个:a;b;c;a和b;a和c;b和c;a、b和c”。仅当元件、功能、步骤或操作的组合在某些方式下内在地互相排斥时,才会出现该定义的例外。

在区块链平台上发布的智能合约是编译器将开发人员使用高级编程语言编写的智能合约的源代码编译成的可供虚拟机执行的智能合约的字节码,所述智能合约一旦被发布到区块链平台上将由区块链平台中的多个节点设备共同维护和使用。以发布在以太坊(ethereum)区块链平台上的智能合约为例,由于所述智能合约可以对接收到的信息进行回应,可以接收和储存账户信息及所对应的资金信息,也可以向外发送用户账户信息及所对应的资金信息。基于上述智能合约的金融属性,如果发布在区块链上的智能合约存在安全漏洞,存在安全漏洞的智能合约更易被攻击者利用从中获利。

目前,对智能合约的安全漏洞检测分为漏洞和利用程序(exploit)两个层面。漏洞是已经被黑客攻击造成巨大损失或被白帽子发现的可能引发损失的代码问题。例如整型溢出漏洞、重入漏洞、时间戳依赖性漏洞等。利用程序是一段通过触发一个或几个漏洞进而达成某种目的的代码。例如存在调用路径使得某账户能获得非法盈利或者某账户能越过特权执行合约析构等危险操作。

漏洞层面的检测方法能检测出已经被发现的静态代码问题。利用程序层面的检测方法能检测出所述智能合约中是否存在可利用的安全漏洞。相比于漏洞层面的安全漏洞检测方法,利用程序层面的检测方法可以挖掘出智能合约中隐藏的安全漏洞。

但是,目前利用程序层面的安全漏洞检测方法的覆盖率低、效率低并且误报率较高。

为此,本申请提供智能合约的利用程序获取方法、装置及存储介质,可以从生成的交易序列中发现会触发智能合约中安全漏洞的利用程序。

请参阅图1,图1显示为本申请的计算机装置在一实施例中的结构示意图,如图1所示,所述计算机装置100包括一个或多个存储器101、一个或多个处理器102。

所述一个或多个存储器101用于存储至少一个程序,用以在执行时执行如图2所示的智能合约的利用程序获取方法的各步骤,所述利用程序获取方法可以在每次迭代过程中基于智能合约中的合约函数持续生成交易序列,通过检测交易序列是否相关于利用程序(例如,所述交易序列为利用程序或者所述交易序列中包含所述利用程序),来确定所述智能合约是否存在安全漏洞。具体地,如果在迭代过程中获取到了利用程序,则认为所述智能合约中存在可利用的安全漏洞。提升了利用程序层面的安全漏洞检测方法的覆盖率、效率并且降低了检测方法的误报率。在一些实施例中,所述存储器101可包括高速随机存取存储器,并且还可包括非易失性存储器,例如一个或多个磁盘存储设备、闪存设备或其他非易失性固态存储设备。在某些实施例中,存储器101还可以包括远离一个或多个处理器的存储器,例如经由rf电路或外部端口以及通信网络(未示出)访问的网络附加存储器,其中所述通信网络可以是因特网、一个或多个内部网、局域网(lan)、广域网(wan)、存储局域网(san)等,或其适当组合。所述存储器101还包括存储器控制器可控制设备的诸如cpu和外设接口之类的其他组件对存储器的访问。

所述一个或多个处理器102可操作地与存储器和/或非易失性存储器耦接,用于调用所述至少一程序,以执行本申请所述的智能合约的利用程序获取方法。更具体地,处理器102可执行在存储器和/或非易失性存储器中存储的指令以在计算机装置100中执行操作,诸如遍历基于一智能合约得到的合约函数的控制流图(controlflowgraph,cfg),进而基于所述控制流图来生成例如合约函数中的状态变量与参数之间的依赖关系。如此,处理器102可包括一个或多个通用微处理器、一个或多个专用处理器(asic)、一个或多个现场可编程逻辑阵列(fpga)、或它们的任何组合。

所述一个或多个处理器102还可与接口单元可操作地耦接;通过接口单元,所述计算机装置100能够与各种其他电子设备进行交互,以及可使得用户能够与计算机装置100进行交互。所述接口单元包括但不限于网卡、移动网络接入模块等。例如,所述计算机装置100将智能合约的检测结果通过所述接口单元发送给用户。其中,所述检测结果包括但不限于:智能合约存在可利用的安全漏洞的结果、智能合约不存在可利用的安全漏洞的结果、与利用程序相对应的交易序列、包含利用程序的交易序列、及可利用的安全漏洞的具体形式等中的一种或多种组合。

请参阅图2,图2显示为本申请的智能合约的利用程序获取方法在一实施例中的流程示意框图。在一些实施例中,所述利用程序获取方法可由本申请所述的计算机装置100执行.

在步骤s110中,通过污点分析得到智能合约的污点数据所对应的一或多个合约函数的变量依赖关系。

其中,所述污点分析是将智能合约中的合约函数中任何能够被修改的变量标记为污点数据,进而得到各污点数据所对应的一个或多个合约函数的变量依赖关系。所述污点分析包括:静态分析、动态分析。其中,所述静态分析是指不运行代码的方式下,通过语法分析、控制流图等对智能合约的代码进行分析。所述动态分析是指在实际运行代码的方式下对代码进行分析。

在一实施例中,所述污点分析为静态分析,在分析过程中遍历所述智能合约源代码中的每个合约函数,得到所有可能的执行流程,进而生成所述智能合约的控制流图。其中,所述控制流图举例为有向图,例如,图g=(n,e,nentry,nexit)。其中,n是节点集,所述合约函数的每个语句都对应图中的一个节点;边集e={(n1,n2)|n1,n2∈n且n1执行后,可能立即执行n2};nentry和nexit分别为智能合约的入口节点和出口节点。

其中,所述智能合约的源代码是利用高级编程语言编写的。通过编译器编译所述智能合约的源代码可以得到智能合约的字节码和程序二进制接口(applicationbinaryinterface,abi)。所述智能合约的字节码可供虚拟机或处理器执行,使得智能合约能在区块链上运行。所述程序二进制接口是在区块链外部与智能合约进行交互以及智能合约与智能合约间进行交互的一种标准方式。所述程序二进制接口包括但不限于:调用约定、指定的文件格式、指定的数据类型等。其中,所述智能合约的源代码中包含一或多个合约函数。其中,所述高级编程语言包括但不限于以下任一种:solidity语言、c 语言、go语言、rust语言、python语言、javascript语言、java语言、hashell语言、ruby语言等,所述编译器与所述高级编程语言相对应,所述高级编程语言不同则编译时所使用的编译器的种类也不同。

在所述污点分析过程中,对污点数据进行标记,包括:例如将合约函数中的状态变量、函数参数(例如,合约函数的传入参数)以及高级编程语言所对应的内置变量(例如solidity内置变量)标记为污点源;例如,将状态变量和合约外部调用指令标记为污点槽;例如,基于得到的控制流图将被污点源修改过的变量标记为污点类,进而可得到所述智能合约中所有可能的污点数据。其中,所述污点数据包括但不限于上述举例中污点源所对应的变量、污点槽所对应的变量、以及被污点源修改过的变量。

在一具体实例中,所述合约函数中变量的污染情况,具体形式可呈现为:

合约函数1的id:

变量:状态变量1;操作:写入;依赖于:msg.value,参数1;

变量:状态变量2;操作:发送;依赖于:msg.value,状态变量3;

合约函数2的id:

变量:状态变量1;操作:条件判断;依赖于:状态变量4,参数1;

其中,合约函数1中的状态变量1、参数2、状态变量2、及状态变量3为合约函数1的污点数据。合约函数2中的状态变量1、状态变量4、及参数1为合约函数2的污点数据。

基于所述污点数据可得到与所述污点数据相对应的每个合约函数内的变量依赖关系。仍以合约函数2为例,合约函数2内的变量依赖关系为状态变量1依赖于状态变量4和参数1。基于智能合约中每个函数内的变量依赖关系以及合约函数之间的读取关系可得到多个合约函数的变量依赖关系。

在另一实施例中,在例如静态污点分析过程中,可根据智能合约的代码得到相应的控制流图。举例来说,可将智能合约的代码转换为中间语言(intermediatelanguage,ir)以进行控制流图转换获得对应的控制流图。

其中,所述中间语言是介于高级编程语言与二进制字节码中间的汇编语言。所述中间语言与编译器相关,不同的编译器所对应的中间语言是不同的。具体地,将所述智能合约的源代码经编译器编译成汇编语言所表示的汇编执行序列。遍历所述汇编执行序列可得到所述汇编执行序列所表示的第一控制流图。其中,所述第一控制流图中的每个节点对应的是汇编执行序列中的每个指令,所述第一控制流图中的每个边表示的指令执行的先后顺序。得到所述第一控制流图后经控制流图转换后可得到合约函数所对应的第二控制流图。

基于转换后得到的合约函数的第二控制流图,对所述第二控制流图中的环路进行剪切以形成树状路径。例如,请参阅图3a,图3a显示为环路剪切前的第二控制流图在一实施例中的示意图。图3a中存的环路为a依赖于b,b依赖于c,c依赖于d,d依赖于a,将第二控制流图中d依赖于a这一条路径进行剪切形成树状路径。环路剪切后的第二控制流图如图3b所示。其中,图3b所述的第二控制流图中的路径为树状路径。

进而,根据得到如图3b所示的树状路径的第二控制流图,遍历其中所有路径以得到污点数据。基于所述污点数据可得到与所述污点数据相对应的一或多个合约函数的变量依赖关系。其中,得到所述智能合约中的污点数据的方式与前文所述的相同或相似,在此不再详述。

在步骤s120中,生成交易序列;其中,所述交易序列所包含的一或多个交易所使用的合约函数遵循所述变量依赖关系。

其中,所述交易序列由若干个交易组成。每个交易包含一组调用的合约函数、合约函数的函数参数、及交易属性。其中,所述合约函数的函数参数是随机生成的或者选自动态种子集合。所述交易属性包括:交易的发送方、交易附带的额度、区块的时间戳和区块号等中的一或多个。

在一些实施例中,交易序列的生成指导依据包括所述智能合约中的一或多个合约函数的被使用概率。在生成交易序列的过程中,可以根据每个合约函数的被使用概率来选择要调用的合约函数。所述被使用概率描述的是每个合约函数在生成交易序列过程中被选择的概率。根据所述被使用概率通过程序二进制接口选择可调用的且存在依赖关系(例如,一个合约函数修改的状态变量会被另一个合约函数读取)的合约函数,并与所述变量依赖关系相关联,即调用的合约函数遵循步骤s110中所得到的变量依赖关系。其中,所述程序二进制接口是编译器编译所述智能合约得到的。

在可能的实施例中,在生成初始交易序列时,每个合约函数被的被使用概率是相等的;当然,此仅为举例,也可以根据例如经验或其它依据等来预设初始的被使用概率。然而,根据步骤s150中的反馈信息,可使得所述智能合约中每个函数的被使用概率发生改变,从而改变未来这些合约函数被使用的优先性。例如,更容易触发转账、合约自毁等操作的合约函数的被使用概率会增加。

之后,可为选择的合约函数生成函数参数。在一实施例中,所述交易中所使用的合约函数的函数参数是随机生成的。所述函数参数的随机生成方式是根据所述函数参数的类型来确的。具体地,对于静态长度的函数参数,在该静态长度所对应的取值范围内随机选取函数参数。对于动态长度的函数参数,令一数值作为构成该动态长度的函数参数的多个静态长度的静态参数的数量,在该每个静态长度所对应的取值范围内随机选取每个静态参数以满足该数量,根据各所述静态参数构成所述动态长度的函数参数。其中,所述静态长度的函数参数为比特长度为固定的静态长度的函数参数。所述静态长度的函数参数包括但不限于:unit256类型、int类型、address类型、bool型、byte型、bytes型、payment类型等。以uint256类型的函数参数为例,其比特长度为256比特,在随机生成函数参数时,可以在0至2256中随机选取一个数值作为生成的函数参数。其中,所述动态长度的函数参数为比特长度不固定的函数参数。所述动态长度的函数参数包括但不限于:array类型、matrix类型。以array类型的函数参数为例,由于所述array类型的函数参数是由若干个静态长度的函数参数组成的,所以,在随机生成函数参数时,随机选取一个数值作为构成array类型的函数参数的多个静态长度的静态参数的数量,在该每个静态长度所对应的取值范围内随机选取每个静态参数以满足该数量,根据各所述静态参数构成所述array类型的函数参数。在另一实施例中,交易序列的生成指导依据包括动态种子集合。所述交易中所使用的合约函数的函数参数选自动态种子集合。其中,所述动态种子集合将会根据步骤s150中的所述反馈信息进行其中动态种子的更新。所述动态种子集合及其更新方式将在步骤s150中详述。

最后,基于所选择的合约函数和生成的函数参数,生成包括交易的发送方、交易附带的额度、区块的时间戳和区块号的交易属性。其中,所述时间戳和区块号是通过合约执行环境中部署的区块性质的配置接口得到的。

通过执行选择合约函数、生成函数参数、以及生成对应的交易属性,可生成包含合约函数、函数参数、交易属性的交易序列。其中,根据步骤s150的反馈信息执行生成指导依据的更新,在进行迭代检测过程中所述交易序列还会按迭代次数重新生成。具体地,每进行一次迭代检测,即再执行步骤s120以生成交易序列,即根据反馈信息进行更新,重新得到合约函数、生成函数参数、及生成交易属性,进而生成新的交易序列。

在步骤s130中,将所述交易序列在合约执行环境中执行以获得执行路径。

所述合约执行环境是支持智能合约的执行和调用的运行环境。以利用高级语言solidity编写的智能合约为例,所述合约执行环境为evm环境。所述智能合约在以太坊上真正执行时所利用的是以太坊虚拟机(environmentvirtualmachine,evm)。所述evm环境是与所述以太坊虚拟机中的环境相同或相似的运行环境。

在一实施例中,所述合约执行环境的配置相比于现有evm环境来讲是经过修改的。

举例来说,在一实施例中,该合约执行环境配置有包括预设余额的合约账户、以及部署有由待检测的智能合约的代码经编译器编译得到的字节码。具体地,为所述交易序列配置以太坊账户作为初始化,并为每个账户的以太币余额设定一个默认值。可选地,可以为每个账户设定一个足够大的默认值。例如100万、1000万以太币等。另外,还需将经编译器编译后得到的待检测的智能合约的字节码部署到合约执行环境中。

在一实施例中,所述合约执行环境的配置中包括区块性质的配置接口,以提供区块性质作为待生成的交易序列中每个交易的交易属性的生成依据。其中,所述区块性质包括:区块的时间戳、区块号等。在步骤s120中,生成交易序列的交易属性时,基于所述区块性质配置接口所提供的区块性质生成所述交易属性中的时间戳和区块号。

在一实施例中,所述合约执行环境的配置中包括能对合约的外部调用强制引发异常处理。由于,在以太坊中的外部调用(例如send函数),可能会因为诸多原因而调用失败。这类调用失败会因为其引发的异常处理而进入其他的执行路径。所以,为了提高代码检测的覆盖率,所述执行环境会对每个外部调用执行两次。第一次正常执行,第二次强制引发异常处理。其中,所述覆盖率用来衡量检测代码的充分性和完整性。

在实际执行过程中,所述合约执行环境的配置包括上述实施例中的任意一种或多种组合。可选地,所述合约执行环境的配置包括上述三种实施例中所述的配置。

需要说明的是,在执行交易序列过程中并不需要将其部署到区块链上,而只需要将步骤s120中生成的所述交易序列放入所述合约执行环境中执行,就可以获得与所述交易序列相对应的执行路径。

其中,所述执行路径包括交易序列中每个交易执行所涉及的指令执行状态。所述指令执行状态包括:指令状态、堆栈状态、寄存器状态、及内存状态中的一种或多种组合。可选地,所述指令执行状态包括指令状态、堆栈状态、寄存器状态、和内存状态四种。其中,所述指令状态是指操作码和操作数。所述操作码用于表示该指令应进行什么性质的操作。不同的指令可以在操作码这个字段下采取不同的编码来表示,每一种编码代表一种指令,每一条指令都有一个操作码。所述操作数包括执行指令所需要数据的来源。所述堆栈状态是指当前栈中的数据。所述寄存器状态是指寄存器中存储的数据。所述内存状态是指内存中存储的数据。需要说明的是,所述寄存器中存储的就是合约函数的状态变量。

基于得到的与所述交易序列相对应的执行路径可执行步骤s140和步骤s150。

在步骤s140中,在根据所述执行路径分析获得异常事件时,判别该交易序列相关于利用程序。

具体地,当根据所述执行路径分析获得异常事件时,则判别该交易序列为利用程序,或者该交易序列包括利用程序。当判别所述交易序列相关于利用程序时,则认为该交易序列执行时触发了安全漏洞,即认定所述智能合约中存在可利用的安全漏洞。

其中,所述异常事件包括:出现异常动作,或者合约账户状态变化异常,或者既出现异常动作又存在合约账户状态变化异常。其中所述异常动作包括但不限于:执行了合约自毁操作、或调用外部合约操作等。所述合约账户状态变化异常包括但不限于:合约的账户余额变化异常,例如违背预定交易结果地减少等。

本申请所述的智能合约的利用程序获取方法是一种迭代方法,所述获取方法的步骤s120中生成的交易序列受步骤s150中所生成的反馈信息影响,在每一次迭代过程中均可以重新生成一交易序列。进而可以在每一次迭代过程中执行步骤s130和s140来判断重新生成的交易序列是否相关于利用程序,即所述智能合约中是否存在可利用的安全漏洞。具体地,如果在迭代过程中获取到了利用程序,则认为所述智能合约中存在可利用的安全漏洞。并在每次迭代检测过程中还会执行步骤s150以生成新的反馈信息。

在步骤s150中,根据执行路径生成反馈信息,以用于对下一次待生成的交易序列的生成指导依据进行更新。

承前所述,所述生成指导依据包括:所述智能合约中的一或多个合约函数的被使用概率、和/或动态种子集合。所述被使用概率用于在生成交易序列的过程中选择合约函数。所述交易序列的每一交易所使用的合约函数的函数参数选自所述动态种子集合。

在一些实施例中,所述动态种子集合初始时可以为空,会在后续的反馈过程中根据反馈信息向所述动态种子集合中添加动态种子;在生成初始交易序列时,每个合约函数被的被使用概率可以是相等的,会在后续的反馈过程更新所述被使用概率;当然,此仅为举例,可以根据实际需求加以变化。需要说明的是,所述动态种子集合初始时也可以包括预设的函数参数。其中,所述预设的函数参数为容易触发安全漏洞的函数参数。在生成初始交易序列时,每个合约函数的被使用概率也可以是不相等的。

能引起所述被使用概率进行更新的反馈信息包括:对应引起覆盖率变化的交易序列中所使用的各合约函数的概率奖励。所述概率奖励供作用至所述被使用概率。其中,在所述执行路径中所对应的操作中,新增的敏感操作对应于覆盖率的变化。所述敏感操作包括但不限于:使用sstore、selfdestruct、call、callcode、delegatecall操作码的操作。

其中,操作码sstore用来存储交易执行的状态变化;操作码selfdestruct用来自毁合约;操作码call、操作码callcode、以及操作码delegatecall均可以用于执行外部合约、合约转账等功能。所述覆盖率是指至少被执行了一次的敏感操作占所述执行路径中总的操作数目的百分比。

具体地,如果在所述执行路径中发现了在之前检测过程中未发现的上述任意一种或多种敏感操作,则认为是覆盖率增加。就会对此次执行路径所对应的交易序列所使用的合约函数的被使用概率增加相应的概率奖励,以更新所述被使用概率。更新后的被使用概率会影响下一次检测过程中合约函数的选择倾向,使更容易触发转账、合约自毁等操作的函数会有更大的概率被选择。其中,所述概率奖励举例为一个正比于覆盖率增加值的归一化的概率值,所述归一化的概率值是经过归一化处理的正比于覆盖率增加值的0至1之间的值。

例如,在第三次检测过程中发现了sstore、selfdestruct这两种敏感操作,并且这两种敏感操作在第一次和第二次检测过程中均未出现,则认为是检测的覆盖率增加。其中,所述执行路径中所对应的总操作数目为5,第二次检测完成后所对应的覆盖率假设是0.2,在第三次检测完成后的覆盖率为0.6,覆盖率增加了0.4。所述概率奖励可以是正比于0.4的一个归一化的概率值,并将这个概率值加到第三次检测所对应的交易序列所使用的合约函数的被使用概率上,以更新所述被使用概率。

需说明的是,所述之前检测过程中未发现的上述任意一种或多种敏感操作并非限制在必须是不同的操作码,同一种操作码被使用的不同的敏感操作同样会引起覆盖率的变化,例如第一次call相关的敏感操作出现时形成概率奖励,第二次call相关的敏感操作出现时也可能形成概率奖励。

能引起所述动态种子集合进行更新的反馈信息包括:由对应引起覆盖率变化的交易序列所使用的各合约函数对应的函数参数所形成的动态种子。具体地,如果在所述执行路径中发现了在之前检测过程中未发现的上述任意一种或多种敏感操作,则认为是覆盖率增加,就会将此次执行路径所对应的交易序列所使用的合约函数的函数参数作为所述动态种子,并将所述动态种子加入至所述动态种子集合中,以更新所述动态种子集合。所述更新后的动态种子集合会在下一次执行步骤s120中生成函数参数的过程中被使用。其中,下一次检测时,交易中所使用的合约函数的函数参数选自所述更新后的动态种子集合。所以,生成的函数参数更有机会选取这些曾经提升过覆盖率的参数值。

在一些实施例中,合约函数中的每个函数参数可以对应于一子动态种子集合,并与其所对应的子动态种子集合中的各动态种子的参数类型相同。例如,一合约函数中包括的-start参数是unit256类型的,该-start参数对应一子动态种子集合,所述子动态种子集合中各动态种子的参数类型均是unit256类型的。以此类推,该合约函数中的每个函数参数可均有一个与其参数类型相同的子动态种子集合。

在一些实施例中,可以设置智能合约的迭代检测次数上限,在该次数上限内重复执行步骤s120至s150。如果到达迭代测试次数的上限,仍未得到任何相关于利用程序的交易序列,则认为所述智能合约的代码是安全的,如果在测试过程中发现相关于利用程序的交易序列则认为所述智能合约中存在可利用的安全漏洞,并提供所述触发安全漏洞的交易序列。例如,所述计算机装置将触发安全漏洞的交易序列通过所述计算机装置的接口单元发送给用户。其中,所述迭代检测次数上限的取值范围可以为:1至250、250至500、500至750、750至1000、或1000至1250等。例如根据运行方法的计算机装置的性能设置迭代检测次数上限为1000等。

请参阅图4,图4显示为本申请的智能合约的利用程序获取装置在一实施例中的示意图,如图所示,所述利用程序获取装置200包括:污点分析器201、交易序列生成器202、合约执行环境203、利用程序探测器204、反馈生成器205、反馈处理器206。

所述污点分析器201用于通过污点分析得到智能合约的污点数据所对应的一或多个合约函数的变量依赖关系。

其中,所述污点分析是将智能合约中的合约函数中任何能够被修改的变量标记为污点数据,进而得到各污点数据所对应的一个或多个合约函数的变量依赖关系。所述污点分析包括:静态分析、动态分析。其中,所述静态分析是指不运行代码的方式下,通过语法分析、控制流图等对智能合约的代码进行分析。所述动态分析是指在实际运行代码的方式下对代码进行分析。

在一实施例中,所述污点分析为静态分析,在分析过程中,所述污点分析器201遍历所述智能合约源代码中的每个合约函数,得到所有可能的执行流程,进而生成所述智能合约的控制流图。其中,所述控制流图举例为有向图,例如,图g=(n,e,nentry,nexit)。其中,n是节点集,所述合约函数的每个语句都对应图中的一个节点;边集e={(n1,n2)|n1,n2∈n且n1执行后,可能立即执行n2};nentry和nexit分别为智能合约的入口节点和出口节点。

其中,所述智能合约的源代码是利用高级编程语言编写的。通过编译器编译所述智能合约的源代码可以得到智能合约的字节码和程序二进制接口(applicationbinaryinterface,abi)。所述智能合约的字节码可供虚拟机或处理器执行,使得智能合约能在区块链上运行。所述程序二进制接口是在区块链外部与智能合约进行交互以及智能合约与智能合约间进行交互的一种标准方式。所述程序二进制接口包括但不限于:调用约定、指定的文件格式、指定的数据类型等。其中,所述智能合约的源代码中包含一或多个合约函数。其中,所述高级编程语言包括但不限于以下任一种:solidity语言、c 语言、go语言、rust语言、python语言、javascript语言、java语言、hashell语言、ruby语言等,所述编译器与所述高级编程语言相对应,所述高级编程语言不同则编译时所使用的编译器的种类也不同。

在所述污点分析过程中,对污点数据进行标记,包括:例如将合约函数中的状态变量、函数参数(例如,合约函数的传入参数)以及高级编程语言所对应的内置变量(例如solidity内置变量)标记为污点源;例如,将状态变量和合约外部调用指令标记为污点槽;例如,基于得到的控制流图将被污点源修改过的变量标记为污点类,进而可得到所述智能合约中所有可能的污点数据。其中,所述污点数据包括但不限于上述举例中污点源所对应的变量、污点槽所对应的变量、以及被污点源修改过的变量。

在一具体实例中,所述合约函数中变量的污染情况,具体形式可呈现为:

合约函数1的id:

变量:状态变量1;操作:写入;依赖于:msg.value,参数2;

变量:状态变量2;操作:发送;依赖于:msg.value,状态变量3;

合约函数2的id:

变量:状态变量1;操作:条件判断;依赖于:状态变量4,参数1;

其中,合约函数1中的状态变量1、参数2、状态变量2、及状态变量3均为合约函数1的污点数据。合约函数2中的状态变量1、状态变量4、及参数1均为合约函数2的污点数据。

所述污点分析器201基于所述污点数据可得到与所述污点数据相对应的每个合约函数内的变量依赖关系。仍以合约函数2为例,合约函数2内的变量依赖关系为状态变量1依赖于状态变量4和参数1。基于智能合约中每个函数内的变量依赖关系以及合约函数之间的读取关系可得到多个合约函数的变量依赖关系。

在另一实施例中,在例如静态污点分析过程中,可根据智能合约的代码得到相应的控制流图。举例来说,可将智能合约的代码转换为中间语言(intermediatelanguage,ir)以进行控制流图转换获得对应的控制流图。

其中,所述中间语言是介于高级编程语言与二进制字节码中间的汇编语言。所述中间语言与编译器相关,不同的编译器所对应的中间语言是不同的。具体地,将所述智能合约的源代码经编译器编译成汇编语言所表示的汇编执行序列。遍历所述汇编执行序列可得到所述汇编执行序列所表示的第一控制流图。其中,所述第一控制流图中的每个节点对应的是汇编执行序列中的每个指令,所述第一控制流图中的每个边表示的指令执行的先后顺序。得到所述第一控制流图后经控制流图转换后可得到合约函数所对应的第二控制流图。

所述污点分析器201基于转换后得到的第二控制流图,对所述第二控制流图中的环路进行剪切以形成树状路径。例如,请参阅图3a,图3a显示为环路剪切前的第二控制流图在一实施例中的示意图。图3a中存的环路为a依赖于b,b依赖于c,c依赖于d,d依赖于a,将第二控制流图中d依赖于a这一条路径进行剪切形成树状路径。环路剪切后的第二控制流图如图3b所示。其中,图3b所述的第二控制流图中的路径为树状路径。

进而,所述污点分析器201根据得到如图3b所示的树状路径的第二控制流图,遍历其中所有路径以得到污点数据。基于所述污点数据可得到与所述污点数据相对应的一或多个合约函数的变量依赖关系。其中,得到所述智能合约中的污点数据的方式与前文所述的相同或相似,在此不再详述。

所述交易序列生成器202用于生成交易序列;其中,所述交易序列所包含的一或多个交易所使用的合约函数遵循所述变量依赖关系。

其中,所述交易序列由若干个交易组成。每个交易包含一组调用的合约函数、合约函数的函数参数、及交易属性。其中,所述合约函数的函数参数是随机生成的或者选自动态种子集合。所述交易属性包括:交易的发送方、交易附带的额度、区块的时间戳和区块号等中的一或多个。

在一些实施例中,交易序列的生成指导依据包括所述智能合约中的一或多个合约函数的被使用概率。所述交易序列生成器202在生成交易序列的过程中,可以根据每个合约函数的被使用概率来选择要调用的合约函数。所述被使用概率描述的是每个合约函数在生成交易序列过程中被选择的概率。所述交易序列生成器202根据所述被使用概率通过程序二进制接口选择可调用的且存在依赖关系(例如,一个合约函数修改的状态变量会被另一个合约函数读取)的合约函数,并与所述变量依赖关系相关联,即所述交易序列生成器202调用的合约函数遵循所述污点分析器201所得到的变量依赖关系。其中,所述程序二进制接口是编译器编译所述智能合约得到的。

在可能的实施例中,在生成初始交易序列时,每个合约函数被的被使用概率是相等的;当然,此仅为举例,也可以根据例如经验或其它依据等来预设初始的被使用概率。然而,根据反馈生成器生成的反馈信息,可使得所述智能合约中每个函数的被使用概率会发生改变,从而改变未来这些合约函数被使用的优先性。例如,更容易触发转账、合约自毁等操作的合约函数的被使用概率会增加。

之后,所述交易序列生成器202可为选择的合约函数生成函数参数。在一实施例中,所述交易中所使用的合约函数的函数参数是随机生成的。所述函数参数的随机生成方式是根据所述函数参数的类型来确的。具体地,对于静态长度的函数参数,在该静态长度所对应的取值范围内随机选取函数参数。对于动态长度的函数参数,令一数值作为构成该动态长度的函数参数的多个静态长度的静态参数的数量,在该每个静态长度所对应的取值范围内随机选取每个静态参数以满足该数量,根据各所述静态参数构成所述动态长度的函数参数。其中,所述静态长度的函数参数为比特长度为固定的静态长度的函数参数。所述静态长度的函数参数包括但不限于:unit256类型、int类型、address类型、bool型、byte型、bytes型、payment类型等。以uint256类型的函数参数为例,其比特长度为256比特,在随机生成函数参数时,可以在0至2256中随机选取一个数值作为生成的函数参数。其中,所述动态长度的函数参数为比特长度不固定的函数参数。所述动态长度的函数参数包括但不限于:array类型、matrix类型。以array类型的函数参数为例,由于所述array类型的函数参数是由若干个静态长度的函数参数组成的,所以,在随机生成函数参数时,随机选取一个数值作为构成array类型的函数参数的多个静态长度的静态参数的数量,在该每个静态长度所对应的取值范围内随机选取每个静态参数以满足该数量,根据各所述静态参数构成所述array类型的函数参数。在另一实施例中,交易序列的生成指导依据包括动态种子集合。所述交易中所使用的合约函数的函数参数选自动态种子集合。其中,所述动态种子集合将会根据反馈生成器205生成的反馈信息进行其中动态种子的更新。

最后,所述交易序列生成器202基于所选择的合约函数和生成的函数参数,生成包括交易的发送方、交易附带的额度、区块的时间戳和区块号的交易属性。其中,所述时间戳和区块号是通过合约执行环境中部署的区块性质的配置接口得到的。

所述交易序列生成器202通过执行选择合约函数、生成函数参数、以及生成对应的交易属性,可生成包含合约函数、函数参数、交易属性的交易序列。其中,根据所述反馈信息执行生成指导依据的更新,在进行迭代检测过程中所述交易序列还会按迭代次数重新生成。具体地,每进行一次迭代检测,所述交易序列生成器202再次生成交易序列,即根据反馈信息重新得到合约函数、生成函数参数、及生成交易属性,进而生成新的交易序列。

所述合约执行环境203用于执行所述交易序列以获得执行路径。所述合约执行环境203是支持智能合约的执行和调用的运行环境。以利用高级语言solidity编写的智能合约为例,所述合约执行环境为evm环境。所述智能合约在以太坊上真正执行时所利用的是以太坊虚拟机(environmentvirtualmachine,evm)。所述evm环境是与所述以太坊虚拟机中的环境相同或相似的运行环境。

在一实施例中,所述合约执行环境的配置的配置相比于现有evm环境来讲是经过修改的。

举例来说,在一实施例中,该合约执行环境配置有包括预设余额的合约账户、以及部署有由待检测的智能合约的代码经合约编译器编译得到的字节码。具体地,为所述交易序列配置以太坊账户作为初始化,并为每个账户的以太币余额设定一个默认值。可选地,可以为每个账户设定一个足够大的默认值。例如100万、1000万以太币等。另外,还需将经编译器编译后得到的待检测的智能合约的字节码部署到合约执行环境中。

在一实施例中,所述合约执行环境的配置中包括区块性质的配置接口,以提供区块性质作为待生成的交易序列中每个交易的交易属性的生成依据。其中,所述区块性质包括:区块的时间戳、区块号等。在生成交易序列的交易属性时,基于所述区块性质配置接口所提供的区块性质生成所述交易属性中的时间戳和区块号。

在一实施例中,所述合约执行环境的配置中包括能对合约的外部调用强制引发异常处理。由于,在以太坊中的外部调用(例如send函数),可能会因为诸多原因而调用失败。这类调用失败会因为其引发的异常处理而进入其他的执行路径。所以,为了提高代码的覆盖率,所述执行环境会对每个外部调用执行两次。第一次正常执行,第二次强制引发异常处理。其中,所述覆盖率用来衡量检测代码的充分性和完整性。

在实际执行过程中,所述合约执行环境的配置包括上述实施例中的任意一种或多种组合。可选地,所述合约执行环境的配置包括上述三种实施例中所述的配置。

需要说明的是,在执行交易序列过程中并不需要将其部署到区块链上,而只需要将生成的所述交易序列放入所述合约执行环境203中执行,就可以获得与所述交易序列相对应的执行路径。

其中,所述执行路径包括交易序列中每个交易执行所涉及的指令执行状态。所述指令执行状态包括:指令状态、堆栈状态、寄存器状态、及内存状态中的一种或多种组合。可选地,所述指令执行状态包括指令状态、堆栈状态、寄存器状态、和内存状态四种。其中,所述指令状态是指操作码和操作数。所述操作码用于表示该指令应进行什么性质的操作。不同的指令可以在操作码这个字段下采取不同的编码来表示,每一种编码代表一种指令,每一条指令都有一个操作码。所述操作数包括执行指令所需要数据的来源。所述堆栈状态是指当前栈中的数据。所述寄存器状态是指寄存器中存储的数据。所述内存状态是指内存中存储的数据。需要说明的是,所述寄存器中存储的就是合约函数的状态变量。

所述利用程序探测器204用于在根据所述执行路径分析获得异常事件时,判别该交易序列相关于利用程序。

具体地,当所述利用程序探测器204根据所述执行路径分析获得异常事件时,则判别该交易序列为利用程序,或者该交易序列包括利用程序。当判别所述交易序列相关于利用程序时,则认为该交易序列执行时触发了安全漏洞,即认定所述智能合约中存在可利用的安全漏洞。

其中,所述异常事件包括:出现异常动作,或者合约账户状态变化异常,或者既出现异常动作又存在合约账户状态变化异常。其中所述异常动作包括但不限于:执行了合约自毁操作、或调用外部合约操作等。所述合约账户状态变化异常包括但不限于:合约的账户余额变化异常,例如违背预定交易结果地减少等。

本申请所述的智能合约的利用程序获取装置是一种对所述智能合约进行迭代检测的装置,所述交易序列生成器202生成的交易序列受反馈生成器205生成的反馈信息影响,在每一次迭代过程中均可以重新生成一交易序列。进而可以在每一次迭代过程中通过合约执行环境203和利用程序探测器204来判断重新生成的交易序列是否相关于利用程序,即所述智能合约中是否存在可利用的安全漏洞。具体地,如果在迭代过程中获取到了利用程序,则认为所述智能合约中存在可利用的安全漏洞。并在每次迭代检测过程中,反馈生成器205均会生成反馈信息。

所述反馈生成器205用于根据执行路径生成反馈信息,以用于对下一次待生成的交易序列的生成指导依据进行更新。所述反馈处理器206用于管理所述生成指导依据,并根据所述反馈信息更新所述生成指导依据。

需说明的是,在一些实施例中,所述反馈处理器206也可以加以省略,而通过例如存储有所述生成指导依据且可供读写的数据存储单元(例如数据库、数据表)等加以替代,所述反馈生成器205或其它处理装置能将经反馈信息更新后的生成指导依据存储至该数据存储单元中即可。

承前所述,所述生成指导依据包括:所述智能合约中的一或多个合约函数的被使用概率、和/或动态种子集合。所述被使用概率用于在生成交易序列的过程中选择合约函数。所述交易序列的每一交易所使用的合约函数的函数参数选自所述动态种子集合。其中,所述动态种子集合初始时为空,会在后续的反馈过程中根据反馈信息向所述动态种子集合中添加动态种子。在生成初始交易序列时,每个合约函数的被使用概率可以是相等的,会在后续的反馈过程更新所述被使用概率;当然,此仅为举例,可以根据实际需求加以变化。需要说明的是,所述动态种子集合初始时也可以包括预设的函数参数。其中,所述预设的函数参数为容易触发安全漏洞的函数参数。在生成初始交易序列时,每个合约函数的被使用概率也可以是不相等的。

能引起所述被使用概率进行更新的反馈信息包括:对应引起覆盖率变化的交易序列中所使用的各合约函数的概率奖励。所述概率奖励供作用至所述被使用概率。其中,在所述执行路径中所对应的操作中,新增的敏感操作对应于覆盖率的变化。所述敏感操作包括但不限于:使用sstore、selfdestruct、call、callcode、delegatecall操作码的操作。

其中,操作码sstore用来存储交易执行的状态变化。操作码selfdestruct用来自毁合约。操作码call、操作码callcode、以及操作码delegatecall均可以用于执行外部合约、合约转账等功能。所述覆盖率是指至少被执行了一次的敏感操作占所述执行路径中总的操作数目的百分比。

具体地,如果所述反馈生成器205在所述执行路径中发现了在之前检测过程中未发现的上述任意一种或多种敏感操作,则认为是覆盖率增加。所述反馈生成器205就会根据覆盖率的增加值生成概率奖励。所述反馈处理器206就会对此次执行路径所对应的交易序列所使用的合约函数的被使用概率增加相应的概率奖励,以更新所述被使用概率。更新后的被使用概率会影响下一次检测过程中合约函数的选择倾向,使更容易触发转账、合约自毁等操作的函数会有更大的概率被选择。其中,所述概率奖励举例为一个正比于覆盖率增加值的归一化的概率值,所述归一化的概率值是经过归一化处理的正比于覆盖率增加值的0至1之间的值。

例如,在第三次检测过程中发现了sstore、selfdestruct这两种敏感操作,并且这两种敏感操作在第一次和第二次检测过程中均未出现,则认为是检测的覆盖率增加。其中,所述执行路径中所对应的总操作数目为5,第二次检测完成后所对应的覆盖率是0.2,在第三次检测完成后的覆盖率为0.6,覆盖率增加了0.4。所述反馈生成器205生成一个正比于0.4的一个归一化的概率值作为所述概率奖励,所述反馈处理器206并将这个概率值加到第三次检测所对应的交易序列所使用的合约函数的被使用概率上,以更新所述被使用概率。

需说明的是,所述之前检测过程中未发现的上述任意一种或多种敏感操作并非限制在必须是不同的操作码,同一种操作码被使用的不同的敏感操作同样会引起覆盖率的变化,例如第一次call相关的敏感操作出现时形成概率奖励,第二次call相关的敏感操作出现时也可能形成概率奖励。

能引起所述动态种子集合进行更新的反馈信息包括:由对应引起覆盖率变化的交易序列所使用的各合约函数对应的函数参数所形成的动态种子。具体地,如果所述反馈生成器205在所述执行路径中发现了在之前检测过程中未发现的上述任意一种或多种敏感操作,则认为是覆盖率增加。所述反馈生成器205就会将此次执行路径所对应的交易序列所使用的合约函数的函数参数作为所述动态种子。所述反馈处理器206将所述动态种子加入至所述动态种子集合中,以更新所述动态种子集合。所述更新后的动态种子集合会在交易序列生成器202下一次生成函数参数的过程中被使用。其中,下一次检测时,交易中所使用的合约函数的函数参数选自所述更新后的动态种子集合。所以,生成的函数参数更有机会选取这些曾经提升过覆盖率的参数值。

在一些施例中,合约函数中的每个函数参数可以对应于一子动态种子集合,并与其所对应的子动态种子集合中的各动态种子的参数类型相同。例如,一合约函数中包括的-start参数是unit256类型的,该-start参数对应一子动态种子集合,所述子动态种子集合中各动态种子的参数类型均是unit256类型的。以此类推,该合约函数中的每个函数参数可均有一个与其参数类型相同的子动态种子集合。

在一些实施例中,可以设置智能合约的迭代检测次数上限,在该次数上限内重复执行交易序列生成器202、合约执行环境203、利用程序探测器204、反馈生成器205、反馈处理器206所对应的操作,如果到达迭代测试次数的上限,仍未得到任何相关于利用程序的交易序列,则认为所述智能合约的代码是安全的,如果在测试过程中发现相关于利用程序的交易序列则认为所述智能合约中存在可利用的安全漏洞,并提供所述触发安全漏洞的交易序列。例如,所述利用程序的检测装置将触发安全漏洞的交易序列发送给用户。其中,所述迭代检测次数上限的取值范围可以为:1至250、250至500、500至750、750至1000、或1000至1250等。例如根据运行方法的计算机装置的性能设置迭代检测次数上限为1000等。

请参阅图5,图5显示为本申请的智能合约的利用程序获取装置在另一实施例中的示意图,如图所示,所述利用程序获取装置300包括:合约编译器307、污点分析器301、交易序列生成器302、合约执行环境303、利用程序探测器304、反馈生成器305、反馈处理器306。

所述合约编译器307用于编译待检测的智能合约得到智能合约的字节码和程序二进制接口(applicationbinaryinterface,abi)。所述智能合约的字节码用于部署在所述合约执行环境303中。所述程序二进制接口包括但不限于:调用约定、指定的文件格式、指定的数据类型等。所述交易序列生成器302可通过所述程序二进制接口与所述变量依赖关系相关联,即所述交易序列生成器302调用的合约函数遵循所述污点分析器301所得到的变量依赖关系。

所述污点分析器301、交易序列生成器302、合约执行环境303、利用程序探测器304、反馈生成器305、反馈处理器306与图4中所述的相同或相似,在此不再详述。

需说明的是,在一些实施例中,所述反馈处理器306也可以加以省略,而通过例如存储有所述生成指导依据且可供读写的数据存储单元(例如数据库、数据表)等加以替代,所述反馈生成器305或其它处理装置能将经反馈信息更新后的生成指导依据存储至该数据存储单元中即可。

请参阅图6,图6显示为本申请的智能合约的利用程序获取装置与客户端通信的网络架构示意图。利用图6所提供的网络架构,所述利用程序检测的执行过程举例如下:所述利用程序获取装置获取所述客户端所提交的智能合约的源代码。例如,所述利用程序获取装置获取用户通过web浏览器上传的智能合约的源代码。所述利用程序获取装置的污点分析器用于通过污点分析得到智能合约的污点数据所对应的一或多个合约函数的变量依赖关系。所述交易序列生成器用于生成交易序列;其中,所述交易序列所包含的一或多个交易所使用的合约函数遵循所述变量依赖关系。所述合约执行环境,用于执行所述交易序列以获得执行路径。利用程序探测器用于在根据所述执行路径分析获得异常事件时,判别该交易序列相关于利用程序。反馈生成器用于根据执行路径生成反馈信息,以用于对交易序列生成器下一次待生成的交易序列的生成指导依据进行更新。所述反馈处理器用于管理所述生成指导依据,并根据所述反馈信息更新所述生成指导依据。所述利用程序获取装置在达到检测次数上限后,将智能合约的检测结果发送至所述客户端。所述检测结果包括但不限于:智能合约存在可利用的安全漏洞的结果、智能合约不存在可利用的安全漏洞的结果、与利用程序相对应的交易序列、包含利用程序的交易序列、及可利用的安全漏洞的具体形式等中的一种或多种组合。

在一实施例中,所述客户端和利用程序获取装置均可以通过计算机软件的形式运行在图1所示的计算机装置中。其中,所述计算机装置所在的电子设备包括但不限于:智能手机、平板电脑、台式机、服务器/服务器组、分布式网络中互相协作的一或多个网络设备等。

在另一实施例中,所述利用程序获取装置可以运行在如图1所示的计算机装置中,所述客户端可以运行在与图1所示的计算机装置通信连接的其他可供客户端运行的电子设备中。所述客户端可以通过所述计算机装置的接口单元实现与利用程序获取装置的通信连接。所述接口单元包括但不限于网卡、移动网络接入模块等。所述可供客户端运行的电子设备包括但不限于:智能手机、平板电脑、台式机等。所述计算机装置所在的电子设备包括但不限于:智能手机、平板电脑、台式机、服务器/服务器组、分布式网络中互相协作的一或多个网络设备等。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。

另外,本申请上述的附图中的流程图和系统框图,图示了按照本申请各种实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这根据所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以通过执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以通过专用硬件与计算机指令的组合来实现。

另外,本申请还公开一种计算机可读存储介质,前述实施例中涉及的计算机程序,如实现本申请所述的智能合约的利用程序获取方法的计算机程序,可以存储在计算机可读存储介质。所述计算机可读写存储介质可以包括只读存储器(rom,readonlymemory)、随机存取存储器(ram,randomaccessmemory)、eeprom、cd-rom或其它光盘存储装置、磁盘存储装置或其它磁存储设备、闪存、u盘、移动硬盘、或者能够用于存储具有指令或数据结构形式的期望的程序代码并能够由计算机进行存取的任何其它介质。另外,任何连接都可以适当地称为计算机可读介质。例如,如果指令是使用同轴电缆、光纤光缆、双绞线、数字订户线(dsl)或者诸如红外线、无线电和微波之类的无线技术,从网站、服务器或其它远程源发送的,则所述同轴电缆、光纤光缆、双绞线、dsl或者诸如红外线、无线电和微波之类的无线技术包括在所述介质的定义中。然而,应当理解的是,计算机可读写存储介质和数据存储介质不包括连接、载波、信号或者其它暂时性介质,而是旨在针对于非暂时性、有形的存储介质。如申请中所使用的磁盘和光盘包括压缩光盘(cd)、激光光盘、光盘、数字多功能光盘(dvd)、软盘和蓝光光盘,其中,磁盘通常磁性地复制数据,而光盘则用激光来光学地复制数据。

本申请所述的智能合约的利用程序获取方法可以用硬件、软件、固件或者其任意组合的方式来实现。当用软件实现时,可以将这些功能作为一个或多个指令或代码存储或传送到计算机可读介质上。本申请所公开的方法的步骤可以用处理器可执行软件模块来体现,其中处理器可执行软件模块可以位于有形、非临时性计算机可读写存储介质上。有形、非临时性计算机可读写存储介质可以是计算机能够存取的任何可用介质。

综上所述,本申请的种智能合约的利用程序获取方法、装置及存储介质,实现用于测试智能合约中是否有可利用的安全漏洞。本申请的方案通过污点分析得到智能合约的污点数据所对应的一或多个合约函数的变量依赖关系;生成交易序列;将所述交易序列在合约执行环境中执行以获得执行路径;在根据所述执行路径分析获得异常事件时,判别该交易序列相关于利用程序;根据执行路径生成反馈信息,以用于对下一次待生成的交易序列的生成指导依据进行更新。本申请的方案可以通过检测基于智能合约生成的交易序列是否相关于利用程序,来确定所述智能合约中是否存在可利用的安全漏洞,并且实现了高效率、高覆盖率以及低误报率的检测。

上述实施例仅例示性说明本申请的原理及其功效,而非用于限制本申请。任何熟悉此技术的人士皆可在不违背本申请的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本申请所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本申请的权利要求所涵盖。


技术特征:

1.一种智能合约的利用程序获取方法,其特征在于,包括:

通过污点分析得到智能合约的污点数据所对应的一或多个合约函数的变量依赖关系;

生成交易序列;其中,所述交易序列所包含的一或多个交易所使用的合约函数遵循所述变量依赖关系;

将所述交易序列在合约执行环境中执行以获得执行路径;

在根据所述执行路径分析获得异常事件时,判别该交易序列相关于利用程序;

根据执行路径生成反馈信息,以用于对下一次待生成的交易序列的生成指导依据进行更新。

2.根据权利要求1所述的智能合约的利用程序获取方法,其特征在于,所述异常事件包括:出现异常动作和/或合约账户状态变化异常。

3.根据权利要求1所述的智能合约的利用程序获取方法,其特征在于,新增的敏感操作对应于覆盖率的变化。

4.根据权利要求3所述的智能合约的利用程序获取方法,其特征在于,所述生成指导依据包括:所述智能合约中的一或多个合约函数的被使用概率;所述反馈信息包括:对应引起覆盖率变化的交易序列所使用的各合约函数的概率奖励;所述概率奖励供作用至所述被使用概率。

5.根据权利要求1所述的智能合约的利用程序获取方法,其特征在于,所述交易所使用的合约函数的函数参数是随机生成的。

6.根据权利要求5所述的智能合约的利用程序获取方法,其特征在于,所述随机生成的方式包括:

对于静态长度的函数参数:在该静态长度所对应的取值范围内随机选取函数参数;或者,

对于动态长度的函数参数:令一数值作为构成该动态长度的函数参数的多个静态长度的静态参数的数量;在该每个静态长度所对应的取值范围内随机选取每个静态参数以满足该数量;根据各所述静态参数构成所述动态长度的函数参数。

7.根据权利要求1所述的智能合约的利用程序获取方法,其特征在于,所述生成指导依据包括动态种子集合,所述交易所使用的合约函数的函数参数选自动态种子集合。

8.根据权利要求7所述的智能合约的利用程序获取方法,其特征在于,所述反馈信息还包括:由对应引起覆盖率变化的交易序列所使用的各合约函数对应的函数参数所形成的动态种子;所述动态种子供加入至所述动态种子集合中。

9.根据权利要求8所述的智能合约的利用程序获取方法,其特征在于,每个函数参数对应于一子动态种子集合,并与其所对应的子动态种子集合中的各动态种子的参数类型相同。

10.根据权利要求1所述的智能合约的利用程序获取方法,其特征在于,所述执行路径包括:每个交易执行所涉及的指令执行状态。

11.根据权利要求10所述的智能合约的利用程序获取方法,其特征在于,所述指令执行状态包括:指令状态、堆栈状态、寄存器状态、及内存状态中的一种或多种组合。

12.根据权利要求1所述的智能合约的利用程序获取方法,其特征在于,所述合约执行环境包括:evm环境。

13.根据权利要求1或12所述的智能合约的利用程序获取方法,其特征在于,所述合约执行环境的配置中包括以下中的任意一种或多种组合:

a)预设余额的合约账户、以及部署有由待检测的智能合约的代码编译得到的字节码;

b)区块性质的配置接口,以提供区块性质作为待生成的交易序列中每个交易的交易属性的生成依据;

c)能对合约的外部调用强制引发异常处理。

14.根据权利要求1所述的智能合约的利用程序获取方法,其特征在于,所述污点分析包括:

将智能合约的代码转换为中间语言以进行控制流图转换获得对应的控制流图;

对所述控制流图中的环路进行剪切以形成树状路径;

遍历所有树状路径以得到污点数据。

15.根据权利要求1或14所述的智能合约的利用程序获取方法,其特征在于,所述污点分析为静态分析。

16.一种智能合约的利用程序获取装置,其特征在于,包括:

污点分析器,用于通过污点分析得到智能合约的污点数据所对应的一或多个合约函数的变量依赖关系;

交易序列生成器,用于生成交易序列;其中,所述交易序列所包含的一或多个交易所使用的合约函数遵循所述变量依赖关系;

合约执行环境,用于执行所述交易序列以获得执行路径;

利用程序探测器,用于在根据所述执行路径分析获得异常事件时,判别该交易序列相关于利用程序;

反馈生成器,用于根据执行路径生成反馈信息,以用于对交易序列生成器下一次待生成的交易序列的生成指导依据进行更新。

17.根据权利要求16所述的智能合约的利用程序获取装置,其特征在于,所述异常事件包括:出现异常动作和/或合约账户状态变化异常。

18.根据权利要求16所述的智能合约的利用程序获取装置,其特征在于,包括:反馈处理器,用于管理所述生成指导依据,并根据所述反馈信息更新所述生成指导依据。

19.根据权利要求16所述的智能合约的利用程序获取装置,其特征在于,新增的敏感操作对应于覆盖率的变化。

20.根据权利要求19所述的智能合约的利用程序获取装置,其特征在于,所述生成指导依据包括:所述智能合约中的一或多个合约函数的被使用概率;所述反馈信息包括:对应引起覆盖率变化的交易序列所使用的各合约函数的概率奖励;所述概率奖励供作用至所述被使用概率。

21.根据权利要求16所述的智能合约的利用程序获取装置,其特征在于,所述交易所使用的合约函数的函数参数是随机生成的。

22.根据权利要求21所述的智能合约的利用程序获取装置,其特征在于,所述随机生成的方式包括:

对于静态长度的函数参数:在该静态长度所对应的取值范围内随机选取函数参数;或者,

对于动态长度的函数参数:令一数值作为构成该动态长度的函数参数的多个静态长度的静态参数的数量;在该每个静态长度所对应的取值范围内随机选取每个静态参数以满足该数量;根据各所述静态参数构成所述动态长度的函数参数。

23.根据权利要求16所述的智能合约的利用程序获取装置,其特征在于,所述生成指导依据包括动态种子集合,所述交易所使用的合约函数的函数参数选自动态种子集合。

24.根据权利要求23所述的智能合约的利用程序获取装置,其特征在于,所述反馈信息还包括:由对应引起覆盖率变化的交易序列所使用的各合约函数对应的函数参数所形成的动态种子;所述动态种子供加入至所述动态种子集合中。

25.根据权利要求24所述的智能合约的利用程序获取装置,其特征在于,每个函数参数对应于一子动态种子集合,并与其所对应的子动态种子集合中的各动态种子的参数类型相同。

26.根据权利要求16所述的智能合约的利用程序获取装置,其特征在于,所述执行路径包括:每个交易执行所涉及的指令执行状态。

27.根据权利要求26所述的智能合约的利用程序获取装置,其特征在于,所述指令执行状态包括:指令状态、堆栈状态、寄存器状态、及内存状态中的一种或多种组合。

28.根据权利要求16所述的智能合约的利用程序获取装置,其特征在于,所述合约执行环境包括:evm环境。

29.根据权利要求16或28所述的智能合约的利用程序获取装置,其特征在于,所述合约执行环境的配置中包括以下中的任意一种或多种组合:

a)预设余额的合约账户、以及部署有由待检测的智能合约的代码编译得到的字节码;

b)区块性质的配置接口,以提供区块性质作为待生成的交易序列中每个交易的交易属性的生成依据;

c)能对合约的外部调用强制引发异常处理。

30.根据权利要求16所述的智能合约的利用程序获取装置,其特征在于,所述污点分析器,用于执行污点分析,包括:将智能合约的代码转换为中间语言以进行控制流图转换获得对应的控制流图;对所述控制流图中的环路进行剪切以形成树状路径;遍历所有树状路径以得到污点数据。

31.根据权利要求16或30所述的智能合约的利用程序获取装置,其特征在于,所述污点分析为静态分析。

32.一种计算机装置,其特征在于,包括:

一或多个存储器,用于存储至少一程序;

一或多个处理器,用于调用所述至少一程序,以执行如权利要求1至15中任一项所述的智能合约的利用程序获取方法。

33.一种计算机可读存储介质,其特征在于,存储有至少一程序,所述至少一程序在被调用时执行并实现如权利要求1至15中任一项所述的智能合约的利用程序获取方法。

技术总结
本申请公开一种智能合约的利用程序获取方法、装置及存储介质,所述利用程序获取方法包括:通过污点分析得到智能合约的污点数据所对应的一或多个合约函数的变量依赖关系;生成交易序列;其中,所述交易序列所包含的一或多个交易所使用的合约函数遵循所述变量依赖关系;将所述交易序列在合约执行环境中执行以获得执行路径;在根据所述执行路径分析获得异常事件时,判别该交易序列相关于利用程序;根据执行路径生成反馈信息,以用于对下一次待生成的交易序列的生成指导依据进行更新。本申请通过检测基于智能合约生成的交易序列是否相关于利用程序,进而检测出智能合约中是否存在可利用的安全漏洞,同时保证了检测方法的高覆盖率、高效率及低误报率。

技术研发人员:王艺卓;郁昱
受保护的技术使用者:图灵人工智能研究院(南京)有限公司
技术研发日:2020.01.16
技术公布日:2020.06.09

转载请注明原文地址: https://bbs.8miu.com/read-22080.html

最新回复(0)