首页> 中国专利> 一种针对智能合约跨合约漏洞的模糊测试方法

一种针对智能合约跨合约漏洞的模糊测试方法

摘要

本发明公开了一种针对智能合约跨合约漏洞的模糊测试方法,使用导向型模糊测试的方法完成智能合约跨合约安全漏洞的检测,在更大程度上保证智能合约的安全。在具体实现上,生成包含函数选择器,函数参数,合约成员变量,合约余额等数据的测试用例;选择测试用例的距离度量值作为反馈指标,用以挑选优异的测试用例;结合CG(Call Graph,调用图)和CFG(Control Flow Graph,控制流程图)引导模糊测试的演进方向,对合约间的调用行为进行了重点测试。采用本发明的技术方法,在对7838个智能合约进行检测中,发现了27个跨合约重入漏洞,证明了本发明在检测跨合约漏洞方面的有效性和实用性,该方法保证了智能合约相互调用期间的安全性,并提升了测试效率。

著录项

  • 公开/公告号CN112860588A

    专利类型发明专利

  • 公开/公告日2021-05-28

    原文格式PDF

  • 申请/专利权人 中国科学技术大学;

    申请/专利号CN202110370702.9

  • 发明设计人 薛吟兴;叶家鸣;张威;

    申请日2021-04-07

  • 分类号G06F11/36(20060101);G06F21/57(20130101);

  • 代理机构11260 北京凯特来知识产权代理有限公司;

  • 代理人郑立明;韩珂

  • 地址 230026 安徽省合肥市包河区金寨路96号

  • 入库时间 2023-06-19 11:08:20

说明书

技术领域

本发明涉及区块链技术领域,尤其涉及一种针对智能合约跨合约漏洞的模糊测试方法。

背景技术

智能合约是一种特殊协议,运行在区块链上。智能合约部署到区块链上后便无法更改,这意味着合约中的安全漏洞也无法修复。因此在智能合约部署前得到充分的测试是十分必要的。

目前,一些测试工具被开发出来用于智能合约的检测。但这些工具大都关注于单个合约的安全漏洞,忽视了跨合约安全漏洞。跨合约安全漏洞是指智能合约调用其他合约存在的漏洞,这种漏洞涉及至少二个智能合约。实际应用中,智能合约之间的调用是普遍存在的。比如一个DApp(Decentralized Application,去中心化应用)往往包含了多个合约。相比于单个智能合约的安全漏洞,跨合约安全漏洞更为隐蔽,蕴藏着更大的安全风险。

目前,主要存在如下两种方案:

方案一、专利“一种智能合约模糊测试的方法、装置及存储介质”,这项专利中提出了将模糊测试技术用于检测智能合约漏洞。

该方案可归纳为图1所示流程,主要包括:1)生成初始的测试用例。根据合约函数名和函数参数,生成测试用例。2)测试用例的变异。它提出对测试用例进行字节替换,字节翻转等方法。这些变异方法在以前的模糊测试技术中已被广泛使用。3)测试用例的执行。它提出二种执行方式,一种是先对智能合约插桩再执行,另一种是在虚拟机沙箱运行。针对这两种执行方式,分别提出了如何收集智能合约执行的结果。4)反馈指标。根据程序执行的反馈指标,确定是否继续对测试用例变异以生成更多的测试用例。反馈指标包括,测试用例的执行路径和异常测试结果。

方案一的缺陷在于:1)关注于对单个智能合约测试。多个合约的调用需要突破很多程序分支,简单的进行模糊测试,很难发生合约调用行为。2)测试用例的组成有待改进。测试用例选取了函数名和函数参数,这是不够的。因为一个合约函数的执行结果,不仅取决于函数中的参数,也可能与合约状态(合约中的成员变量,账户余额)有关;比如,一个合约函数存在向其他账户转账指令,如果此合约账户余额为0,那么就无法发生转账。3)结果中选取的反馈指标有待改进。选取执行路径作为反馈指标,是在检测其他程序语言时的常用做法,但在智能合约模糊测试中,这样做的效果不好。因为智能合约的代码短,执行路径简单,有大量重复的执行路径。4)对智能合约中的所有部分都检测,没有测试重点。智能合约的安全漏洞只存在少量的函数中,对没有安全漏洞的函数进行检测,浪费了许多不必要时间。

方案二、文献(sFuzz:An Efficient Adaptive Fuzzer for Solidity SmartContracts)。

该方案可归纳为图2所示流程,主要包括:1)生成初始的测试用例。测试用例的组成上包括了函数名,函数的参数,和合约账户余额。但是没有包括合约成员变量。2)测试用例的变异。与方案一的方法相同。3)测试用例的执行。与方案一的第2种执行方法相同,是在虚拟机沙箱运行。4)结果反馈。选取了分支距离作为反馈指标,分支距离在模糊测试其他程序语言时也被用到。

方案二的缺陷在于:1)工具只支持对单个智能合约测试。2)与方案一类似的,测试用例的组成有待改进。3)结果中选取的反馈指标有待改进,只选取了分支距离,没有包含执行路径。4)对智能合约中的所有部分都检测,没有测试重点。

发明内容

本发明的目的是提供一种针对智能合约跨合约漏洞的模糊测试方法,用以保证智能合约相互调用期间的安全性,并提升了测试效率。

本发明的目的是通过以下技术方案实现的:

一种针对智能合约跨合约漏洞的模糊测试方法,包括:

步骤S1、对一组待测智能合约进行调用图和控制流程图扫描分析,根据调用图找到待测智能合约之间的调用链;

步骤S2、对于任一条调用链,根据调用链头部函数选择器和调用参数生成测试用例;

步骤S3、执行所有测试用例,记录每一测试用例的执行情况和执行路径;

步骤S4、根据执行路径,结合控制流程图计算距离度量值,并根据距离度量值,对测试用例进行排序与变异,生成新的测试用例后转入步骤S3;

步骤S5、对测试用例的执行情况进行分析,判断待测智能合约之间是否存在安全漏洞。

由上述本发明提供的技术方案可以看出,使用导向型模糊测试的方法完成智能合约跨合约安全漏洞的检测,弥补了现有检测工具的不足,在更大程度上保证智能合约的安全。在具体实现上,生成包含函数选择器,函数参数,合约成员变量,合约余额等数据的测试用例;选择测试用例的距离度量值作为反馈指标,用以挑选优异的测试用例;结合CG(CallGraph,调用图)和CFG(Control Flow Graph,控制流程图)引导模糊测试的演进方向,对合约间的调用行为进行了重点测试。采用本发明的技术方法,在对7838个智能合约进行检测中,发现了27个跨合约重入漏洞,证明了本发明在检测跨合约漏洞方面的有效性和实用性。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他附图。

图1为本发明背景技术提供方案一的流程图;

图2为本发明背景技术提供方案二的流程图;

图3为本发明实施例提供的一种针对智能合约跨合约漏洞的模糊测试方法的流程图;

图4为本发明实施例提供的一个跨合约重入漏洞示意图

图5为本发明实施例提供的智能合约Manager与Wallet漏洞检测的流程图。

具体实施方式

下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明的保护范围。

由于模糊测试技术需要在有限的时间预算内覆盖尽可能多的程序路径,这是因为代码覆盖率与漏洞是紧密相关的,具有更高代码覆盖率可以发现更多的漏洞,但是对所有代码片段都进行覆盖的做法效率很低。为了对重点代码段进行测试,本发明实施例中采用导向型模糊测试技术,导向型模糊测试会将大部分时间花在特定目标位置,从而对存在调用关系的智能合约进行检测。如图3所示,为本发明实施例提供一种针对智能合约跨合约漏洞的模糊测试方法,其主要包括:

步骤S1、对一组待测智能合约进行调用图和控制流程图扫描分析,根据调用图找到待测智能合约之间的调用链。

本发明实施例中,可以通过分析获得一组智能合约的调用图和控制流程图;然后,通过深度优先搜索算法,从调用图中获取待测智能合约之间的调用链;之后,可依据调用链和控制流程图引导模糊测试,使测试执行路径覆盖调用链。

步骤S2、对于任一条调用链,根据调用链头部函数选择器和调用参数生成测试用例。

本发明实施例中,模糊测试的起点在调用链的头部,终点在调用链的尾部。与其他模糊测试技术不同的是,在发明实施例中,在测试用例的组成上,不仅有函数选择器(Function Selector)和调用参数,还有调用链上合约的成员变量值和合约余额。这些变量都会影响合约的执行情况,因为一个函数调用的执行情况不仅与函数的参数有关,也与合约状态有关,比如:1)一个智能合约没有存款,那么就无法执行对外转账的指令,2)智能合约的成员变量也可能参与条件判断,影响程序执行路径。在生成初始测试用例时,可以选取给定的数值,如int类型数据选取{0,1,2,4}或随机生成。本发明实施例通过对测试用例的组成进行改进,使得测试用例组覆盖的范围广泛,可以对合约进行更充分的测试。

步骤S3、执行所有测试用例,记录每一测试用例的执行情况和执行路径。

本发明实施例中,测试用例从调用链头部函数开始执行,执行时:首先,根据测试用例更新合约成员变量值和合约余额。合约变量存储在运行合约代码的虚拟机中,可以在对应的虚拟机存储区域中更新数值。合约余额是一个区块链记录,也可在测试环境中更新数值。然后,执行函数调用运行合约;运行过程中记录执行路径和指令的执行情况,指令的执行情况包括指令的操作数和执行是否出现异常。

步骤S4、根据执行路径,结合控制流程图计算距离度量值,并根据距离度量值,对测试用例进行排序与变异,生成新的测试用例后转入步骤S3。

本发明实施例中,所述计算距离度量值是指计算测试用例到终点的距离度量值,终点为调用链的尾部,尾部函数执行结束处对应着控制流程图一个或多个结点,记为终止结点。

一个测试用例覆盖了一个控制流程图结点集合,记为S,测试用例到终点的距离度量值的计算公式为:

min(w*df

其中,w与v均为设定的系数(示例性的,可设置w=10,v=0.1);df

对于条件语句:If(c)then br,分支距离计算方法为:

上述分支距离计算方法中,c作为判断条件,a与b是组成判断条件的数字。在控制流程图中,一个结点跳转至下一个结点,是因为满足了判断条件;如果当前结点已经覆盖,当下一个结点还未覆盖时,分支距离越小,则当前结点与下一个结点越接近;当下一节点覆盖时,分支距离为0;按照这样的逻辑,每个节点i都可以计算出自身的分支距离。

所有测试用例执行后,都可以利用上述方式计算出距离度量值。根据距离度量值,依递增顺序,对测试用例进行排序,距离度量值越小,测试用例优先级越高,优先级越高的测试用例会被优先变异,并通过变异产生更多的测试用例;

当前测试用例变异次数的计算公式为:

其中,n为设定的系数(示例性的,可设置n=50),k为设定的门限值(示例性的,可设置k=0.8);d

当变异次数为负数时,相关的测试用例将被舍弃,根据上述公式,具有更小距离值d的测试用例将会被变异更多次数,产生更多的测试用例,当前阶段变异产生的测试用例,在转入步骤S3执行后,还可以继续变异。变异时,测试用例中的所有数据参与变异,变异算子包括bit翻转,字节加减,字节替换,测试用例间交叉互换等操作。

步骤S5、对测试用例的执行情况进行分析,判断待测智能合约之间是否存在安全漏洞。

本发明实施例中,可结合分析结果与漏洞的定义和表现形式,来判断待测智能合约之间是否存在安全漏洞。

此外,本发明实施例中,还预先设置模糊测试的测试时间,对于当前调用链执行步骤S2至步骤S5的操作,直至达到测试时间后,对另一调用链进行测试,即执行步骤S2至步骤S5的操作,不断重复,直至完成所有调用链的测试;通过以上过程查找出待测智能合约之间的所有漏洞。

为了便于理解,下面结合具体示例进行介绍。

智能合约重入漏洞是指攻击者在受攻击合约上“重新进入”(简称“重入”)代码执行。因为原合约的程序员没有预料到合约代码可以被“重入”,因此智能合约会违背原有的执行逻辑以致遭受重大的财产损失。著名的重入漏洞造成重大损失的例子是DAO攻击,在此次攻击中黑客盗取了350万以太坊,并导致了以太坊的硬分叉。

目前,人们对单个合约中的重入漏洞有了较好的预防和检测策略。但对跨合约间的重入漏洞却没有得到足够的关注与解决。一种简化的跨合约间重入漏洞如图2所示。在这个漏洞中,攻击者自己所在合约是Attacker,它首先调用Manager合约中的withdraw函数,即图中步骤①;之后执行到Wallet合约中的withdraw函数,即图中步骤②;在Wallet合约中,首先会向_exec地址转账,若此时成员变量Other被设置为Attacker合约的地址,将会执行到步骤③,从而执行到Attacker的fallback函数。到此将会发现整个调用形成环状,转账也便可以多次发生,也就是发现了跨合约重入漏洞。

如图3所示,模糊测试时,首先,对智能合约Manager与Wallet进行CG与CFG分析,根据CG图,生成测试用例,调用Manager合约的withdraw函数,之后,将从Attacker地址调用Manager合约的withdraw函数开始执行,测试期间当发现测试用例最长路径到达了Wallet合约时,将对此测试用例变异最多次数为10,以生成更多的测试用例。当发现执行到了Attacker合约时,将以原先的函数参数,重新从Manager合约执行。若二次执行结果相同,即记录的指令序列和转账数目相同,那么将终止合约的运行,并判断存在跨合约漏洞。此时在测试用例中的变量满足以下关系:Wallet.balance(Wallet合约余额)>=2*_value>0;Other=Attacker。

本发明实施例中,测试用例中的变量是指组成测试用例的所有参数。其中,合约的账户余额,体现在Wallet.balance中;成员变量值体现在Other=Attacker上,Other是Wallet合约内部成员。_value是一个函数参数,如图4所示,从Wallet合约withdraw开始执行,其中涉及参数_value,示例性的,当取值为1时,执行期间,每次转1单位钱。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例可以通过软件实现,也可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,上述实施例的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明披露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书的保护范围为准。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号