CN113626324B - 一种面向Move语言虚拟机的模糊测试方法 - Google Patents

一种面向Move语言虚拟机的模糊测试方法 Download PDF

Info

Publication number
CN113626324B
CN113626324B CN202110891571.9A CN202110891571A CN113626324B CN 113626324 B CN113626324 B CN 113626324B CN 202110891571 A CN202110891571 A CN 202110891571A CN 113626324 B CN113626324 B CN 113626324B
Authority
CN
China
Prior art keywords
move
test
virtual machine
modules
parameters
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.)
Active
Application number
CN202110891571.9A
Other languages
English (en)
Other versions
CN113626324A (zh
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.)
Beihang University
Original Assignee
Beihang 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 Beihang University filed Critical Beihang University
Priority to CN202110891571.9A priority Critical patent/CN113626324B/zh
Publication of CN113626324A publication Critical patent/CN113626324A/zh
Application granted granted Critical
Publication of CN113626324B publication Critical patent/CN113626324B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

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/3684Test management for test design, e.g. generating new test cases
    • 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/3696Methods or tools to render software testable
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2201/00Indexing scheme relating to error detection, to error correction, and to monitoring
    • G06F2201/815Virtual
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2221/00Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/03Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
    • G06F2221/033Test or assess software

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Quality & Reliability (AREA)
  • Computer Security & Cryptography (AREA)
  • Software Systems (AREA)
  • Computing Systems (AREA)
  • Debugging And Monitoring (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开了一种面向Move语言虚拟机的模糊测试方法,属于软件测试技术领域:首先,针对Move语言虚拟机,通过调用接口函数确定目标测试接口;并根据给定的语法规则,手动构建初始测试样例;分别构建目标测试接口需要的两类非字节码参数;然后,将目标测试接口分别与AFL进行对接,对Move语言虚拟机进行模糊测试,收集能够触发目标测试程序出现崩溃和超时的测试样例作为训练数据集;生成对抗网络使用Wasserstein距离作为优化目标,综合考虑WGAN和DCGAN提出的约束条件,得到种子生成模型;使用训练数据集进行训练,得到新的初始测试样例;AFL随机变异产生新的输入测试样例,继续收集崩溃和超时的输入样例优化种子生成模型;本发明提高了模糊测试工具的性能。

Description

一种面向Move语言虚拟机的模糊测试方法
技术领域
本发明属于软件测试领域,具体是一种面向Move语言虚拟机的模糊测试方法。
背景技术
在2020年12月1日,Libra正式更名为Diem。Diem是Facebook推出的区块链,其旨在实现一个简单的全球结算系统,并且能够作为金融基础设施而使用,满足数十亿人的日常的金融需求。为了实现这一目标,Diem提出了一种新型的沙盒化编程语言Move,并且初步将该语言应用于Diem区块链。Diem VM是Diem区块链的运行平台,能够提供智能合约定义的代码的运行环境,而Move VM是Diem VM中的语言组件,其主要功能是完成对Move字节码的验证和执行。
模糊测试技术自诞生以来一直是发现软件漏洞的克星,被广泛应用于测试软件、操作系统、文件格式或者基于网络的应用中,能够自动化地发现目标测试接口或者程序中存在的错误或漏洞,是一种简单并且高效的测试技术。模糊测试工具AFL(American fuzzylop)是目前使用最广泛的模糊测试技术,和已经实现并投入使用的其他模糊测试工具相比,AFL在设计上具有更好的实用性,它采用了一系列简单且高效的模糊测试技巧,以及一些可以使模糊测试工具的工作量达到最小化的技巧。AFL具有配置简单、系统消耗小、测试效率高、自动化程度高和误报率低等优点,这些特性使其成为了很多模糊测试相关应用的参照基准。
大量研究表明初始种子的优劣会在很大程度上影响模糊测试工具的性能和效率,高质量的初始种子输入样例可以帮助模糊测试工具更快更好地发现目标测试程序的代码执行路径,进而更有效地发现程序中的错误和漏洞。而种子生成策略普遍存在一个现象:为了发现有效的种子而更多关注于发现目标测试程序对输入的语法和语义的限制,因此这些方法产生的输入样例具有很高的冗余性。会导致输入样例在目标测试程序中触发很多相同的执行路径,这就在很大程度上浪费了模糊测试的资源。
发明内容
针对上述问题,本发明提出了一种面向Move语言虚拟机的模糊测试方法,基于生成对抗网络进行输入种子优化,减少了输入样例在测试中执行路径的冗余性,实现了对Move语言虚拟机自动化、高效的测试。
具体步骤如下:
步骤一、针对Diem区块链的语言组件Move语言虚拟机,通过调用脚本执行和模块发布两个接口函数,确定目标测试接口;
被调用的两个接口函数为execute_script()和module_publish(),这两个接口为目标测试接口;
步骤二、根据Move语言给定的语法规则,手动构建初始测试样例,使其满足将语法规则全部覆盖;
首先,根据源代码的语法规则编写程序,并编译为二进制字节码的形式作为初始测试样例;编写程序需覆盖的功能有:(1)对模块的引用,包括简单引用和创建别名,同时包括对已发布和未发布的模块的引用;(2)对模块中结构类型和函数的引用,即引用其他模块中定义的结构类型或者调用其他模块中定义的函数;(3)定义不同类型的函数;(4)对于模块类型的程序,编写定义不同数量函数的程序,编写各种语法规则出现不同顺序的程序,编写给出模块发布者合法地址和非法地址的程序。
步骤三、在本地以目录的形式模拟Diem区块链的全局存储,构建目标测试接口需要的实现存储功能的第一类非字节码参数;
第一类非字节码参数包括:
Mode:该参数允许使用者选择是否对Move源代码的标准库函数和Diem区块链中定义的常用的模块进行发布;
MovePackage:该参数指明需要发布的源代码包的名称、目录及发布范围、依赖;
SourceFilter:该参数指明源代码包的目录以及该目录下需要发布和不需要发布的目录或文件,包含在参数MovePackage中;
OnDiskStateView:该参数实现的功能是通过目录的形式存储已经发布的模块和资源,初始构建时会按照Mode指定的模型对相应的模块进行发布;
第一类非字节码参数实现本地存储的步骤如下:
步骤301、判断本地存储是否存在编译目录和存储目录,若不存在,则创建相应的目录;如果存在,进入步骤302;
步骤302、判断是否选择发布Move语言的标准库函数或/和Diem区块链定义的常用模块,如果是,则进入步骤303,否则进入步骤306;
步骤303、采用递归操作,将要发布的标准库函数或/和常用模块,所依赖的所有模块和资源进行发布;
步骤304、判断选择发布内容的源代码目录是否存在,如果是,对源代码目录不再进行重复发布,进入步骤305;否则,采用递归操作,对源代码目录下的所有内容在编译目录下进行发布;
步骤305、判断是否选择发布二进制形式,如果是,将源代码目录下的所有文件内容进行编译,并从中筛选出没有发布的模块将其以二进制的形式在编译目录下进行发布,进入步骤306;否则,直接进入步骤306;
步骤306、将编译目录下的所有二进制文件反序列化,挑选出其中未发布的模块进行序列化,并且将其以二进制形式发布在存储目录下;
步骤四、构建Move语言虚拟机解释运行字节码参数时需要接收的第二类非字节码参数;
具体步骤如下
对于模块发布接口,Move语言虚拟机需要接收模块发布者的地址,即AccountAddress;构建方式为:判断模块对应的二进制字节码是否能反序列化,如果能,则从反序列化之后得到的数据结构中读取模块发布者的地址;否则,随机生成一个16字节的标识符作为模块发布者的地址;
对于脚本执行接口,需要接收参数args和senders;其中args是执行脚本中的函数所需要接收的参数,senders是执行该脚本所需要的模块和资源的地址。构建方式为:判断脚本对应的二进制字节码是否能反序列化,如果能,则从反序列化之后得到的数据结构中,读取脚本执行需要接收的参数和执行脚本所需要的模块和资源的地址;否则,随机产生相应类型的参数传递给脚本;
脚本执行和模块发布两个接口都需要接收参数CostStrategy,该参数为gas值消耗策略,目标测试接口通过该参数对Move语言中定义的gas量进行操作,该参数采用两种构建方式:一种在指定了gas_budget(u64类型的变量)的情况下,首先判断该值是否超过了最大gas消耗量的限制,如果没有超过,则创建名为交易消耗策略的方式;这种消耗策略会对交易的操作进行gas收费,当用户提交的交易没有足够的gas余量完成操作时,交易失败;另一种方式是在没有指定gas_budget的情况下,创建名为系统消耗策略的方式,这种消耗策略不会对交易的操作进行收费。
步骤五、当初始测试样例和目标测试接口的两类非字节码参数全部构建完成之后,将目标测试接口分别与AFL进行对接,并对Move语言虚拟机进行模糊测试,收集能够触发目标测试程序出现崩溃和超时的测试样例;
具体为:
AFL通过对初始测试样例进行随机变异产生新的输入测试样例,并且传递给目标测试接口,Move语言虚拟机在执行二进制字节码后,会返回相应的运行结果,AFL收集能够触发目标测试程序出现崩溃和超时的测试样例。
步骤六、对收集到的测试用例进行预处理,作为训练数据集;
预处理过程如下:
首先,读取所有测试用例的二进制文件,获取二进制文件的最大长度;将不够最大长度的二进制文件的尾部用0填充,补充至最大长度;
然后,设定阈值矩阵,将所有的二进制文件转化为阈值矩阵的大小,并进行归一化,得到所有矩阵的元素值均在0-1之间,作为训练数据集;
步骤七、生成对抗网络使用Wasserstein距离作为优化目标,生成器和判别器的结构综合考虑WGAN和DCGAN提出的约束条件,得到种子生成模型;
基于Wassertein距离,本发明设计的生成对抗网络的损失函数为:
Pr表示真实数据的概率分布,Pg表示生成器的概率分布,fw(x)表示真实数据在判别器中的输出,gθ(z)表示生成器的输出,z表示随机噪声,w表示判别器中的参数,W表示判别器中的所有参数,Pr(z)是随机噪声符合的分布。
约束条件如下:
(1)在每次更新了判别器的参数之后,会对判别器的参数进行截取,使其不超过一个[-c,c]的固定范围;
(2)在生成模型中使用小数步长卷积代替池化操作,在判别模型中采用步长卷积代替池化操作;
(3)在生成器和判别器中使用批正则化;
(4)在生成器中,输出层使用sigmoid函数进行激活,除了输出层之外的其余层使用ReLU函数进行激活;
(5)在判别器中,输出层不再采用sigmoid函数进行激活,除输出层之外的其余层都使用带泄漏的ReLU函数进行激活。
步骤八、使用训练数据集对种子生成模型进行训练,得到新的初始测试样例;
步骤九、AFL通过对新的初始测试样例进行随机变异产生新的输入测试样例,经过Move语言虚拟机执行后,AFL继续收集能够触发目标测试程序出现崩溃和超时的输入样例,返回步骤六,将其作为训练数据继续优化种子生成模型。
本发明的优点在于:
1)、一种面向Move语言虚拟机的模糊测试方法,能够帮助程序开发者和测试人员简单高效地发现Move语言虚拟机中存在的错误和漏洞,提高Move语言虚拟机的安全性。
2)、一种面向Move语言虚拟机的模糊测试方法,充分利用模糊测试初步的测试结果,通过优化初始测试样例,提高了模糊测试工具的性能。
附图说明
图1是本发明基于生成对抗网络进行输入种子优化的Move语言虚拟机模糊测试方法的整体架构图;
图2是本发明一种面向Move语言虚拟机的模糊测试方法的流程图;
图3是本发明中Diem区块链中Move语言整体架构;
图4是本发明实现的模糊测试工具发现代码执行路径的数量示意图;
图5是本发明实现的模糊测试工具发现崩溃和超时的数量示意图;
图6是本发明实现的模糊测试工具的执行速度示意图;
图7是本发明使用种子生成策略前后模糊测试工具发现路径、崩溃、超时的数量对比图;
具体实施方式
下面将结合附图和实施示例对本发明作进一步的详细说明。
本发明一种面向Move语言虚拟机的模糊测试方法,基于Move语言虚拟机的自动化测试技术,通过对初始种子输入样例的优化,提高模糊测试工具的性能及效率,为Move语言虚拟机中的漏洞和错误的定位和调试工作提供帮助,以便于后期修复,该模糊测试工具的整体架构如图1所示。该模糊测试工具首先对目标测试程序进行代码插桩,基于种子选择策略从初始输入的种子池中选择一个种子,基于种子变异策略对种子进行充分的变异之后得到新的测试用例,并对模糊测试程序进行测试,基于哈希算法进行覆盖;将能够触发目标测试程序出现崩溃和超时的种子保存下来,以便后续开发人员发现程序的漏洞并修复。针对Diem区块链的语言组件Move语言虚拟机,在相应模糊测试工具AFL给定的测试环境下,实现了面向Move语言虚拟机的模糊测试,并且基于生成对抗网络优化输入种子样例,对模糊测试工具的性能做进一步的提升。
本发明通过对Move虚拟机的代码和实现逻辑的分析,确定目标测试接口,构建调用目标测试接口所需要的相关参数,选用模糊测试工具AFL,实现面向Move语言虚拟机的初步的模糊测试工具。进而基于生成对抗网络,利用初步模糊测试工具获得能够触发目标测试程序出现崩溃和超时的测试用例,并且将其作为种子生成模型的训练数据,生成新的、更优的初始种子测试样例,对模糊测试工具的性能进行优化。
所述的一种面向Move语言虚拟机的模糊测试方法,如图2所示,具体步骤如下:
步骤一、针对Diem区块链的语言组件Move语言虚拟机,通过调用脚本执行和模块发布两个接口函数,确定目标测试接口;
通过分析Move语言虚拟机的代码和实现逻辑,得出Diem支付网络中Move语言从源代码到可执行脚本的整体架构如图3所示,Move编程语言编写的程序包括自定义模块和自定义事务脚本两种类型,经过源代码编译器编译后得到Move字节码中间表示形式,以无符号字符类型的动态数组存储在用户提交的签名交易中。Move语言虚拟机是Diem区块链的语言组件,包括解释程序、字节码校验器和加载器三个组成部分,实现与区块链的存储组件进行交互。图3可以看出Move语言虚拟机通过脚本执行和模块发布两个接口函数被调用。对Move虚拟机的代码进行进一步的分析,可以最终定位到Move虚拟机被调用的两个最外层接口函数——execute_script()和module_publish(),因此确定这两个接口为目标测试接口,并明确调用目标测试接口所需要构建的参数。
步骤二、根据Move语言给定的语法规则,手动构建初始测试样例,使其满足将语法规则全部覆盖;
首先,根据源代码的语法规则编写程序,并编译为二进制字节码的形式作为初始测试样例,在Move语言虚拟机中进行验证和执行;
Move语言虚拟机支持的脚本类型的程序,主要的语法规则包括:(1)引用已经发布的模块和资源,并且支持为其创建别名;(2)定义常量,是一种共享的静态值命名方法;(3)定义函数,函数标识符可以是任意字符串,脚本中函数最多只能有一个,可以接受认识数量和任意Move语言支持类型的值作为参数,不允许有返回值。
Move语言虚拟机支持的模块类型的程序,主要的语法规则和脚本类似,不同之处有:(1)模块类型的程序需要指出模块发布者的地址,该地址为一个128位的标识符;(2)模块中可以定义任意数量的函数;(3)各种语法规则出现的顺序没有限制。
在构建模块类型的程序时,需要针对模块具有的特性编写相应的程序。
通过对以上语法规则的分析,在构建脚本类型和模块类型的输入样例时,编写程序需覆盖的功能有:(1)对模块的引用,包括简单引用和创建别名,同时包括对已发布和未发布的模块的引用;(2)对模块中结构类型和函数的引用,即引用其他模块中定义的结构类型或者调用其他模块中定义的函数;(3)定义不同类型的函数,比如简单的算术运算、输入输出、函数嵌套、递归等;(4)对于模块类型的程序,编写定义不同数量函数的程序,编写各种语法规则出现不同顺序的程序,编写给出模块发布者合法地址和非法地址的程序。
步骤三、在本地以目录的形式模拟Diem区块链的全局存储,构建目标测试接口需要的实现存储功能的第一类非字节码参数;
第一类非字节码参数包括:
Mode:该参数允许使用者选择是否对Move源代码的标准库函数和Diem区块链中定义的常用的模块进行发布;
MovePackage:该参数指明需要发布的源代码包的名称、目录及发布范围、依赖;
SourceFilter:该参数指明源代码包的目录以及该目录下需要发布和不需要发布的目录或文件,包含在参数MovePackage中;
OnDiskStateView:该参数实现的功能是通过目录的形式存储已经发布的模块和资源,初始构建时会按照Mode指定的模型对相应的模块进行发布;
在本地模拟Diem区块链的全局存储所需的参数构建完成之后,本地存储会在当前目录下创建两个子目录。其中一个目录为编译目录,该目录下存放着已经发布模块的源代码,用于编译时供连接使用,同时该目录下存放有选择发布内容的Move字节码;另一个目录为存储目录,该目录下是按地址存储的模块和资源,该目录下的内容均以编译后的Move字节码的形式保存,该目录下的一级目录是模块或资源发布者的地址,二级目录指明该地址下存储的是模块还是资源。
本发明采用的方法是在本地模拟Diem区块链,结构上Diem的全局存储形成一种树形结构,因此在本地以目录的形式对Diem的全局存储进行模拟,具体步骤如下:
步骤301、判断本地存储是否存在指定的编译目录和存储目录,若不存在,则创建相应的目录;如果存在,进入步骤302;
步骤302、判断是否选择发布Move语言的标准库函数或/和Diem区块链定义的常用模块,如果是,则进入步骤303,否则进入步骤306;
步骤303、采用递归操作,将要发布的标准库函数或/和常用模块,所依赖的所有模块和资源进行发布;
步骤304、判断选择发布内容的源代码目录是否存在,如果是,对源代码目录不再进行重复发布,进入步骤305;否则,采用递归操作,对源代码目录下的所有内容在编译目录下进行发布;
步骤305、判断是否选择发布二进制形式,如果是,将源代码目录下的所有文件内容进行编译,并从中筛选出没有发布的模块将其以二进制的形式在编译目录下进行发布,进入步骤306;否则,直接进入步骤306;
步骤306、将编译目录下的所有二进制文件反序列化,挑选出其中未发布的模块进行序列化,并且将其以二进制形式发布在正确的存储目录下;
这种Diem区块链的全局存储的模拟方式保证了:在本地通过目录的形式实现了对Diem全局存储的树形结构的模拟;在本地以128位的地址标识符作为目录名,对某个地址上的模块或资源的操作,均转化为对某个目录及目录下存储的文件的操作,如对Diem全局存储的写入操作可以转化为对本地目录及文件的创建操作,对Diem全局存储的修改操作可以转化为对相应地址目录下的文件的修改操作,对Diem全局存储的删除操作可以转化为对相应文件和目录的删除操作。
步骤四、构建Move语言虚拟机解释运行字节码参数时需要接收的第二类非字节码参数;
Move语言编写的程序在虚拟机中运行时,虚拟机需要接收相应的参数,如发布模块时,虚拟机需要接收模块发布者的地址,执行脚本时,虚拟机需要接收脚本运行所需的参数,对于该类参数的构建,具体步骤如下
对于模块发布接口,Move语言虚拟机需要接收模块发布者的地址,即AccountAddress;构建方式为:判断模块对应的二进制字节码是否能反序列化,如果能,则从反序列化之后得到的数据结构中读取模块发布者的地址;否则,随机生成一个16字节的标识符作为模块发布者的地址;
对于脚本执行接口,需要接收参数args和senders;其中args是执行脚本中的函数所需要接收的参数,senders是执行该脚本所需要的模块和资源的地址。构建方式为:判断脚本对应的二进制字节码是否能反序列化,如果能,则从反序列化之后得到的数据结构中,读取脚本执行需要接收的参数和执行脚本所需要的模块和资源的地址;否则,随机产生相应类型的参数传递给脚本;
脚本执行和模块发布两个接口都需要接收参数CostStrategy,该参数为gas值消耗策略,对于gas值消耗策略,要调用目标测试接口还需要参数对Move语言中定义的gas量进行操作,该参数是执行交易时资源使用量的度量标准,保证了所有的程序都能运行结束。
该参数采用两种构建方式:一种在指定了gas_budget(u64类型的变量)的情况下,首先判断该值是否超过了最大gas消耗量的限制,如果没有超过,则创建名为交易消耗策略的方式;这种消耗策略会对交易的操作进行gas收费,当用户提交的交易没有足够的gas余量完成操作时,交易失败;另一种方式是在没有指定gas_budget的情况下,创建名为系统消耗策略的方式,这种消耗策略不会对交易的操作进行收费。
以上步骤构建了Move语言虚拟机对二进制字节码进行验证和执行所需要的非字节码参数,同时保证了调用目标测试接口进行测试时,输入的二进制字节码既有符合语法规范的源代码编译成的二进制字节码,也有非法的二进制字节码,既能够测试Move语言虚拟机对合法二进制字节码的处理过程是否正确,又能够测试Move语言虚拟机对于非法的二进制字节码的处理过程是否考虑全面。
步骤五、当初始测试样例和目标测试接口的两类非字节码参数全部构建完成之后,将目标测试接口分别与AFL进行对接,并对Move语言虚拟机进行模糊测试,收集能够触发目标测试程序出现崩溃和超时的测试样例;
具体为:
AFL通过对初始测试样例进行随机变异产生新的输入测试样例,并且传递给目标测试接口,Move语言虚拟机在执行二进制字节码后,会返回相应的运行结果,AFL收集能够触发目标测试程序出现崩溃和超时的测试样例,通过把这些测试用例放到目标测试程序中运行就能发现程序崩溃的原因,就可以发现Move语言虚拟机中存在的错误和漏洞。
AFL是一种旨在发现目标测试程序中的错误或漏洞的模糊测试工具,它应用一种新型的编译工具和遗传算法,自动发现能够触发应用程序新的内部状态的测试用例。和目前已经实现并使用的模糊测试工具相比,AFL在设计上具有更好的实用性。它采用了一系列简单且高效的模糊测试技巧,以及一些可以使模糊测试工具的工作量达到最小化的技巧。此外,很重要的一点是AFL几乎不需要配置,并且可以轻松处理比较复杂的现实生活中的情景,例如图像解析和文件压缩等,AFL的执行流程为:首先,AFL会对目标测试程序进行编译时插桩。AFL在运行时会维护一个输入样例的队列,并且每次从输入队列中读取一个样例,对其进行充分的变异,变异后的文件会作为目标测试程序的输入样例,在目标测试程序中运行。如果目标测试程序运行时出现了崩溃(crash)或超时(hang),则AFL会将该输入样例记录下来。
步骤六、对收集到的能够触发目标测试程序出现崩溃和超时的测试用例进行预处理,作为训练数据集;
模糊测试工具得到的初步结果是大小不确定的二进制文件,并且机器学习的方法在矩阵的定量值上运行更好,二进制文件的格式不利于模型的训练。因此需要对模糊测试得到的初步结果进行转换,预处理过程如下:
首先,读取所有测试用例的二进制文件,获取二进制文件的最大长度;将不够最大长度的二进制文件的尾部用0填充,补充至最大长度;
然后,设定合适的矩阵大小作为阈值矩阵,将所有的二进制文件转化为阈值矩阵的大小,并进行归一化,得到所有矩阵的元素值均在0-1之间,作为训练数据集;
步骤七、生成对抗网络使用Wasserstein距离作为优化目标,生成器和判别器的结构综合考虑WGAN和DCGAN提出的约束条件,得到种子生成模型;
生成对抗网络(GAN)是机器学习方法中最突出的生成模型之一,该模型由一个生成网络和一个判别网络组成,生成网络的目标是尽量生成真实的数据,而判别网络的目标是尽量把生成网络生成的数据和真实的数据区分开,二者构成一个动态博弈过程。GAN模型虽然在生成问题上表现良好,但是存在训练十分不稳定、缺乏指示训练过程的指标以及生成数据比较单一等缺点。
基于这样的研究背景,Martin Arjovsky等人在2017年提出了Wasserstein GAN(WGAN)。相较于GAN,WGAN提升了模型在训练时的稳定性,在大多数情况下WGAN模型的训练不会再出现崩溃的问题。并且使用者不需要花费大量精力设计网络的架构,也不再需要使用者协调判别器和生成器之间的训练程度。
DCGAN是由Alec Radford等人于2015年提出的,该方法成功将卷积神经网络和GAN结合在一起,并且提出了一组关于GAN结构的约束条件,使模型能够稳定地进行训练。
为了得到能够稳定训练的种子生成模型,该发明设计的生成对抗网络采用WGAN和DCGAN模型相结合的方式,即采用Wasserstein距离作为优化目标,判别器和生成器的结构综合考虑WGAN和DCGAN所提出的约束条件。
基于Wassertein距离,本发明设计的生成对抗网络的损失函数为:
Pr表示真实数据的概率分布,Pg表示生成器的概率分布,fw(x)表示真实数据在判别器中的输出,gθ(z)表示生成器的输出,z表示随机噪声,w表示判别器中的参数,W表示判别器中的所有参数,Pr(z)是随机噪声符合的分布。
约束条件如下:
(1)在每次更新了判别器的参数之后,会对判别器的参数进行截取,使其不超过一个[-c,c]的固定范围;
(2)在生成模型中使用小数步长卷积代替池化操作,在判别模型中采用步长卷积代替池化操作;
(3)在生成器和判别器中使用批正则化;
(4)在生成器中,输出层使用sigmoid函数进行激活,除了输出层之外的其余层使用ReLU函数进行激活;
(5)在判别器中,输出层不再采用sigmoid函数进行激活,除输出层之外的其余层都使用带泄漏的ReLU函数进行激活。
步骤八、使用训练数据集对种子生成模型进行训练,得到新的初始测试样例;
步骤九、AFL通过对新的初始测试样例进行随机变异产生新的输入测试样例,经过Move语言虚拟机执行后,AFL继续收集能够触发目标测试程序出现崩溃和超时的输入样例,返回步骤六,将其作为训练数据继续优化种子生成模型。
将新的初始种子测试样例应用于模糊测试后,对比使用种子生成策略前后模糊测试工具性能的变化,继续收集能够触发目标测试程序出现崩溃和超时的输入样例,将其作为训练数据继续优化种子生成模型。
具体实例:
使用本发明所述方法对Move语言虚拟机进行模糊测试,使用AFL的集成工具afl-plot对模糊测试工具的性能进行分析,如图4所示为模糊测试工具发现的代码执行路径的数量以及还没有进行任何模糊测试的路径的数量,如图5所示为模糊测试工具发现的能够触发目标测试程序出现崩溃和超时的测试用例的数量,如图6所示为模糊测试工具的执行速度。通过结果分析可得该模糊测试工具能够高效、准确地发现Move语言虚拟机中存在的错误和漏洞。
对使用种子生成策略前后模糊测试工具性能的变化进行对比,主要通过单位时间内,目标测试程序产生的崩溃和超时的数量作为衡量的标准。对比分析选用execute_script()接口作为目标测试接口运行模糊测试。首先,将手动构建的测试用例作为AFL的初始输入,运行AFL对execute_script()接口进行模糊测试,在测试运行12小时和24小时的时候对测试结果进行记录。其次,将收集到的1941个能够触发Move VM出现崩溃或超时的文件进行处理,得到训练数据集,对种子生成模型进行训练。以种子生成模型生成的新的测试用例作为AFL的初始输入,对execute_script()接口进行模糊测试在模糊测试运行12小时和24小时的时候对AFL测试结果进行记录。
对比两次实验结果,如图7所示,可以发现在模糊测试开始运行12小时和24小时时,以种子生成模型生成的测试用例作为AFL的原始输入的模糊测试工具,发现的崩溃和超时的数量都比以手动构建的测试用例作为AFL原始输入的模糊测试工具发现的崩溃和超时的数量多。因此,可以得出结论以种子生成模型生成的测试用例作为AFL的原始输入可以帮助模糊测试工具更好地发现能够触发目标测试程序出现崩溃或超时的输入样例。从图7中还可以得到的信息是,种子生成模型生成的测试用例能够帮助模糊测试工具更好探索不同的代码执行路径。

Claims (7)

1.一种面向Move语言虚拟机的模糊测试方法,其特征在于,具体步骤如下:
步骤一、针对Diem区块链的语言组件Move语言虚拟机,通过调用脚本执行和模块发布两个接口函数,确定目标测试接口;
步骤二、根据Move语言给定的语法规则,手动构建初始测试样例,使其满足将语法规则全部覆盖;
步骤三、在本地以目录的形式模拟Diem区块链的全局存储,构建目标测试接口需要的实现存储功能的第一类非字节码参数;
第一类非字节码参数实现本地存储的步骤如下:
步骤301、判断本地存储是否存在编译目录和存储目录,若不存在,则创建相应的目录;如果存在,进入步骤302;
步骤302、判断是否选择发布Move语言的标准库函数或/和Diem区块链定义的常用模块,如果是,则进入步骤303,否则进入步骤306;
步骤303、采用递归操作,将要发布的标准库函数或/和常用模块,所依赖的所有模块和资源进行发布;
步骤304、判断选择发布内容的源代码目录是否存在,如果是,对源代码目录不再进行重复发布,进入步骤305;否则,采用递归操作,对源代码目录下的所有内容在编译目录下进行发布;
步骤305、判断是否选择发布二进制形式,如果是,将源代码目录下的所有文件内容进行编译,并从中筛选出没有发布的模块将其以二进制的形式在编译目录下进行发布,进入步骤306;否则,直接进入步骤306;
步骤306、将编译目录下的所有二进制文件反序列化,挑选出其中未发布的模块进行序列化,并且将其以二进制形式发布在存储目录下;
步骤四、构建Move语言虚拟机解释运行字节码参数时需要接收的第二类非字节码参数;
步骤五、当初始测试样例和目标测试接口的两类非字节码参数全部构建完成之后,将目标测试接口分别与AFL进行对接,并对Move语言虚拟机进行模糊测试,收集能够触发目标测试程序出现崩溃和超时的测试样例;
步骤六、对收集到的测试用例进行预处理,作为训练数据集;
步骤七、生成对抗网络使用Wasserstein距离作为优化目标,生成器和判别器的结构综合考虑WGAN和DCGAN提出的约束条件,得到种子生成模型;
预处理过程如下:
基于Wassertein距离,设计的生成对抗网络的损失函数为:
Pr表示真实数据的概率分布,Pg表示生成器的概率分布,fw(x)表示真实数据在判别器中的输出,gθ(z)表示生成器的输出,z表示随机噪声,w表示判别器中的参数,W表示判别器中的所有参数,Pr(z)是随机噪声符合的分布;
约束条件如下:
(1)在每次更新了判别器的参数之后,会对判别器的参数进行截取,使其不超过一个[-c,c]的固定范围;
(2)在生成模型中使用小数步长卷积代替池化操作,在判别模型中采用步长卷积代替池化操作;
(3)在生成器和判别器中使用批正则化;
(4)在生成器中,输出层使用sigmoid函数进行激活,除了输出层之外的其余层使用ReLU函数进行激活;
(5)在判别器中,输出层不再采用sigmoid函数进行激活,除输出层之外的其余层都使用带泄漏的ReLU函数进行激活;
步骤八、使用训练数据集对种子生成模型进行训练,得到新的初始测试样例;
步骤九、AFL通过对新的初始测试样例进行随机变异产生新的输入测试样例,经过Move语言虚拟机执行后,AFL继续收集能够触发目标测试程序出现崩溃和超时的输入样例,返回步骤六,将其作为训练数据继续优化种子生成模型。
2.如权利要求1所述的一种面向Move语言虚拟机的模糊测试方法,其特征在于,所述步骤一中被调用的两个接口函数为execute_script()和module_publish(),这两个接口为目标测试接口。
3.如权利要求1所述的一种面向Move语言虚拟机的模糊测试方法,其特征在于,所述的步骤二具体为:首先,根据源代码的语法规则编写程序,并编译为二进制字节码的形式作为初始测试样例;编写程序需覆盖的功能有:(1)对模块的引用,包括简单引用和创建别名,同时包括对已发布和未发布的模块的引用;(2)对模块中结构类型和函数的引用,即引用其他模块中定义的结构类型或者调用其他模块中定义的函数;(3)定义不同类型的函数;(4)对于模块类型的程序,编写定义不同数量函数的程序,编写各种语法规则出现不同顺序的程序,编写给出模块发布者合法地址和非法地址的程序。
4.如权利要求1所述的一种面向Move语言虚拟机的模糊测试方法,其特征在于,所述的步骤三中第一类非字节码参数包括:
Mode:该参数允许使用者选择是否对Move源代码的标准库函数和Diem区块链中定义的常用的模块进行发布;
MovePackage:该参数指明需要发布的源代码包的名称、目录及发布范围、依赖;
SourceFilter:该参数指明源代码包的目录以及该目录下需要发布和不需要发布的目录或文件,包含在参数MovePackage中;
OnDiskStateView:该参数实现的功能是通过目录的形式存储已经发布的模块和资源,初始构建时会按照Mode指定的模型对相应的模块进行发布。
5.如权利要求1所述的一种面向Move语言虚拟机的模糊测试方法,其特征在于,所述的步骤四具体为:
对于模块发布接口,Move语言虚拟机需要接收模块发布者的地址,即AccountAddress;构建方式为:判断模块对应的二进制字节码是否能反序列化,如果能,则从反序列化之后得到的数据结构中读取模块发布者的地址;否则,随机生成一个16字节的标识符作为模块发布者的地址;
对于脚本执行接口,需要接收参数args和senders;其中args是执行脚本中的函数所需要接收的参数,senders是执行该脚本所需要的模块和资源的地址;构建方式为:判断脚本对应的二进制字节码是否能反序列化,如果能,则从反序列化之后得到的数据结构中,读取脚本执行需要接收的参数和执行脚本所需要的模块和资源的地址;否则,随机产生相应类型的参数传递给脚本;
脚本执行和模块发布两个接口都需要接收参数CostStrategy,该参数为gas值消耗策略,目标测试接口通过该参数对Move语言中定义的gas量进行操作,该参数采用两种构建方式:一种在指定了gas_budget的情况下,首先判断该值是否超过了最大gas消耗量的限制,如果没有超过,则创建名为交易消耗策略的方式;这种消耗策略会对交易的操作进行gas收费,当用户提交的交易没有足够的gas余量完成操作时,交易失败;另一种方式是在没有指定gas_budget的情况下,创建名为系统消耗策略的方式,这种消耗策略不会对交易的操作进行收费。
6.如权利要求1所述的一种面向Move语言虚拟机的模糊测试方法,其特征在于,所述步骤五具体为:
AFL通过对初始测试样例进行随机变异产生新的输入测试样例,并且传递给目标测试接口,Move语言虚拟机在执行二进制字节码后,会返回相应的运行结果,AFL收集能够触发目标测试程序出现崩溃和超时的测试样例。
7.如权利要求1所述的一种面向Move语言虚拟机的模糊测试方法,其特征在于,所述步骤六预处理过程如下:
首先,读取所有测试用例的二进制文件,获取二进制文件的最大长度;将不够最大长度的二进制文件的尾部用0填充,补充至最大长度;
然后,设定阈值矩阵,将所有的二进制文件转化为阈值矩阵的大小,并进行归一化,得到所有矩阵的元素值均在0-1之间,作为训练数据集。
CN202110891571.9A 2021-08-04 2021-08-04 一种面向Move语言虚拟机的模糊测试方法 Active CN113626324B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110891571.9A CN113626324B (zh) 2021-08-04 2021-08-04 一种面向Move语言虚拟机的模糊测试方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110891571.9A CN113626324B (zh) 2021-08-04 2021-08-04 一种面向Move语言虚拟机的模糊测试方法

Publications (2)

Publication Number Publication Date
CN113626324A CN113626324A (zh) 2021-11-09
CN113626324B true CN113626324B (zh) 2023-09-26

Family

ID=78382621

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110891571.9A Active CN113626324B (zh) 2021-08-04 2021-08-04 一种面向Move语言虚拟机的模糊测试方法

Country Status (1)

Country Link
CN (1) CN113626324B (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11991298B2 (en) * 2019-06-14 2024-05-21 Ailia Sa Method for the execution of an instance of a smart contract by means of a blockchain
CN114064506B (zh) * 2021-11-29 2023-04-04 电子科技大学 一种基于深度神经网络的二进制程序模糊测试方法及系统
CN114117450B (zh) * 2021-12-01 2024-06-18 湖南大学 一种用于可信计算环境模糊测试的种子生成方法
CN115455423B (zh) * 2022-08-22 2023-07-07 国网浙江省电力有限公司电力科学研究院 模糊测试用例生成方法及装置
CN117370994B (zh) * 2023-12-08 2024-02-27 浙江君同智能科技有限责任公司 基于模糊测试的大语言模型漏洞检测方法和装置

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5784553A (en) * 1996-01-16 1998-07-21 Parasoft Corporation Method and system for generating a computer program test suite using dynamic symbolic execution of JAVA programs
CN109598334A (zh) * 2018-12-03 2019-04-09 中国信息安全测评中心 一种样本生成方法及装置
CN112074817A (zh) * 2018-05-02 2020-12-11 微软技术许可有限责任公司 具有跨级别跟踪映射的执行控制

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11841789B2 (en) * 2016-01-27 2023-12-12 Microsoft Technology Licensing, Llc Visual aids for debugging
US10459829B2 (en) * 2017-06-07 2019-10-29 M/S. Cigniti Technologies Limited Overall test tool migration pipeline

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5784553A (en) * 1996-01-16 1998-07-21 Parasoft Corporation Method and system for generating a computer program test suite using dynamic symbolic execution of JAVA programs
CN112074817A (zh) * 2018-05-02 2020-12-11 微软技术许可有限责任公司 具有跨级别跟踪映射的执行控制
CN109598334A (zh) * 2018-12-03 2019-04-09 中国信息安全测评中心 一种样本生成方法及装置

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
针对WebAssembly虚拟机的模糊测试方案;林敏;张超;;网络安全技术与应用(第06期);全文 *

Also Published As

Publication number Publication date
CN113626324A (zh) 2021-11-09

Similar Documents

Publication Publication Date Title
CN113626324B (zh) 一种面向Move语言虚拟机的模糊测试方法
Schulz et al. Faster, higher, stronger: E 2.3
Chen et al. Gaschecker: Scalable analysis for discovering gas-inefficient smart contracts
US10162612B2 (en) Method and apparatus for inventory analysis
US6182245B1 (en) Software test case client/server system and method
Bergmann et al. Incremental pattern matching in the VIATRA model transformation system
US8793674B2 (en) Computer-guided holistic optimization of MapReduce applications
Brooks Survey of automated vulnerability detection and exploit generation techniques in cyber reasoning systems
CN113672515A (zh) 一种基于符号执行的wasm智能合约漏洞检测方法
Gómez et al. Map-based transparent persistence for very large models
US20070234314A1 (en) Generating a test suite to test support for routines
CN110968437A (zh) 一种基于Java智能合约的单个合约并行执行的方法、装置、设备及介质
CN1658199A (zh) 增量式基于断言的设计验证
CN111475820A (zh) 基于可执行程序的二进制漏洞检测方法、系统及存储介质
CN114297063B (zh) 针对源代码的自动化形式化建模与验证的方法与系统
US11740875B2 (en) Type inference in dynamic languages
CN117009972A (zh) 漏洞检测方法、装置、计算机设备和存储介质
CN111459984B (zh) 基于流式处理的日志数据处理系统及方法
US20060195681A1 (en) Test program instruction generation
He Modeling and analyzing smart contracts using predicate transition nets
Ali et al. Generating test case for object-oriented software using genetic algorithm and mutation testing method
Jiang et al. An exploitability analysis technique for binary vulnerability based on automatic exception suppression
Liu et al. ConFL: Constraint-guided Fuzzing for Machine Learning Framework
JP2002515996A (ja) シミュレートされたプログラムの実行エラーの検出方法および装置
Fang et al. PaVM: A Parallel Virtual Machine for Smart Contract Execution and Validation

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
GR01 Patent grant
GR01 Patent grant