CN115562987A - 针对智能合约调用序列优化与资源分配导向的模糊测试方法 - Google Patents

针对智能合约调用序列优化与资源分配导向的模糊测试方法 Download PDF

Info

Publication number
CN115562987A
CN115562987A CN202211210769.7A CN202211210769A CN115562987A CN 115562987 A CN115562987 A CN 115562987A CN 202211210769 A CN202211210769 A CN 202211210769A CN 115562987 A CN115562987 A CN 115562987A
Authority
CN
China
Prior art keywords
branch
function
branches
contract
test
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.)
Withdrawn
Application number
CN202211210769.7A
Other languages
English (en)
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.)
Zhejiang Gongshang University
Original Assignee
Zhejiang Gongshang University
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 Zhejiang Gongshang University filed Critical Zhejiang Gongshang University
Priority to CN202211210769.7A priority Critical patent/CN115562987A/zh
Publication of CN115562987A publication Critical patent/CN115562987A/zh
Withdrawn legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3676Test management for coverage analysis

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种针对智能合约调用序列优化与资源分配导向的模糊测试方法,针对智能合约中的全局状态变量的进行数据流依赖分析,生成合约的函数调用序列,然后在模糊测试执行过程中迭代更新种子,通过分支距离度量,与新分支距离更近的种子将被选择,对测试用例进行优化,驱动模糊测试器更快地覆盖条件严格的分支;进而选择智能合约中需重点分析的稀有分支与易受攻击分支作为目标分支,并为目标分支分配更多的模糊测试资源;最后对函数调用序列进行优化变异,从而让模糊检测器能够挖掘更深层的分支。本发明结合了序列生成与优化策略、种子迭代优化策略、资源调度策略,提高了模糊检测的效率和准确率,具有良好的实用价值以及很好的借鉴意义。

Description

针对智能合约调用序列优化与资源分配导向的模糊测试方法
技术领域
本发明属于区块链智能合约安全技术领域,具体涉及一种针对智能合约调用序列优化与资源分配导向的模糊测试方法。
背景技术
智能合约与区块链的天然结合性改变了传统的中心化应用模式,掀起了去中心化应用的浪潮。智能合约实际上是一段程序代码,它实现了用户定义的规则或协议条款,能够在区块链上自动执行,且该执行是不可篡改的、不可逆的。然而,由于区块链的不可篡改性,智能合约一旦部署到区块链上后就无法被更改,因此当恶意攻击者利用智能合约的漏洞进行攻击时,开发者将无法通过修补合约漏洞做出补救,并且由于智能合约的执行是不可逆的,漏洞造成的损失将无法挽回。近年来,各式各样的智能合约安全漏洞事件频发,每次对合约的攻击都造成了严重的经济损失。
模糊测试法已经被证明是用于检测各类软件漏洞最有效的方法之一,例如 AFL(American Fuzzy Lop)是模糊测试技术中应用最为广泛的工具之一,它采用新型的插桩方法和遗传算法,能够自动生成新的测试用例。启发于模糊测试技术在传统程序漏洞检测中的良好应用,研究人员开始探索面向智能合约代码的模糊测试方法;一般来说,基于模糊测试技术的智能合约漏洞检测方法大致包括三个步骤:(1)将智能合约部署到私有链上;(2)通过生成大量的测试输入模拟真实合约中的函数调用情况,记录模糊测试过程中合约的执行日志;(3)结合相应漏洞的具体特征来分析日志信息,进一步判断合约中是否存在漏洞。
当前,智能合约的模糊测试方法与传统程序的模糊测试方法一样,依赖于初始的测试用例及其变异策略,它们仍然存在函数调用序列混乱,测试用例随机性强、测试资源随机分配等痛点问题,严重影响了模糊测试的执行效率以及漏洞检测的准确率。
ContractFuzzer[Bo J,Ye L,Chan W K.ContractFuzzer:fuzzing smartcontracts for vulnerability detection[C]//the 33rd ACM/IEEE InternationalConference.ACM,2018]是最早用于智能合约漏洞检测的模糊测试工具,该方法提出了针对以太坊虚拟机的插桩思想,通过基于智能合约的抽象语义接口(ABI) 规范生成测试输入,并分别定义了不同漏洞的检测规则。然而,ContractFuzze 的测试输入生成机制简易且随机化,容易产生大量重复的测试输入,无法到达更多的分支,导致模糊检测效率低下。sFuzz[Nguyen T D,Pham L H,Sun J,et al.sFuzz:An Efficient Adaptive Fuzzer forSolidity Smart Contracts[J].2020]是一种基于AFL的动态智能合约漏洞检测工具,它结合AFL的路径覆盖策略并提出了高效且轻量的多目标自适应策略。然而,智能合约在它的生命周期内会有许多状态,有一些漏洞只有在特殊的合约状态下才可以被触发,sFuzz从合同的初始状态开始进行模糊,这使得它围绕合同的初始状态花费太多的能量,因此通常无法发现由其他状态触发的漏洞。此外,sFuzz平等地对待每个分支,而没有照顾到那些罕见或更有可能拥有错误的分支,这导致将模糊测试的资源浪费在正常程序分支,而忽略了真正需要检测的潜在漏洞分支,从而极大降低了模糊测试效率。
发明内容
鉴于上述,本发明提供了一种针对智能合约调用序列优化与资源分配导向的模糊测试方法,驱动模糊测试器更快地到达条件严格且深层的分支,有效地提高了模糊测试的分支覆盖率以及智能合约漏洞检测的准确率。
一种针对智能合约调用序列优化与资源分配导向的模糊测试方法,包括如下步骤:
(1)分析智能合约中的全局状态变量的数据流依赖关系(即全局状态变量的读写操作),设置相应的序列生成规则,确定每个合约函数的调用优先级,生成合约的函数调用序列;
(2)模糊测试器根据所述函数调用序列进行模糊测试,记录测试过程中的反馈信息,同时在测试过程中迭代更新种子,通过分支距离度量对测试用例进行迭代优化,得到较优的测试用例,以帮助模糊测试器更快地覆盖条件严格的分支;
(3)利用分支搜索算法标记智能合约中需要重点检测的目标分支,包括稀有分支以及易受攻击分支,然后通过资源分配调度机制为这些重点分支分配更多的测试资源;
(4)根据模糊测试执行过程中分支覆盖率的变化情况,利用序列优化策略对函数调用序列进行变异优化,从变异优化后得到的多个序列中选取分支覆盖率最高的函数调用序列,并对其再次进行模糊测试;
(5)当各分支分配的模糊测试资源耗尽后,分析模糊测试执行的日志,与相应的漏洞规则进行匹配,输出对应的漏洞检测报告。
进一步地,所述步骤(1)的具体实现方式为:首先利用模糊测试器将智能合约源码编译成抽象语法树,从中提取包括关于函数调用、修饰器调用和全局变量赋值操作在内的特征;然后利用数据流分析器从这些特征中提取出合约全局状态变量的数据流依赖关系;最后根据这些数据流依赖关系结合以下三条序列生成规则计算出每个合约函数的顺序优先级(OP),并根据优先级确定函数调用序列的排序;
规则1—读写依赖:给定合约函数F1中的全局变量v11以及合约函数F2中的全局变量v21
Figure BDA0003875050750000031
Figure BDA0003875050750000032
(写操作),
Figure BDA0003875050750000033
(读操作)时,则合约函数F1的顺序优先级
Figure BDA0003875050750000034
>合约函数F2的顺序优先级
Figure BDA0003875050750000035
规则2—变量顺序依赖:给定合约函数F1中的全局变量v11、合约函数F2中的全局变量v21以及合约函数F3中的全局变量v31和v32,且
Figure BDA0003875050750000036
Figure BDA0003875050750000037
Figure BDA0003875050750000038
且v31在v32之前出现时,则合约函数F1的顺序优先级>合约函数F2的顺序优先级
Figure BDA0003875050750000039
>合约函数F3的顺序优先级
Figure BDA00038750507500000310
规则3—函数自身依赖:给定合约函数F1中的全局变量v11,当同时存在
Figure BDA00038750507500000311
时,即合约函数F1对于全局变量v11既有读操作也有写操作,说明合约函数F1自身存在依赖关系,需对F1连续调用两次;
其中:全局变量加上标name表示变量名,加上标state表示变量状态系数。
进一步地,综合规则1和规则2通过以下公式计算各合约函数的顺序优先级,确定合约函数的调用顺序,再根据规则3对存在自身依赖关系的函数进行重复调用并生成最终的函数调用序列;
Figure BDA0003875050750000041
Figure BDA0003875050750000042
1≤i,j≤N&&i≠j
其中:
Figure BDA0003875050750000043
表示合约函数Fi的顺序优先级,
Figure BDA0003875050750000044
表示合约函数Fj中第p个全局变量vjp的操作值,
Figure BDA0003875050750000045
表示合约函数Fi中第k个全局变量vik的状态系数,Mi和Mj分别为合约函数Fi和Fj中出现的全局变量个数,N为智能合约中的合约函数个数,Cmp(vik,vjp)表示全局变量vik与vjp的名称一致性函数,
Figure BDA0003875050750000046
Figure BDA0003875050750000047
分别为vik和vjp的变量名。
进一步地,所述步骤(2)中模糊测试器得到函数调用序列后,为每个合约函数生成对应测试输入,然后进行模糊测试,在测试过程中运用了种子迭代优化策略,具体过程如下:
2.1首先将测试用例种子集合S置空,并生成一组初始化测试用例,对测试用例集合C完成初始化;
2.2然后采用种子优化策略,从集合C中选出优质种子,并通过这些种子生成新的测试用例,将那些可以覆盖新分支(过去的测试中未被覆盖的分支)的测试用例加入种子集合S中;
2.3种子迭代更新,即采取分支距离策略作为种子取舍的度量,与新分支距离更近的种子将替换掉集合S中距离更远的种子;
2.4对种子进行变异操作,变异函数可利用所选种子产生的新的测试用例,该变异过程会一直持续到变异资源耗尽,通过不断的迭代,最终模糊测试器得到一批优质的测试用例,这些测试用例可到达几乎全部的合约路径。
进一步地,所述步骤(3)的具体实现方式为:首先利用抽象解释器对模糊测试中所有可到达的分支进行了分析,进而根据分支搜索算法找出所有的目标分支包括稀有分支以及易受攻击分支;之后通过资源分配调度机制为目标分支分配更多测试资源,灵活地控制模糊测试的方向;所述分支搜索算法定义了分支、稀有分支以及易受攻击分支,具体如下:
分支:对于智能合约中任一条可被测试用例到达的路径p,当该路径可以经过分支节点c时,则p在c之前的子路径br被称为路径p上的一条分支,分支节点即表示条件语句以及循环语句中的条件;
稀有分支:对于任一条分支br,若该分支路径上存在至少2层条件语句的嵌套,则该分支被认定为稀有分支;每条稀有分支都会有一个稀有度系数R,用于表示该分支的条件语句嵌套层数;
易受攻击分支:对于任一条分支br,若该分支经过目标位置t∈T时,则该分支被认定为易受攻击分支,T为目标位置集合,该集合包含所有受攻击特征的目标位置,这些位置是通过对智能合约源码进行语义分析找出的。
进一步地,所述资源分配调度机制用以对目标分支进行形式化处理,以引导模糊测试器的种子变异,该机制包含以下两条规则,分别用于为稀有分支和易受攻击分支分配资源;
规则4:为稀有分支分配更多测试资源,即稀有度系数更高的分支会分配到更多的测试资源,以保证同一路径下的所有分支可以获得尽可能相同的测试次数;
规则5:为易受攻击分支分配更多的测试资源,即对于不同路径上的两条分支,若这两条分支的稀有度系数相同,且其中一条为易受攻击分支,则为该易受攻击分支分配更多的测试资源。
进一步地,所述步骤(4)在模糊测试的执行过程中,若在设置的时间阈值内分支的覆盖率没有进一步提高,模糊测试器会根据以下两条策略对函数调用序列进行变异优化;
策略1:对于步骤(1)中计算出每个合约函数的顺序优先级,若存在合约函数F1的顺序优先级
Figure BDA0003875050750000051
等于合约函数F2的顺序优先级
Figure BDA0003875050750000052
则交换F1与F2的顺序;
策略2:若存在合约函数F1对于某一变量既有读操作也有写操作即函数自身存在依赖关系,且该合约函数的连续调用次数小于等于7,则对F1再增加一次调用。
本发明模糊测试方法对合约中全局变量的数据流依赖关系进行了分析,通过两条形式化规则将分析结果转换为每个函数的顺序优先级指标,函数调用的先后关系可由该指标确定;在模糊测试的过程中本发明结合了分支距离的度量,对测试用例进行迭代优化,选择最优质的测试用例帮助模糊测试能更快地到达那些条件严格的分支;此外本发明结合了分支搜索算法和分支资源的调度为稀有分支和易受攻击分支等目标分支分配更多的测试资源,根据序列优化策略指导函数调用序列的变异与优化。相较于传统模糊检测方法,本发明方法指导模糊检测器实现效率更快、覆盖率更广、准确率更高的智能合约漏洞检测,不仅具有良好的实用价值,而且有很好的借鉴意义,具体的创新和有益效果主要体现在以下四个方面:
1.本发明构建了一个数据流分析器来捕获全局变量的数据流依赖关系,然后定义一个规则来计算每个函数调用的顺序优先级,从而推断出有序的函数调用序列,提高模糊测试效率。
2.本发明结合了基于分支距离的度量,以迭代方式向目标分支演化测试用例,使模糊检测器以更快的速度到达新的分支。
3.本发明采用分支搜索算法来发现稀有和脆弱的分支,并设计一种能量分配机制来处理这些关键分支的运行,解决了传统的模糊工具在不同程序分支上资源分配的不合理,浪费大量的资源在普通分支上而错过存在漏洞的分支的问题。
4.本发明提出了对初始生成的序列进行优化的策略,弥补初始序列可能存在的问题,提高了模糊测试的检测范围,提高了代码覆盖率。
附图说明
图1为本发明模糊测试方法中各策略间的流程示意图。
图2为以猜数字游戏为例的数字智能合约代码示意图。
图3为本发明模糊测试方法的实施流程示意图。
具体实施方式
为了更为具体地描述本发明,下面结合附图及具体实施方式对本发明的技术方案进行详细说明。
本发明针对智能合约调用序列优化与资源分配导向的模糊测试方法,包括如下步骤:
(1)分析数据依赖,生成调用序列。分析智能合约中的全局状态变量的数据流依赖关系(即全局状态变量的读写操作),设置相应的序列生成规则,确定每个函数的调用优先级,生成合约的函数调用序列。
模糊测试器将合约源码编译成抽象语法树,从中提取诸如函数调用、修饰器调用和全局变量赋值操作的特征;接着,数据流分析器会从这些特征中提取出合约全局变量的数据流依赖关系;最后,从这些数据流依赖关系结合我们提供的三个规则可以计算出每个合约函数的顺序优先级指标(OP),并通过该优先级关系决定函数调用序列的排序。三条规则如下:
规则1:读写依赖。给定函数F1中的全局变量v11和函数F2中的全局变量 v21(其中
Figure BDA0003875050750000071
),当F1中的全局变量
Figure BDA0003875050750000072
(写操作)F2中的全局变量
Figure BDA0003875050750000073
(读操作)时,函数F1会有更高的顺序优先度(即
Figure BDA0003875050750000074
)。
规则2:变量顺序依赖。给定函数F1中的全局变量v11,函数F2中的全局变量v21和函数F3中的全局变量v31、v32,其中
Figure BDA0003875050750000075
当函数F1、函数F2中的全局变量有
Figure BDA0003875050750000076
函数F3中的全局变量有
Figure BDA0003875050750000077
且变量v31在变量v32之前出现时,函数F1会有最高的顺序优先度
Figure BDA0003875050750000078
规则3:函数自身依赖。给定函数F1中的全局变量v11,同时存在
Figure BDA0003875050750000079
Figure BDA00038750507500000710
时,即函数F1对于变量v11既有读操作也有写操作,说明函数自身存在依赖关系,需要对F1连续调用两次。
由此,模糊测试器分析了合约中各函数的数据流依赖关系,利用上述规则可以计算出调用智能合约中各函数的顺序优先度指标OP。综合考虑各函数中的全局变量由读写依赖规则(规则1)和变量顺序依赖规则(规则2)造成的影响,可以得到:
Figure BDA0003875050750000081
其中:N代表智能合约中的函数个数,变量Mi与Mj分别为函数Fi与Fj中出现的全局变量个数,函数Cmp(vik,vjp)用于比较两个全局变量名字是否一致:
Figure BDA0003875050750000082
其中:vik是函数Fi中出现的第k个全局变量,vjp是函数Fj中出现的第p个全局变量。
这里,
Figure BDA0003875050750000083
Figure BDA0003875050750000084
为状态系数,变量vik与vjp的读写依赖关系决定了公式(1)中各项是否能影响到函数Fi的顺序优先度。由规则1可知,只有当vik为写操作且vjp为读操作,这一全局变量才会对Fi顺序优先度造成影响;系数(Mj- p)是函数Fj中全局变量vjp的顺序影响因子,函数Fj中越早出现的全局变量对函数 Fi的顺序优先度影响越大(规则2)。
根据计算出的函数调用优先级指标,确定合约函数的调用顺序,再根据规则3对那些存在自身依赖关系的函数进行重复调用生成最终的函数调用序列。
(2)分支距离度量,种子迭代优化。根据步骤(1)生成的函数调用序列进行模糊测试,记录执行过程中的反馈信息,在模糊测试的执行过程中迭代更新种子,通过分支距离度量对测试用例进行迭代优化,得到更加优质的测试用例,帮助模糊测试器更快地覆盖条件严格的分支。
模糊测试器得到了合适的函数调用序列,为每个函数生成对应测试输入,然后进行测试执行,该过程中运用了种子迭代优化策略,具体过程如下:
2.1首先将测试用例种子集合S置空,并生成一组初始化测试用例,对测试用例集合C完成初始化。
2.2接下来采用种子优化策略,选出优质种子,并通过这些种子生成新的测试用例。那些可以覆盖新分支(过去的测试中未被覆盖的分支)的测试用例将被加入种子集合S。
2.3种子迭代更新,采取分支距离策略作为种子取舍的度量,与新分支距离更近的种子将替换掉S集合中距离更远的种子。
2.4对种子进行变异操作,变异函数可以利用所选的种子产生新的测试用例,该变异过程会一直持续到变异资源耗尽,通过不断的迭代,最终模糊测试器可以得到一批优质的测试用例,这些测试用例可以到达几乎全部合约路径。
(3)目标分支搜索,资源分配调度。根据分支搜索算法,标记智能合约中需要重点检测的目标分支,包括稀有分支与易受攻击分支,然后通过资源分配调度机制为这些重点分支分配更多的模糊测试资源。
资源分配优化策略通过抽象解释器对模糊测试中所有的可到达分支进行了分析,通过设计的规则,该策略可以找出所有的目标分支(如稀有分支、易受攻击分支);之后,资源分配器将依照规则,为目标分支分配更多测试资源,灵活地控制模糊测试的方向。这里,模糊测试器主要关注两类特殊分支:稀有分支和易受攻击分支,以下是与这两类分支相关的定义:
定义1:分支。对于智能合约S里的一条路径p(可被测试用例到达),当该路径可以经过分支节点c(本发明将条件语句以及循环语句中的条件称作分支节点)时,p在c之前的子路径br被称为路径p上的一条分支。这里,当路径p可以通过一系列分支节点C={c1,c2,...,cn}时,该路径上相应的也会存在一系列分支 Br={br1,br2,...,brn}。
定义2:稀有分支。给定分支br,若该分支路径上存在至少2层条件语句的嵌套,该分支会被称为稀有分支;每条稀有分支都会有一个分支稀有度指标R,用于表示该分支的条件语句嵌套层数。研究发现,一些攻击者会对合约的深层路径注入恶意代码,这些路径通常是有着很高稀有度指标的稀有分支。
定义3:易受攻击分支。对于合约分支br和目标位置集合T,当分支br可以经过目标位置t∈T时,该分支为易受攻击的分支。这里,目标位置T是存在易受攻击特征的合约位置,这些位置是通过对智能合约源码进行语义分析找出的。
通过分支分析,就可以找到以上两类目标分支,如何为这些分支分配测试资源,灵活控制模糊测试,本发明设计了一个针对合约分支的资源分配器Ω,并对其进行了形式化处理,以引导模糊测试器的种子变异。具体而言,该策略包含以下两个规则,分别用于为稀有分支和易受攻击分支分配资源。
规则4:为稀有分支分配更多测试资源,资源分配器Ω应当为稀有的分支分配更多的测试资源。实验表明,稀有度系数越高的分支经过的分支节点越多,例如若路径p分支br1的稀有度系数为R1,同一路径上分支br2的稀有度系数为R2且R1<R2,测试用例要想到达分支br2就必须要先经过分支br1,这使得选择变异产生的测试用例在多数情况下难以到达那些更稀有的分支。因此,资源分配器Ω会对稀有度更高的分支分配更多的测试资源,以保证同一路径p下的所有分支可以获得尽可能相同的测试次数,这一规则可以形式化表示为:Ω为分支br1分配资源
Figure BDA0003875050750000101
为分支br2分配
Figure BDA0003875050750000102
其中
Figure BDA0003875050750000103
规则5:为易受攻击的分支分配更多的测试资源,资源分配器Ω应当为易受攻击的分支分配更多的测试资源。对于路径p1上的分支br1和路径p2上的分支 br2,若R1=R2,br1∈Bvulnerable
Figure BDA0003875050750000104
则资源分配器Ω会为分支 br1分配资源α*ε(α>1),为分支br2分配资源ε,其中Bvulnerable表示易受攻击的分支集合,Ω会针对不同漏洞类型的易受攻击分支设置不同的α值。一些漏洞(如整数溢出漏洞)需要特殊的条件才能触发,为了尽可能地触发这些漏洞,模糊测试器提高了可能到达对应分支测试用例的测试资源,使得该测试用例获得更多变异次数,从而产生更多能到达对应分支的输入。
(4)监测覆盖率变化,优化调用序列。根据模糊测试执行过程中分支覆盖率的变化情况,利用序列优化策略对函数的调用序列进行变异优化,并对优化后的序列再次进行模糊测试,选择分支覆盖率最高的调用序列。
在模糊测试的执行过程中,在设置的时间阈值内分支的覆盖率没有进一步提高,模糊器会根据以下策略对函数的调用序列进行优化。
策略1:对于步骤(1)中计算出的函数优先级权重OP,若存在
Figure BDA0003875050750000105
时交换F1和F2顺序。
策略2:存在函数对于某一个变量既有读操作也有写操作,即函数自身存在依赖关系,且对于该函数的连续调用次数小于等于七次,则再增加一次调用。
(5)分析检测日志,输出漏洞检测结果。当各分支分配的模糊测试资源耗尽后,分析模糊测试执行的日志,与相应的漏洞规则进行匹配,输出对应的漏洞检测报告。
如图1所示,本发明模糊测试方法中主要涉及以下5种策略:
序列生成策略:该策略用于生成测试过程中的合约函数调用序列,序列中的每个元素表示一次针对合约函数的调用。为了得到合适的函数调用序列,对合约中全局变量的数据流依赖关系进行了分析,三条形式化规则将分析结果转换为每个函数的顺序优先级指标,函数调用的先后关系可由该指标确定。
种子迭代优化策略:为了提高模糊测试效率,种子迭代优化策略利用条件分支距离度量,重复种子的选择变异迭代过程;另外,还采取了一组变异策略来引导测试用例向高品质优化。
分支搜索策略:该策略发现稀有和脆弱的分支,并设计一种能量分配机制来处理这些关键分支的运行,解决了传统的模糊工具在不同程序分支上资源分配的不合理,浪费大量的资源在普通分支上而错过存在漏洞的分支的问题。
序列优化策略:在当前序列上的探索长时间未取得覆盖率上的提升,则进行对函数调用序列的优化,序列进行优化的策略,弥补初始序列可能存在的问题,提高了模糊测试的检测范围,提高了代码覆盖率。
漏洞分析策略:该策略定义了一系列智能合约漏洞规则,结合执行规则分析模糊测试的日志就可以找到合约中存在的全部漏洞,模糊测试器会将漏洞检测报告返回给用户,以便开发者确认合约中存在的问题。
实施例
本实例以图2中的漏洞为例,针对智能合约调用序列优化与资源分配导向的模糊测试方法运行流程如图3所示,具体的工作流程分为以下6个步骤:
(1)给定一个智能合约源码作为输入,模糊测试器F会先对合约进行编译,生成包含字节码和二进制应用接口(ABI)等信息的JSON文件。
(2)接下来,F会从JSON文件中提取出智能合约的抽语义树(AST),并对合约中的全局变量进行数据流依赖分析,分析全局变量在各函数内的读写以来后,可以计算出函数guess()和函数getReward()的顺序优先度,由此F生成了合适的函数调用序列guess()→getReward()。
(3)根据距离反馈选择变异策略,F将为函数调用序列guess()→getReward() 生成大量不同输入;每轮执行后,比较当前测试用例和种子测试用例的分支距离函数结果,按照距离减小的原则更新种子。随着测试的进行,种子的质量不断提高,模糊测试器生成的测试用例可以探索到程序中大部分分支,例如困难分支(如图2第12行msg.value==50finney)将会被很快满足。
(4)当模糊测试执行到时间上限或找到合约中的全部分支后,F会开始分析已覆盖路径,以找出需要重点测试的目标分支,目标分支包括存在多层嵌套的稀有分支和源码具有漏洞特征的易受攻击分支,其中易受攻击分支由针对智能合约源码的语义分析和抽象解释分析得到。通过对合约源码的分析,F发现图 2第10行的block.number和now分别与区块号依赖漏洞和时间戳依赖漏洞的相关,第17行的call.value关键字与可重入漏洞相关;因此F会在目标分支资源分配时为17行对应分支(第10行与分支语句无关)分配更多的测试资源。
(5)模糊测试器会按照所分配的资源继续进行测试,高资源分支对应的种子会优先被选出来进行变异,这里能同时到达13行与17行对应分支的测试用例会优先被执行。可以看出,当程序执行到图2第10行时,时间戳指令 TIMESTAMP和临近的加密指令SHA3将被记录;当某次测试用例猜中数字,满足了12行条件后,变量userBalance中会被存入奖金,这使得16行条件被满足;执行到图2第17行时,会触发call.value函数进行转账操作,该操作会与F 预先部署的攻击合约发生交互。攻击合约会发起重入攻击,重复调用getReward() 函数,直到合约剩余金额不足一次的奖金,模糊测试器会记下该过程中执行的 CALL指令。
(6)最后,在分析执行日志的时候,模糊测试器会发现时间戳指令与加密指令一同执行,符合时间戳漏依赖洞规则;call.value在一次测试中被调用多次,符合可重入漏洞规则。因此,模糊测试器认为图2合约中存在时间戳依赖漏洞和可重入漏洞,当各分支分配的资源耗尽后,模糊测试结束,输出对应的漏洞检测报告。
上述对实施例的描述是为便于本技术领域的普通技术人员能理解和应用本发明,熟悉本领域技术的人员显然可以容易地对上述实施例做出各种修改,并把在此说明的一般原理应用到其他实施例中而不必经过创造性的劳动。因此,本发明不限于上述实施例,本领域技术人员根据本发明的揭示,对于本发明做出的改进和修改都应该在本发明的保护范围之内。

Claims (8)

1.一种针对智能合约调用序列优化与资源分配导向的模糊测试方法,包括如下步骤:
(1)分析智能合约中的全局状态变量的数据流依赖关系,设置相应的序列生成规则,确定每个合约函数的调用优先级,生成合约的函数调用序列;
(2)模糊测试器根据所述函数调用序列进行模糊测试,记录测试过程中的反馈信息,同时在测试过程中迭代更新种子,通过分支距离度量对测试用例进行迭代优化,得到较优的测试用例,以帮助模糊测试器更快地覆盖条件严格的分支;
(3)利用分支搜索算法标记智能合约中需要重点检测的目标分支,包括稀有分支以及易受攻击分支,然后通过资源分配调度机制为这些重点分支分配更多的测试资源;
(4)根据模糊测试执行过程中分支覆盖率的变化情况,利用序列优化策略对函数调用序列进行变异优化,从变异优化后得到的多个序列中选取分支覆盖率最高的函数调用序列,并对其再次进行模糊测试;
(5)当各分支分配的模糊测试资源耗尽后,分析模糊测试执行的日志,与相应的漏洞规则进行匹配,输出对应的漏洞检测报告。
2.根据权利要求1所述的模糊测试方法,其特征在于:所述步骤(1)的具体实现方式为:首先利用模糊测试器将智能合约源码编译成抽象语法树,从中提取包括关于函数调用、修饰器调用和全局变量赋值操作在内的特征;然后利用数据流分析器从这些特征中提取出合约全局状态变量的数据流依赖关系;最后根据这些数据流依赖关系结合以下三条序列生成规则计算出每个合约函数的顺序优先级,并根据优先级确定函数调用序列的排序;
规则1—读写依赖:给定合约函数F1中的全局变量v11以及合约函数F2中的全局变量v21
Figure FDA0003875050740000011
Figure FDA0003875050740000012
时,则合约函数F1的顺序优先级
Figure FDA0003875050740000013
>合约函数F2的顺序优先级
Figure FDA0003875050740000014
规则2—变量顺序依赖:给定合约函数F1中的全局变量v11、合约函数F2中的全局变量v21以及合约函数F3中的全局变量v31和v32,且
Figure FDA0003875050740000015
Figure FDA0003875050740000021
Figure FDA0003875050740000022
且v31在v32之前出现时,则合约函数F1的顺序优先级>合约函数F2的顺序优先级
Figure FDA0003875050740000023
>合约函数F3的顺序优先级
Figure FDA0003875050740000024
规则3—函数自身依赖:给定合约函数F1中的全局变量v11,当同时存在
Figure FDA0003875050740000025
时,即合约函数F1对于全局变量v11既有读操作也有写操作,说明合约函数F1自身存在依赖关系,需对F1连续调用两次;
其中:全局变量加上标name表示变量名,加上标state表示变量状态系数。
3.根据权利要求2所述的模糊测试方法,其特征在于:综合规则1和规则2通过以下公式计算各合约函数的顺序优先级,确定合约函数的调用顺序,再根据规则3对存在自身依赖关系的函数进行重复调用并生成最终的函数调用序列;
Figure FDA0003875050740000026
Figure FDA0003875050740000027
1≤i,j≤N&&i≠j
其中:
Figure FDA0003875050740000028
表示合约函数Fi的顺序优先级,
Figure FDA0003875050740000029
表示合约函数Fj中第p个全局变量vjp的操作值,
Figure FDA00038750507400000210
表示合约函数Fi中第k个全局变量vik的状态系数,Mi和Mj分别为合约函数Fi和Fj中出现的全局变量个数,N为智能合约中的合约函数个数,Cmp(vik,vjp)表示全局变量vik与vjp的名称一致性函数,
Figure FDA00038750507400000211
Figure FDA00038750507400000212
分别为vik和vjp的变量名。
4.根据权利要求1所述的模糊测试方法,其特征在于:所述步骤(2)中模糊测试器得到函数调用序列后,为每个合约函数生成对应测试输入,然后进行模糊测试,在测试过程中运用了种子迭代优化策略,具体过程如下:
2.1首先将测试用例种子集合S置空,并生成一组初始化测试用例,对测试用例集合C完成初始化;
2.2然后采用种子优化策略,从集合C中选出优质种子,并通过这些种子生成新的测试用例,将那些可以覆盖新分支的测试用例加入种子集合S中;
2.3种子迭代更新,即采取分支距离策略作为种子取舍的度量,与新分支距离更近的种子将替换掉集合S中距离更远的种子;
2.4对种子进行变异操作,变异函数可利用所选种子产生的新的测试用例,该变异过程会一直持续到变异资源耗尽,通过不断的迭代,最终模糊测试器得到一批优质的测试用例,这些测试用例可到达几乎全部的合约路径。
5.根据权利要求1所述的模糊测试方法,其特征在于:所述步骤(3)的具体实现方式为:首先利用抽象解释器对模糊测试中所有可到达的分支进行了分析,进而根据分支搜索算法找出所有的目标分支包括稀有分支以及易受攻击分支;之后通过资源分配调度机制为目标分支分配更多测试资源,灵活地控制模糊测试的方向。
6.根据权利要求5所述的模糊测试方法,其特征在于:所述分支搜索算法定义了分支、稀有分支以及易受攻击分支,具体如下:
分支:对于智能合约中任一条可被测试用例到达的路径p,当该路径可以经过分支节点c时,则p在c之前的子路径br被称为路径p上的一条分支,分支节点即表示条件语句以及循环语句中的条件;
稀有分支:对于任一条分支br,若该分支路径上存在至少2层条件语句的嵌套,则该分支被认定为稀有分支;每条稀有分支都会有一个稀有度系数R,用于表示该分支的条件语句嵌套层数;
易受攻击分支:对于任一条分支br,若该分支经过目标位置t∈T时,则该分支被认定为易受攻击分支,T为目标位置集合,该集合包含所有受攻击特征的目标位置,这些位置是通过对智能合约源码进行语义分析找出的。
7.根据权利要求6所述的模糊测试方法,其特征在于:所述资源分配调度机制用以对目标分支进行形式化处理,以引导模糊测试器的种子变异,该机制包含以下两条规则,分别用于为稀有分支和易受攻击分支分配资源;
规则4:为稀有分支分配更多测试资源,即稀有度系数更高的分支会分配到更多的测试资源,以保证同一路径下的所有分支可以获得尽可能相同的测试次数;
规则5:为易受攻击分支分配更多的测试资源,即对于不同路径上的两条分支,若这两条分支的稀有度系数相同,且其中一条为易受攻击分支,则为该易受攻击分支分配更多的测试资源。
8.根据权利要求1所述的模糊测试方法,其特征在于:所述步骤(4)在模糊测试的执行过程中,若在设置的时间阈值内分支的覆盖率没有进一步提高,模糊测试器会根据以下两条策略对函数调用序列进行变异优化;
策略1:对于步骤(1)中计算出每个合约函数的顺序优先级,若存在合约函数F1的顺序优先级
Figure FDA0003875050740000041
等于合约函数F2的顺序优先级
Figure FDA0003875050740000042
则交换F1与F2的顺序;
策略2:若存在合约函数F1对于某一变量既有读操作也有写操作即函数自身存在依赖关系,且该合约函数的连续调用次数小于等于7,则对F1再增加一次调用。
CN202211210769.7A 2022-09-30 2022-09-30 针对智能合约调用序列优化与资源分配导向的模糊测试方法 Withdrawn CN115562987A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211210769.7A CN115562987A (zh) 2022-09-30 2022-09-30 针对智能合约调用序列优化与资源分配导向的模糊测试方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211210769.7A CN115562987A (zh) 2022-09-30 2022-09-30 针对智能合约调用序列优化与资源分配导向的模糊测试方法

Publications (1)

Publication Number Publication Date
CN115562987A true CN115562987A (zh) 2023-01-03

Family

ID=84743820

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211210769.7A Withdrawn CN115562987A (zh) 2022-09-30 2022-09-30 针对智能合约调用序列优化与资源分配导向的模糊测试方法

Country Status (1)

Country Link
CN (1) CN115562987A (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115794658A (zh) * 2023-01-09 2023-03-14 国网区块链科技(北京)有限公司 一种区块链的模糊测试方法及系统
CN116303097A (zh) * 2023-05-16 2023-06-23 中国工商银行股份有限公司 智能合约的模糊测试方法、装置、设备、介质和程序产品
CN117009980A (zh) * 2023-08-10 2023-11-07 哈尔滨工业大学 一种针对智能合约漏洞检测的有指导的模糊测试方法
CN117992358A (zh) * 2024-04-03 2024-05-07 湖南天河国云科技有限公司 基于区块链的智能合约跨合约测试方法及装置

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115794658A (zh) * 2023-01-09 2023-03-14 国网区块链科技(北京)有限公司 一种区块链的模糊测试方法及系统
CN116303097A (zh) * 2023-05-16 2023-06-23 中国工商银行股份有限公司 智能合约的模糊测试方法、装置、设备、介质和程序产品
CN116303097B (zh) * 2023-05-16 2023-08-22 中国工商银行股份有限公司 智能合约的模糊测试方法、装置、设备、介质和程序产品
CN117009980A (zh) * 2023-08-10 2023-11-07 哈尔滨工业大学 一种针对智能合约漏洞检测的有指导的模糊测试方法
CN117009980B (zh) * 2023-08-10 2024-03-15 哈尔滨工业大学 一种针对智能合约漏洞检测的有指导的模糊测试方法
CN117992358A (zh) * 2024-04-03 2024-05-07 湖南天河国云科技有限公司 基于区块链的智能合约跨合约测试方法及装置

Similar Documents

Publication Publication Date Title
CN115562987A (zh) 针对智能合约调用序列优化与资源分配导向的模糊测试方法
Yamaguchi et al. Automatic inference of search patterns for taint-style vulnerabilities
Phan et al. Synthesis of adaptive side-channel attacks
US8793674B2 (en) Computer-guided holistic optimization of MapReduce applications
Luo et al. ICS protocol fuzzing: Coverage guided packet crack and generation
Gulavani et al. A numerical abstract domain based on expression abstraction and max operator with application in timing analysis
CN113051574B (zh) 一种智能合约二进制代码的漏洞检测方法
Liang et al. Deepfuzzer: Accelerated deep greybox fuzzing
Nguyen et al. Blocking self-avoiding walks stops cyber-epidemics: a scalable gpu-based approach
Rawat et al. An evolutionary computing approach for hunting buffer overflow vulnerabilities: A case of aiming in dim light
WO2021070393A1 (ja) 解析機能付与装置、解析機能付与方法及び解析機能付与プログラム
CN115455435A (zh) 一种智能合约模糊测试方法、装置、存储介质及电子设备
Le Segmented symbolic analysis
Pham et al. Towards systematic and dynamic task allocation for collaborative parallel fuzzing
Salls et al. Exploring abstraction functions in fuzzing
Lin et al. A priority based path searching method for improving hybrid fuzzing
Fang et al. CostCO: An automatic cost modeling framework for secure multi-party computation
CN116702157B (zh) 一种基于神经网络的智能合约漏洞检测方法
CN113971135A (zh) 一种覆盖引导的智能合约测试用例生成方法
Saumya et al. Xstressor: Automatic generation of large-scale worst-case test inputs by inferring path conditions
Sabbaghi et al. FSCT: A new fuzzy search strategy in concolic testing
CN115048298A (zh) 一种面向数据包拼接的种子调度权值分配方法
Zhao et al. A systematic review of fuzzing
Zhang Beak: A directed hybrid fuzzer for smart contracts
Li et al. Ota: An operation-oriented time allocation strategy for greybox fuzzing

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
WW01 Invention patent application withdrawn after publication
WW01 Invention patent application withdrawn after publication

Application publication date: 20230103