一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种覆盖引导的智能合约测试用例生成方法与流程

2022-02-21 11:17:35 来源:中国专利 TAG:


1.本发明属于软件测试技术领域,具体涉及到智能合约的漏洞检测问题,提供了一种覆盖引导的智能合约测试用例生成方法,主要解决现有的智能合约漏洞静态检测方法中的误报率高、测试用例覆盖到的分支数少等问题,实现智能合约漏洞的高效检测。


背景技术:

2.目前,区块链技术已进入了以智能合约为标志的区块链2.0时代,智能合约是执行在区块链上的图灵完备的程序,同时,在数字支付、金融资产处置、云计算、互联网和共享经济等方面有着广阔的应用前景,且其具有确定性、实时性和去中心化等特点。与传统的java与c程序相同,智能合约中存在漏洞,但与其不同的是,智能合约一旦部署在区块链上,就无法修改,因此智能合约中的漏洞会永远存在,从而更易受到攻击。近年来,针对智能合约的攻击的新闻报道越来越多,2016年6月17日区块链业界最大的众筹项目去中心化的自治组织(the decentralized autonomous organization,the dao)遭到攻击,the dao因split dao函数漏洞遭到攻击,最终导致300多万以太币资产被分离出the dao资产池。parity钱包遭受了两个漏洞,第一个导致了6000万美元的损失,第二个则导致冻结了超过1.5亿美金的以太币。2018年美链百亿美金项目瞬时归零。智能合约的安全问题给区块链社区造成了严重的损失,因此,研究智能合约安全性问题尤为重要。
3.ncc group总结的智能合约中常见的10类安全问题分别为:代码重入、未检查函数调用返回值、整数溢出、以太币冻结、短地址攻击、访问控制不当、时间戳依赖、区块变量依赖、交易顺序依赖(transaction order dependency,tod)、区块gas限制。依靠开发者的技能水平以及基于专家经验的代码审计安全保障,已无法满足智能合约数量及规模不断扩大、漏洞挖掘难度提升等新形势下漏洞分析与发现的需求。因此,大量的智能合约漏洞自动化检测工具不断涌现,利用自动化漏洞检测方法,不仅能够更加高效地挖掘出合约中的安全漏洞,而且能够同时满足漏洞分析与发现的需求。目前,主流的智能合约漏洞自动化检测方法包括静态分析,符号执行,以及模糊测试。
4.静态分析无需动态执行合约代码,仅通过静态分析合约源码,提取并分析源码中的语义信息,检测合约中的漏洞。slither是一种智能合约漏洞静态检测工具,其在对合约源代码静态分析的基础上,为用户提供了信息打印和异常探测两大模块用于智能合约的分析,其异常探测可以探测多达四十余种智能合约的异常,但其未能检测出以太币冻结等业务逻辑方面的漏洞,且存在误报现象。
5.作为一种程序分析技术,符号执行的关键思想是使用符号值代替输入数据,从而将程序的输入转化成符号输入的函数。符号执行经过多年的持续发展,在软件测试、漏洞检测等领域有着非常重要的作用,其同样也被应用在智能合约漏洞检测领域中。oyente是基于动态符号执行的智能合约漏洞分析工具,可以直接运行在以太坊虚拟机字节码上,oyente目前支持检测tod、时间戳依赖、整数溢出和代码重入等漏洞。为了防止路径爆炸,oyente简化地处理循环,导致部分漏洞漏报。
6.模糊测试是一种安全性测试的方法,其通过输入一些意外数据运行被测程序,在以太坊虚拟机中监测合约是否会出现异常。contractfuzzer是第一个基于以太坊平台智能合约漏洞检测的模糊测试工具,该漏洞检测工具首先将智能合约代码编译成字节码指令,静态分析智能合约应用程序二进制接口,生成测试用例。然后通过测试用例动态执行指令代码,检测其是否存在漏洞。该工具目前只能检测7种漏洞,但由于测试用例生成的随机性,无法达到理想的覆盖率,其难以发现所有的潜在的漏洞。
7.为了提高模糊测试中测试用例的覆盖率,sfuzz采用反馈自适应模糊策略,使生成的测试用例达到最大的路径覆盖率。sfuzz借鉴传统的模糊测试工具afl(american fuzzy lop,afl),采用遗传算法通过改进基于搜索的策略得到其适应度算法,从而提出反馈引导的自适应模糊策略,即找到距离未被覆盖路径最近的测试用例。该检测方法提高了测试用例的路径覆盖率,sfuzz支持检测大多数种常见漏洞,同时也能检测出以太币冻结等业务逻辑方面的漏洞,但sfuzz测试用例的覆盖率仅达到80%左右,对于部分漏洞仍存在漏报。
8.如上所述,目前虽然出现了一些关于以太坊智能合约漏洞检测的研究工具,但也显示了一些较为明显的缺点:检测效果差,漏报率和误报率较高,检测开销大,检测效率低,究其原因,还是测试用例的覆盖率不够。因此,本发明提出了一种覆盖引导的智能合约测试用例生成方法,该方法依据静态分析结果引导测试用例的进化方向,从而生成覆盖更多漏洞语句的测试用例,减少漏洞检测的漏报。


技术实现要素:

9.本发明解决的问题:克服现有的智能合约漏洞检测方法中,存在的误报率以及漏报率高等问题,对智能合约进行静态分析,根据静态检测结果指导遗传算法中测试用例的进化方向,使其生成覆盖更多漏洞语句的测试用例,有效降低了漏洞检测方法中的误报以及漏报,提高了智能合约的漏洞检测效率。
10.以太坊中的智能合约是运行在以太坊虚拟机中,对于被测智能合约首先会为其自动配置一个区块链网络,并部署该合约。本发明提出的覆盖引导的智能合约测试用例生成方法流程如图1所示:
11.(1)利用slither静态漏洞分析工具对智能合约源码进行静态分析,并将静态分析结果中的漏洞语句所在的行号信息以及检测出的合约漏洞记录在静态漏洞检测信息文件中;
12.(2)利用solc编译器,编译被测智能合约,生成智能合约应用程序二进制接口以及以太坊虚拟机字节码,根据智能合约应用程序二进制接口随机生成测试用例;
13.(3)在以太坊虚拟机中对被测智能合约字节码插桩,被测智能合约的每个函数插入函数桩,函数内每个分支点插入分支桩,并在以太坊geth节点中部署插桩后的智能合约代码;
14.(4)根据生成的测试用例,运行插桩后的智能合约代码,在以太坊虚拟机中监测每个测试用例的覆盖信息,在当前测试用例全部执行完毕或在用户自定义的漏洞检测时间内,判断测试用例是否检测到合约漏洞,检测到漏洞则输出每个传入参数的值以及检测到的合约漏洞,否则,将测试用例覆盖到的分支数保存在智能合约漏洞检测库中,库中保存的信息有每个测试用例覆盖到的漏洞语句个数,漏洞语句所在的行号信息以及覆盖到的分支
数,同时根据静态漏洞检测信息文件,判断测试用例覆盖到的分支所在的行号信息是否与静态漏洞检测信息文件中漏洞语句所在的行号信息相等,如果相等,则将测试用例覆盖到的漏洞语句个数也保存在智能合约漏洞检测库中,进入步骤(5);
15.(5)根据智能合约漏洞检测库中每个测试用例覆盖到的漏洞语句个数和覆盖到的分支数,计算测试用例的适应度值,适应度值计算用fitness表示,
16.fitness=α1*vcov α2*ncov
17.其中,vcov表示测试用例覆盖到的漏洞语句个数,ncov表示测试用例覆盖到的分支数,α1,α2表示vcov和ncov在fitness中所占的比重,根据测试用例的覆盖信息计算适应度值,按照适应度值由大到小进行测试用例排序,适应度值越大表明其含有的基因越优秀;
18.(6)调用交叉变异操作生成新的测试用例;对排序好的测试用例集中排序靠前的前半部分采用交叉操作:选择第一个测试用例与第二个测试用例为一组,第三个测试用例与第四个测试用例为一组,剩余类推,接着将选择的同组测试用例在随机选定的位置分成两部分、交换第二部分以形成两个新的测试用例;对排序好的测试用例集中排序靠后的后半部分采用以下变异操作之一:翻转随机选择的位或字节,增加或替换所选的随机字节,随机位置用智能合约中的常数替换一个值,随机生成的地址或余额替换测试用例中的地址或余额;
19.(7)将新的测试用例逐个发送给已插桩的可执行代码中,返回步骤(4)。
20.有益效果:
21.目前,现有静态分析漏洞检测方法存在误报数与漏报数多的问题,其主要原因是测试用例的覆盖率不够,为此本发明采用覆盖引导的智能合约测试用例生成方法,首先使用静态分析工具对代码进行扫描,从中析取出可疑的合约漏洞语句,这些合约漏洞语句可能是误报,然后将这些合约漏洞语句与代码覆盖信息相结合引入到适应度计算中,从而将测试方向由达到较高的代码覆盖率转移到合约漏洞语句覆盖上,避免了大量的无用功,从而提高测试效率。
22.典型实例实验结果证实该方法的有效性:选取智能合约漏洞库(smart contract weakness classification,swc)中的所有合约,分别统计slither、sfuzz、本方法的智能合约漏洞检测情况。swc是以太坊开发人员的必备知识库,它是由智能合约安全联盟提供的以太坊智能合约安全漏洞分类及测试用例集,其中包含了37种以太坊solidity智能合约开发中常见的安全漏洞的描述及后果,例如重入漏洞、整数溢出漏洞等。同时设置交叉概率为0.9,变异概率0.05,种群个体数1000,个体基因个数14,适应度函数的权值α1=2,α2=1。其中三种方法的智能合约漏洞检测情况,如表1所示。其中tw、fw、fn分别代表漏洞正确检测数、漏洞检测误报数、漏洞检测漏报数。
23.表1三种检测方法的智能合约漏洞检测情况
[0024][0025]
三种检测方法的漏报率和误报率如图2所示,其中误报率=fw/(fw tw),漏报率=fn/(tw fn)。与slither相比本方法的误报率降低73.7%,与sfuzz相比本方法的漏报率降
低48.3%,因此,本方法能够有效降低漏洞检测的误报率与漏报率。
附图说明
[0026]
附图1本发明的方法流程图。
[0027]
附图2三种检测方法的漏洞检测漏报率和误报率图。
具体实施方式
[0028]
为使本领域的技术人员更好地理解本发明的技术方案,下面对本发明提供的覆盖引导的智能合约测试用例生成方法进行详细描述。
[0029]
(1)将表2中的被测智能合约保存在freezingethersample.sol文件中;
[0030]
表2被测智能合约代码
[0031][0032]
(2)使用slither静态检测freezingethersample.sol文件中的被测合约,slither运行在docker容器中,通过以下docker命令即进入其运行环境中,其中965b1e4ca92e表示sliher对应的docker容器的id号:
[0033]
sudo docker start 965b1e4ca92e;
[0034]
sudo docker attach 965b1e4ca92e;
[0035]
进入slither运行环境中,通过输入slither freezingethersample.sol命令(其中freezingethersample.sol代表被测合约),输出被测智能合约的静态检测结果,保存在静态漏洞检测信息文件中,结果中标有漏洞语句所在的行号信息以及检测出的合约漏洞;
[0036]
(3)利用solc编译器,编译被测智能合约,将其编译为freezingethersample.json文件,其中freezingethersample.json文件中包含智能合约的应用程序二进制接口和智能合约编译后的字节码,解析被测智能合约应用程序二进制接口,提取所有函数签名,函数签名包括函数描述以及每个函数参数的数据类型,智能合约函数参数数据类型如果是地址类型,首先对被测智能合约的每一个应用程序二进制接口生成私有的智能合约池,智能合约池中存放所有支持该应用程序二进制接口中的函数所调用的智能合约的地址,然后随机选择智能合约池中存放的智能合约地址作为测试用例;如果智能合约函数参数数据类型是定长类型参数,随机地从参数的合法测试数据域中选择一组数值作为测试用例;如果智能合
约函数参数数据类型是不定长类型参数,首先随机地生成一个正数作为该参数的长度,随后再对参数中的各个元素随机地从合法测试用例域中选择一组数值作为测试用例,测试用例包含σ0与∑,σ0是区块链网络配置,∑是交易序列(函数调用),σ0包含了与智能合约执行相关的网络设置的所有信息,σ0=(b,ts,sa,sb,v),其中b代表当前的区块号,ts代表当前的区块时间戳,sa代表一系列智能合约地址,sb是给每个地址分配一个初始余额的函数,v是常变量的初始估值。是被测智能合约的一系列公共函数调用,每个调用都有一个可选的具体输入测试序列,每个测试都有一个可选的具体输入参数序列,其中,m0必须是构造函数的调用;
[0037]
(4)初始σ0区块链网络配置设置为:
[0038]
b=0,ts=0,sa=0xf0,sb=0xff0000000000000000000000,v=0,该被测合约生成2个序列,同时会生成r个函数调用序列(1<r<2
×
n),然后根据freezingethersample.json中的应用程序二进制接口,随机地从参数的合法测试数据域中为uint256类型的value变量选择一组数值作为函数调用的参数值;
[0039]
(5)在被测智能合约字节码中为函数内每个分支点插入分支桩,其中采用的trace_cov数组中记录了当前测试用例的每个分支的覆盖次数;采用virgin_cov全局覆盖信息数组,记录了已执行的所有测试用例的覆盖信息;
[0040]
(6)将插桩后的合约可执行代码部署在以太坊geth节点中,在以太坊虚拟机中监测每个测试用例的覆盖信息,设置漏洞检测的时间为1800毫秒,进行测试用例的执行,判断测试用例是否检测到合约漏洞,检测到漏洞则输出每个传入参数的值以及检测到的合约漏洞,否则将测试用例覆盖到的分支数保存在智能合约漏洞检测库中,库中保存的信息有每个测试用例覆盖到的漏洞语句个数,漏洞语句所在的行号信息以及覆盖到的分支数,同时根据静态漏洞检测信息文件,判断测试用例覆盖到的分支所在的行号信息是否与静态漏洞检测信息文件中漏洞语句所在的行号信息相等,如果相等,则将测试用例覆盖到的漏洞语句个数也保存在智能合约漏洞检测库中,进入步骤(7);
[0041]
(7)根据智能合约漏洞检测库中每个测试用例覆盖到的漏洞语句个数和覆盖到的分支数,得到第一个测试用例vcov=0,ncov=2,第二个测试用例vcov=0,ncov=4,第三个测试用例vcov=1,ncov=6,第四个测试用例vcov=3,ncov=9,最后对其进行适应度值计算,取参数α1=2,α2=1,计算出第一个测试用例适应度为2,第二个测试用例适应度为4,第三个测试用例适应度为8,第四个测试用例适应度为15,最后将测试用例集按照适应度值由大到小进行排序;
[0042]
(8)调用交叉与变异操作生成新的测试用例,对排序好的测试用例集中前两个测试用例采用交叉操作:在选定的位置将两个测试用例分成两部分、交换第二部分以形成两个新的测试用例;变异操作符如表3所示,对排序好的测试用例集中后两个测试用例采用以下变异操作之一:翻转随机选择的位或字节,增加或替换所选的随机字节,随机位置用智能合约中的常数替换一个值,随机生成的地址或余额替换测试用例中的地址或余额;
[0043]
表3变异操作符
[0044][0045]
将新的测试用例逐个发送给已插桩的可执行代码中,最后返回步骤(6)。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献