CN114546836A - 基于下推自动机引导的公共组件库自动化测试方法及装置 - Google Patents

基于下推自动机引导的公共组件库自动化测试方法及装置 Download PDF

Info

Publication number
CN114546836A
CN114546836A CN202210094282.0A CN202210094282A CN114546836A CN 114546836 A CN114546836 A CN 114546836A CN 202210094282 A CN202210094282 A CN 202210094282A CN 114546836 A CN114546836 A CN 114546836A
Authority
CN
China
Prior art keywords
function
information
call
push
component library
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.)
Granted
Application number
CN202210094282.0A
Other languages
English (en)
Other versions
CN114546836B (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.)
Information Engineering University of PLA Strategic Support Force
Original Assignee
Information Engineering University of PLA Strategic Support Force
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 Information Engineering University of PLA Strategic Support Force filed Critical Information Engineering University of PLA Strategic Support Force
Priority to CN202210094282.0A priority Critical patent/CN114546836B/zh
Publication of CN114546836A publication Critical patent/CN114546836A/zh
Application granted granted Critical
Publication of CN114546836B publication Critical patent/CN114546836B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

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/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

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

本发明公开一种基于下推自动机引导的公共组件库自动化测试方法及装置,该方法包括:针对二进制公共组件库和使用者程序,采用动态二进制插桩方法进行函数跟踪和信息提取,获取API函数的执行轨迹和元数据,并筛选输出参数和返回值;根据获取的函数执行轨迹、输出参数和返回值分别采用数据依赖分析和控制依赖分析提取数据依赖信息和控制依赖信息;基于下推自动机模型、数据依赖信息和控制依赖信息构建函数路径探索模型,通过函数路径探索模型生成函数调用序列;将上述获取的元数据和函数调用序列合成驱动程序,并进行自动化测试。本发明可以去除源代码的依赖,有效地生成函数调用序列合成驱动程序,并进行自动化测试。

Description

基于下推自动机引导的公共组件库自动化测试方法及装置
技术领域
本发明属于软件安全测试技术领域,尤其涉及一种基于下推自动机引导的公共组件库自动化测试方法及装置。
背景技术
公共组件库是具有良好定义的接口的功能集合,各种独立程序都可以使用由其他开发人员开发的公共组件库的功能。这种特性的重用为计算机科学领域做出了贡献,因为它的实现时间和成本都很低,生产效率很高。但是,公共组件库中的漏洞可能比其他软件中的漏洞更严重,因为它们会影响使用公共组件库的各种程序。因此,需要对公共组件库进行安全测试,例如灰盒模糊测试,以预防先发制人的安全漏洞。但由于公共组件库无法单独运行,需要应用程序对其进行调用,因此对公共组件库进行自动化测试时,需要为公共组件库构建有效的驱动程序(Harness),例如LibFuzzer(Libfuzzer.http://llvm.org/docs/LibFuzzer.html.)对公共组件库进行模糊测试时,就需要安全人员手工编写驱动程序。但这一过程通常需要安全人员深入了解程序的源代码,编写驱动程序过程既耗时又容易出错。首先编写代码对安全人员来说是一项额外的任务,另外如果安全人员对模糊测试不了解则很难编写模糊测试代码。并且安全人员理解库API函数以正确使用它们需要花费大量时间。尤其是对于安全人员来说,编写代码以实现高代码覆盖率是具有挑战性的,因为需要对库有深入的了解。因此实现驱动程序的自动化生成对于提高公共组件库自动化测试技术的有效性和自动化程度是亟待解决的问题。
针对公共组件库代码,驱动程序自动化生成技术首先识别需要调用的目标函数,将应用程序可能调用的所有函数作为目标函数提取到数据库中,然后对目标函数的调用序列进行构建,找到函数的调用路径。接着通过值集推断等方法寻找目标函数的参数,根据上述目标函数、调用序列和函数参数编写驱动程序代码,合成驱动程序。而现有的技术在进行函数调用序列生成时缺乏指导模型,如FUDGE(
Figure BDA0003490225310000011
D,Bucur S,Chen Y,et al.Fudge:fuzz driver generation at scale[C]//Proceedings of the 2019 27th ACM JointMeeting on European Software Engineering Conference and Symposium on theFoundations of Software Engineering.2019:975-985.)采用函数间的依赖关系和抽象语法树进行调用序列的生成,但是缺点是可能调用无效的函数;FuzzGen(Ispoglou K,Austin D,Mohan V,et al.Fuzzgen:Automatic fuzzer generation[C]//29th{USENIX}Security Symposium({USENIX}Security 20).2020:2271-2287.)采用自定义的抽象函数依赖图,利用数据流分析寻找函数调用序列,缺点是抽象函数依赖图的构建依赖于测试用例的质量;而FuzzBuilder(Jang J,Kim H K.FuzzBuilder:automated building greyboxfuzzing environment for C/C++library[C]//Proceedings of the 35th AnnualComputer Security Applications Conference.2019:627-637.)和IntelliGen(Zhang M,Liu J,Ma F,et al.IntelliGen:Automatic Driver Synthesis for Fuzz Testing[C]//2021IEEE/ACM 43rd International Conference on Software Engineering:SoftwareEngineering in Practice(ICSE-SEIP).IEEE,2021:318-327.)将每一个函数作为一个独立的驱动程序,不考虑函数调用序列,缺点是在进行漏洞挖掘时可能会遗漏很多漏洞,产生漏报。
发明内容
本发明针对手工编写驱动程序通常需要安全人员深入了解程序的源代码,编写驱动程序过程既耗时又容易出错;以及现有的自动化驱动程序生成技术在进行函数调用序列生成时缺乏模型指导的问题,提出一种基于下推自动机引导的公共组件库自动化测试方法及装置,可以去除源代码的依赖,有效地生成函数调用序列合成驱动程序,并进行自动化测试。
为了实现上述目的,本发明采用以下技术方案:
本发明一方面提出一种基于下推自动机引导的公共组件库自动化测试方法,包括:
步骤1:针对二进制公共组件库和使用者程序,采用动态二进制插桩方法进行函数跟踪和信息提取,获取API函数的执行轨迹和元数据,并筛选输出参数和返回值;
步骤2:根据获取的函数执行轨迹、输出参数和返回值分别采用数据依赖分析和控制依赖分析提取数据依赖信息和控制依赖信息;
步骤3:基于下推自动机模型、数据依赖信息和控制依赖信息构建函数路径探索模型,通过函数路径探索模型生成函数调用序列;
步骤4:将上述获取的元数据和函数调用序列合成驱动程序,并进行自动化测试。
进一步地,所述步骤1包括:
步骤1.1:采用动态二进制插桩工具DynamoRIO,基于function interposition机制对二进制公共组件库和使用者程序进行插桩,获取API函数的执行轨迹和元数据;
步骤1.2:通过线程ID将不同线程的执行轨迹进行区分,并监控指针指向的内容在进入和退出目标函数前后是否有变化,有变化即为输出参数,以此筛选输出参数和返回值。
进一步地,所述步骤2包括:
步骤2.1:首先定义函数数据依赖关系,并提取数据依赖,将函数f1的输出与函数f2的输入进行对比,如果函数值或函数类型相同,则认为两个函数存在数据依赖关系,如果类型信息一致的情况下两个函数的输出参数和返回值为0,则两个函数不匹配;然后扩大搜索范围,查看函数之间是否有隐藏的数据依赖关系,即如果函数f1的输出参数或返回值是函数f2的输入参数,函数f3的输出参数或返回值也是函数f2的输入参数,而函数f1的输出参数或返回值也是函数f4的输入参数,则推测函数f3的输出参数或返回值是函数f4的输入参数;
步骤2.2:首先通过函数执行轨迹和线程ID、输出参数构造控制流图,将节点代表API函数的单次调用,每条边代表API函数的控制流,将跨函数调用的控制流进行编码,并描述具体的调用信息;然后采用污点分析将整数输出的调用点标记为污点,当间接调用点返回或检查点被污染时,污点传播停止,受污染的调用点被视为间接跳转和call指令跳转,添加到控制流图中;最后将控制流图编码为控制依赖信息,表示函数间调用关系。
进一步地,所述步骤3包括:
步骤3.1:首先对程序中信息构建下推自动机模型,其中节点对应于公共组件库中的一个函数调用,边表示两个函数之间的调用关系,堆栈表示数据依赖信息,提供对函数调用上下文信息的鉴别;
步骤3.2:对调用序列进行提取,将函数f1的输出值与f2的输入值标签组成标签对<OutputValuef1,InputValuef2>压入栈中,与数据依赖关系进行比对,如果OutputValuef1的值和InputValuef2的值相同,则两者存在数据依赖关系,从栈中弹出标签对,并将函数f1和f2的调用序列保存;
步骤3.3:对函数调用序列继续预测,利用数据依赖信息指导下推自动机预测函数调用序列;将函数f1的输出值与f4的输入值标签组成的标签对<OutputValuef4,InputValuef1>压入栈中,和数据依赖关系进行比对,如果f1与f4存在数据依赖关系,从栈中弹出标签对,并将函数f1和f4的调用序列保存。
进一步地,所述步骤4包括:
步骤4.1:首先创建一个空函数LLVMFuzzerTestOneInput(),然后将识别出的函数参数和目标函数在空函数中进行定义,通过函数调用序列进行数据和控制信息的传递,实现公共组件库的相应功能;
步骤4.2:最后对合成的驱动程序代码进行编译生成驱动程序,并利用LibFuzzer模糊测试引擎进行自动化测试。
本发明另一方面提出一种基于下推自动机引导的公共组件库自动化测试装置,包括:
预处理模块,用于针对二进制公共组件库和使用者程序,采用动态二进制插桩方法进行函数跟踪和信息提取,获取API函数的执行轨迹和元数据,并筛选输出参数和返回值;
依赖关系分析模块,用于根据获取的函数执行轨迹、输出参数和返回值分别采用数据依赖分析和控制依赖分析提取数据依赖信息和控制依赖信息;
函数路径探索模型构建模块,用于基于下推自动机模型、数据依赖信息和控制依赖信息构建函数路径探索模型,通过函数路径探索模型生成函数调用序列;
驱动程序合成模块,用于将上述获取的元数据和函数调用序列合成驱动程序,并进行自动化测试。
进一步地,所述预处理模块具体用于:
采用动态二进制插桩工具DynamoRIO,基于function interposition机制对二进制公共组件库和使用者程序进行插桩,获取API函数的执行轨迹和元数据;
通过线程ID将不同线程的执行轨迹进行区分,并监控指针指向的内容在进入和退出目标函数前后是否有变化,有变化即为输出参数,以此筛选输出参数和返回值。
进一步地,所述依赖关系分析模块具体用于:
首先定义函数数据依赖关系,并提取数据依赖,将函数f1的输出与函数f2的输入进行对比,如果函数值或函数类型相同,则认为两个函数存在数据依赖关系,如果类型信息一致的情况下两个函数的输出参数和返回值为0,则两个函数不匹配;然后扩大搜索范围,查看函数之间是否有隐藏的数据依赖关系,即如果函数f1的输出参数或返回值是函数f2的输入参数,函数f3的输出参数或返回值也是函数f2的输入参数,而函数f1的输出参数或返回值也是函数f4的输入参数,则推测函数f3的输出参数或返回值是函数f4的输入参数;
首先通过函数执行轨迹和线程ID、输出参数构造控制流图,将节点代表API函数的单次调用,每条边代表API函数的控制流,将跨函数调用的控制流进行编码,并描述具体的调用信息;然后采用污点分析将整数输出的调用点标记为污点,当间接调用点返回或检查点被污染时,污点传播停止,受污染的调用点被视为间接跳转和call指令跳转,添加到控制流图中;最后将控制流图编码为控制依赖信息,表示函数间调用关系。
进一步地,所述函数路径探索模型构建模块具体用于:
首先对程序中信息构建下推自动机模型,其中节点对应于公共组件库中的一个函数调用,边表示两个函数之间的调用关系,堆栈表示数据依赖信息,提供对函数调用上下文信息的鉴别;
对调用序列进行提取,将函数f1的输出值与f2的输入值标签组成标签对<OutputValuef1,InputValuef2>压入栈中,与数据依赖关系进行比对,如果OutputValuef1的值和InputValuef2的值相同,则两者存在数据依赖关系,从栈中弹出标签对,并将函数f1和f2的调用序列保存;
对函数调用序列继续预测,利用数据依赖信息指导下推自动机预测函数调用序列;将函数f1的输出值与f4的输入值标签组成的标签对<OutputValuef4,InputValuef1>压入栈中,和数据依赖关系进行比对,如果f1与f4存在数据依赖关系,从栈中弹出标签对,并将函数f1和f4的调用序列保存。
进一步地,所述驱动程序合成模块具体用于:
首先创建一个空函数LLVMFuzzerTestOneInput(),然后将识别出的函数参数和目标函数在空函数中进行定义,通过函数调用序列进行数据和控制信息的传递,实现公共组件库的相应功能;
最后对合成的驱动程序代码进行编译生成驱动程序,并利用LibFuzzer模糊测试引擎进行自动化测试。
与现有技术相比,本发明具有的有益效果:
1.本发明面向公共组件库的二进制形式进行分析,不依赖于源代码,并利用使用者程序提取依赖信息,能够获取较为完善的上下文信息。提出了基于下推自动机的函数路径探索模型,自动探索函数调用路径,指导函数调用序列的生成,更加全面的提取函数调用序列。
2.本发明填补了自动化驱动程序生成技术在构建函数调用序列时缺乏模型指导的空白,和其他技术相比能够达到更高的代码覆盖率,并不会带来更大的开销问题,可以与其它模糊测试引擎相结合进行自动化测试。
附图说明
图1为基于下推自动机引导的公共组件库自动化测试方法流程图;
图2为两种hook机制对比图;
图3为数据依赖提取算法图;
图4为控制依赖关系提取流程图;
图5为示例程序与其路径探索模型图;
图6为函数路径探索模型算法图。
具体实施方式
下面结合附图和具体的实施例对本发明做进一步的解释说明:
基于下推自动机引导的公共组件库自动化测试方法及工具具体实现过程描述如下:首先预处理阶段,采用动态二进制插桩方法对多个来源的文件进行分析,跟踪公共组件库的使用者(二进制程序),然后获取API函数的元数据和执行轨迹,所述元数据包括输出参数、返回值、线程ID、函数地址等信息。然后通过依赖关系分析从预处理阶段收集数据依赖和控制依赖关系,数据依赖关系描述API函数调用中参数与返回值之间的潜在依赖关系,包含API函数内部和函数间的依赖关系;控制依赖关系指示如何调用各种API函数,通过生成控制依赖图获取控制依赖信息。然后利用下推自动机模型构建函数调用路径探索模型,通过函数模型生成函数调用序列,并以文本的形式给出。最后根据API目标函数、函数依赖信息和调用序列合成驱动程序,并对其进行自动化测试。整体框架如图1所示。
具体地,一种基于下推自动机引导的公共组件库自动化测试方法,包括如下步骤:
步骤S101:预处理阶段,针对二进制公共组件库和使用者程序,采用动态二进制插桩方法进行函数跟踪和信息提取,获取API函数的执行轨迹和元数据,并筛选输出参数和返回值;
步骤S102:根据获取的函数执行轨迹、输出参数和返回值分别采用数据依赖分析和控制依赖分析提取数据依赖信息和控制依赖信息;
步骤S103:基于下推自动机模型、数据依赖信息和控制依赖信息构建函数路径探索模型,通过函数路径探索模型生成函数调用序列;
步骤S104:将上述获取的元数据和函数调用序列合成驱动程序,并进行自动化测试。
进一步地,步骤S101中,预处理阶段采用动态二进制插桩,输入为二进制公共组件库、公共组件库的使用者(二进制程序)、程序输入,通过动态跟踪获取API函数元数据和执行轨迹。本发明通过基于function interposition机制,使用动态二进制插桩工具DynamoRIO实现对二进制程序进行动态跟踪。
基于function interposition的hook机制的核心是有一个和目标函数具有相同函数签名的hook函数,在程序调用目标函数前使用hook函数接管,退出函数之后也接管。正常情况下程序向目标函数传递参数,然后系统调用目标函数并获取参数,处理结束将返回值返回给目标函数,目标函数将返回值返回给调用程序,如下图2虚线所示。而基于function interposition的hook机制首先使用插桩机制,调用程序将参数传递给hook函数,hook函数执行自身逻辑,然后调用目标函数,并将目标函数的中间数据输入到系统调用中,在调用时就能准确拿到参数值以及返回值,如下图2实线所示。
在获取元数据信息和执行轨迹后,通过线程ID将不同线程的执行轨迹区分开,并监控指针指向的内容在进入和退出目标函数前后是否有变化,有变化即为输出参数,以此筛选输出参数和返回值。
进一步地,步骤S102中,函数跟踪会产生大量的函数跟踪痕迹,其中可能出现无效的函数调用,没有语义联系,需要去除无效的函数调用,另外合成驱动程序最核心的部分是构建API函数调用序列,而函数调用序列主要包含数据依赖和控制依赖信息,因此本发明对数据依赖和控制依赖信息进行提取。
(1)数据依赖关系
如果一个函数的返回值或输出参数和另一个函数的输入参数相匹配或同一类型,则两个函数之间可能存在数据调用关系,即
定义 给定目标函数f1、f2,其输入分别为Inf1、Inf2,输出为Outf1、Outf2,则两个函数f1、f2之间可能存在数据调用关系<f1·f2>:
Figure BDA0003490225310000081
另外针对数据依赖关系识别,本发明定义了几种类型的数据依赖关系:
1)函数f1的输出参数(指针)或返回值是函数f2的输入参数;
2)函数f1的输出参数(指针)或返回值是函数f2的输入参数之一;
3)函数f1的输出参数(指针)或返回值的类型与函数f2的输入参数类型相同;
4)函数f1的输出参数(指针)或返回值是函数f2的输入参数,函数f3的输出参数(指针)或返回值也是函数f2的输入参数,而函数f1的输出参数(指针)或返回值也是函数f4的输入参数,则推测函数f3的输出参数(指针)或返回值是函数f4的输入参数。
在预处理阶段获取元数据和执行轨迹后,需要对数据进行解析获取数据依赖信息,根据上述定义的数据依赖关系结合类型信息和值信息进行数据依赖匹配。首先判断两个函数的输出参数或返回值是否匹配,如依赖关系1)、2),然后查看两个函数的类型信息是否一致(依赖关系3)),如果类型信息一致的情况下两个函数的输出参数和返回值为0,则两个函数不匹配,因为返回值为0无意义。接着扩大搜索范围,查看几个函数之间是否有隐藏的数据依赖关系,对应依赖关系4)。数据依赖关系的提取算法如图3所示。
对于数据依赖信息提取,输入是通过动态二进制插桩获取的函数执行轨迹,输出是利用算法提取的数据依赖关系集合。算法的主要作用是对于跟踪轨迹中的两个函数f1、f2,寻找两个函数相互匹配的输入和输出。如果f2的输入值inf2与函数f1的输出值Outf1相同时,两者存在数据依赖关系,如第7行所示。然后判断f2的输入参数inf2与函数f1的输出参数Outf1是否相同,如果类型相同也认为两者存在数据依赖关系,如第9行所示。并且第12行根据定义的依赖关系4)进行匹配。而当函数的输出值为0时,无法指示两者存在数据依赖关系,将其进行剔除,在第18行显示。
(2)控制依赖关系
数据依赖描述的是API函数调用中输出参数和返回值之间的潜在依赖关系,而控制依赖关系指示如何调用各种API函数,实现对自动化测试驱动程序健壮性的提高。如图4所示,在进行控制依赖提取时,首先通过函数执行轨迹和线程ID、输出参数等构造控制流图,将节点代表API函数的单次调用,每条边代表API函数的控制流,将跨函数调用的控制流进行编码,并描述具体的调用信息。另外采用污点分析将整数输出的调用点标记为污点,当间接调用点返回或检查点被污染时,污点传播停止,受污染的调用点将被视为间接跳转和call指令跳转,添加到控制流图中。最后将控制流图编码为控制依赖信息,表示函数间调用关系。
进一步地,步骤S103中,函数路径探索模型构建阶段,函数调用序列在很大程度上是由程序结构决定的,因此设计路径探索模型的主要目标是研究如何利用程序结构进行函数调用序列的构建。在设计路径探索模型前,要考虑设计的模型必须满足能够正确表示函数调用的关系,并且适用于不同的调用环境,对程序的复杂性具有弹性适用,可以适用于程序的绝大多数执行。因此本发明将路径探索模型需要满足的目标归纳为以下:
(1)有效性
路径探索模型能够正确描述函数调用关系,并给出函数调用序列。
(2)通用性
路径探索模型对程序的复杂性具有弹性,例如在存在虚函数情况下的调用关系。
(3)可扩展性
无论程序执行长度如何,路径探索模型都能有一个有限、可接受的大小。
另外在路径探索模型寻找和预测函数调用序列前,需要满足以下两个假设:
1已知函数ID,路径探索模型可以完全确定每个调用点要调用的函数ID。
2完备性条件,路径探索模型能够捕获程序中所有可能的和正确的函数调用关系。
这两个条件确保了路径探索过程中出现的所有函数调用序列都是路径探索模型所期望的,然而在许多实际案例中由于语言实现、编译器优化和下推自动机构建过程的复杂性,这两个条件并不完全成立,但是对于本发明的理论和实际研究已经足够使用。
针对上述目标,本发明采用下推自动机模型构建函数路径探索模型,首先利用下推自动机理论,在当前状态下,下一个读到的输入符号和栈顶的符号决定了下推自动机的下一个动作。相比于有穷自动机和图灵机模型相比,下推自动机更适合表示路径探索模型。利用下推自动机定义M=(Q,Σ,Γ,δ,q0,F),其中Q状态集表示为公共组件库中所有的函数,Σ输入字母表代表函数名称,Γ栈字母表表示输入参数,δ转移函数表示函数的调用关系,q0表示入口API函数,F接受状态集表示函数调用序列。
节点:下推自动机中每一个节点对应于公共组件库中的一个函数调用,每一个节点都有一个标签<FunctionID,CallSiteID,OutputValue>,其中Function ID表示在该节点调用的函数ID,CallSiteID表示该函数的调用者ID,每一个函数和调用者都分配了唯一的ID。OutputValue表示该函数的输出参数和返回值。一个下推自动机只有一个入口节点和一个终止节点,其没有对应的调用者,只分别表示下推自动机的入口和出口。
边:下推自动机中的边表示两个函数之间的调用关系,在一个下推自动机中,如果在执行中到达节点函数A之后,会在到达其他调用点之前到达节点函数B,则存在一条从节点A到B的有向边。每条边都有一个标签,表示输入参数,用InputValue表示,其为跟踪程序的函数调用提供了便利。
堆栈:路径探索模型中堆栈表示数据依赖信息,提供对函数调用上下文信息的鉴别。当下推自动机从一个节点到下一个节点时,首先按照程序执行轨迹进行游走,并结合数据依赖信息确定下一个节点是否可以到达。将节点的标签值Out putValue与边的标签值InputValue结合压入栈中,与数据依赖信息进行比对,若一致则可以到达下一节点,并弹出堆栈。
为了通过下推自动机追踪公共组件库的函数调用序列,只需让下推自动机在执行中的每个函数调用时转到下一个状态,当执行轨迹和数据依赖信息中没有有关函数调用相关的信息时下推自动机执行到终点状态。首先采用下推自动机在函数节点上进行游走,将输出值OutputValue与下一函数的InputValue构成<Out putValuef1,InputValuef2>,将其压入栈中与数据依赖信息进行比对,如果存在数据依赖关系则出栈,否则释放。出栈之后记录函数节点ID,并进行下一节点游走,循环上述步骤直至遍历所有的函数节点。
在下推自动机遍历完所有的函数执行轨迹后,仍然可能存在一些函数调用序列未被发现,如使用者程序未能调用相关API函数。因此需要利用数据依赖信息指导下推自动机预测函数调用序列。当函数返回参数或返回值与下一函数的输入参数类型一致时,或者当函数满足上述数据依赖关系4)时,即认为两者存在函数调用关系,利用下推自动机为其构建函数调用序列。
如图5中(a)代码片段,其对应的下推自动机模型为图5中(b)所示,当从节点“f1,1”游走到“f1,3”时,节点“f1,1”的标签OutputValue会与边的标签InputValue组成<OutPutValuef11,InputValuef13>,并将其压入栈中,与数据依赖信息进行比对。如果<OutputValueA1,InputValueA3>和数据依赖匹配,则记录此函数调用,并移向下一个节点;如果不匹配则丢弃此节点不可达,换下一个节点。循环上述步骤,最终得到的函数调用序列结果即为{main,f1,f1,f2,f3,f1},{main,f1,f2,f3,f1},{main,f1,f1,f3,f4},……。
因此本发明将路径探索模型形式化表示为如下形式:
定义一个路径探索模型P是一个元组<Q,Σ,Γ,s,f,δ,q0,F>,其中
Q:所有函数调用节点集合;
Σ:函数名称集合;
Γ:输入参数集合;
s:唯一的入口节点;
f:唯一的终止节点;
δ:依赖关系;
q0:入口API函数;
F:函数调用序列。
其中依赖关系δ是一个有限的规则集,对于每一个节点状态r∈(N-f)和输入符号a∈Σ,有一个唯一的规则形式δ(r,a)→T,其中T∈(Q-s-f);并且存在递归调用,能够实现自身循环。函数探索模型的算法如图6所示:
对于路径探索模型,输入是数据依赖关系集合D、控制依赖关系集合C和执行轨迹T,输出是函数调用序列集合S。基于下推自动机,模型首先探索执行轨迹中的函数调用序列,将节点r的输出值与r+1的输入值标签组成标签对<OutputValuer,InputValuer+1>,将其压入栈中与数据依赖关系进行比对,如果OutputValuer的值和InputValuer+1的值相同,则两者存在数据依赖关系,从栈中弹出标签对,并将函数r和r+1的调用序列保存,如算法第6-12行所示。当在执行轨迹中找不到函数调用序列时,模型对函数调用序列进行预测,将函数r-1与r+2组成的标签对<OutputValuer+2,InputValuer-1>压入栈中,和数据依赖关系进行比对,如果r-1与r+2存在数据依赖关系,从栈中弹出标签对,并将函数r-1和r+2的调用序列保存,如算法第22-25行所示。最后连接下推自动机循环进行上述步骤。
进一步地,步骤S104的驱动程序合成阶段,根据上述获取的目标函数元数据、参数和返回值和函数调用序列合成驱动程序。现有自动化驱动程序生成技术基本都采用LibFuzzer作为其模糊测试引擎,因此为了和FuzzGen和IntelliGen进行对比,本发明对合成的驱动程序采用LibFuzzer模糊测试引擎进行自动化测试。首先PD-Ex会创建一个空函数LLVMFuzzerTestOneInput(),然后将识别出的函数参数和目标函数在空函数中进行定义,通过函数调用序列进行数据和控制信息的传递,实现公共组件库的相应功能。最后对合成的驱动程序代码进行编译生成驱动程序并进行模糊测试。
综上所述,本发明针对现有人工编写驱动程序耗时易出错、现有自动化驱动程序生成技术在生成函数调用序列时缺乏模型指导问题,提出一种基于下推自动机引导的公共组件库自动化测试方法,采用下推自动机模型构建函数路径探索模型,自动探索可能的函数调用序列,指导驱动程序的生成。
在上述实施例的基础上,本发明还提出一种基于下推自动机引导的公共组件库自动化测试装置,包括:
预处理模块,用于针对二进制公共组件库和使用者程序,采用动态二进制插桩方法进行函数跟踪和信息提取,获取API函数的执行轨迹和元数据,并筛选输出参数和返回值;
依赖关系分析模块,用于根据获取的函数执行轨迹、输出参数和返回值分别采用数据依赖分析和控制依赖分析提取数据依赖信息和控制依赖信息;
函数路径探索模型构建模块,用于基于下推自动机模型、数据依赖信息和控制依赖信息构建函数路径探索模型,通过函数路径探索模型生成函数调用序列;
驱动程序合成模块,用于将上述获取的元数据和函数调用序列合成驱动程序,并进行自动化测试。
进一步地,所述预处理模块具体用于:
采用动态二进制插桩工具DynamoRIO,基于function interposition机制对二进制公共组件库和使用者程序进行插桩,获取API函数的执行轨迹和元数据;
通过线程ID将不同线程的执行轨迹进行区分,并监控指针指向的内容在进入和退出目标函数前后是否有变化,有变化即为输出参数,以此筛选输出参数和返回值。
进一步地,所述依赖关系分析模块具体用于:
首先定义函数数据依赖关系,并提取数据依赖,将函数f1的输出与函数f2的输入进行对比,如果函数值或函数类型相同,则认为两个函数存在数据依赖关系,如果类型信息一致的情况下两个函数的输出参数和返回值为0,则两个函数不匹配;然后扩大搜索范围,查看函数之间是否有隐藏的数据依赖关系,即如果函数f1的输出参数或返回值是函数f2的输入参数,函数f3的输出参数或返回值也是函数f2的输入参数,而函数f1的输出参数或返回值也是函数f4的输入参数,则推测函数f3的输出参数或返回值是函数f4的输入参数;
首先通过函数执行轨迹和线程ID、输出参数构造控制流图,将节点代表API函数的单次调用,每条边代表API函数的控制流,将跨函数调用的控制流进行编码,并描述具体的调用信息;然后采用污点分析将整数输出的调用点标记为污点,当间接调用点返回或检查点被污染时,污点传播停止,受污染的调用点被视为间接跳转和call指令跳转,添加到控制流图中;最后将控制流图编码为控制依赖信息,表示函数间调用关系。
进一步地,所述函数路径探索模型构建模块具体用于:
首先对程序中信息构建下推自动机模型,其中节点对应于公共组件库中的一个函数调用,边表示两个函数之间的调用关系,堆栈表示数据依赖信息,提供对函数调用上下文信息的鉴别;
对调用序列进行提取,将函数f1的输出值与f2的输入值标签组成标签对<OutputValuef1,InputValuef2>压入栈中,与数据依赖关系进行比对,如果OutputValuef1的值和InputValuef2的值相同,则两者存在数据依赖关系,从栈中弹出标签对,并将函数f1和f2的调用序列保存;
对函数调用序列继续预测,利用数据依赖信息指导下推自动机预测函数调用序列;将函数f1的输出值与f4的输入值标签组成的标签对<OutputValuef4,InputValuef1>压入栈中,和数据依赖关系进行比对,如果f1与f4存在数据依赖关系,从栈中弹出标签对,并将函数f1和f4的调用序列保存。
进一步地,所述驱动程序合成模块具体用于:
首先创建一个空函数LLVMFuzzerTestOneInput(),然后将识别出的函数参数和目标函数在空函数中进行定义,通过函数调用序列进行数据和控制信息的传递,实现公共组件库的相应功能;
最后对合成的驱动程序代码进行编译生成驱动程序,并利用LibFuzzer模糊测试引擎进行自动化测试。
综上,本发明面向公共组件库的二进制形式进行分析,不依赖于源代码,并利用使用者程序提取依赖信息,能够获取较为完善的上下文信息。提出了基于下推自动机的函数路径探索模型,自动探索函数调用路径,指导函数调用序列的生成,更加全面的提取函数调用序列。本发明填补了自动化驱动程序生成技术在构建函数调用序列时缺乏模型指导的空白,和其他技术相比能够达到更高的代码覆盖率,并不会带来更大的开销问题,可以与其它模糊测试引擎相结合进行自动化测试。
以上所示仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (10)

1.一种基于下推自动机引导的公共组件库自动化测试方法,其特征在于,包括:
步骤1:针对二进制公共组件库和使用者程序,采用动态二进制插桩方法进行函数跟踪和信息提取,获取API函数的执行轨迹和元数据,并筛选输出参数和返回值;
步骤2:根据获取的函数执行轨迹、输出参数和返回值分别采用数据依赖分析和控制依赖分析提取数据依赖信息和控制依赖信息;
步骤3:基于下推自动机模型、数据依赖信息和控制依赖信息构建函数路径探索模型,通过函数路径探索模型生成函数调用序列;
步骤4:将上述获取的元数据和函数调用序列合成驱动程序,并进行自动化测试。
2.根据权利要求1所述的基于下推自动机引导的公共组件库自动化测试方法,其特征在于,所述步骤1包括:
步骤1.1:采用动态二进制插桩工具DynamoRIO,基于function interposition机制对二进制公共组件库和使用者程序进行插桩,获取API函数的执行轨迹和元数据;
步骤1.2:通过线程ID将不同线程的执行轨迹进行区分,并监控指针指向的内容在进入和退出目标函数前后是否有变化,有变化即为输出参数,以此筛选输出参数和返回值。
3.根据权利要求1所述的基于下推自动机引导的公共组件库自动化测试方法,其特征在于,所述步骤2包括:
步骤2.1:首先定义函数数据依赖关系,并提取数据依赖,将函数f1的输出与函数f2的输入进行对比,如果函数值或函数类型相同,则认为两个函数存在数据依赖关系,如果类型信息一致的情况下两个函数的输出参数和返回值为0,则两个函数不匹配;然后扩大搜索范围,查看函数之间是否有隐藏的数据依赖关系,即如果函数f1的输出参数或返回值是函数f2的输入参数,函数f3的输出参数或返回值也是函数f2的输入参数,而函数f1的输出参数或返回值也是函数f4的输入参数,则推测函数f3的输出参数或返回值是函数f4的输入参数;
步骤2.2:首先通过函数执行轨迹和线程ID、输出参数构造控制流图,将节点代表API函数的单次调用,每条边代表API函数的控制流,将跨函数调用的控制流进行编码,并描述具体的调用信息;然后采用污点分析将整数输出的调用点标记为污点,当间接调用点返回或检查点被污染时,污点传播停止,受污染的调用点被视为间接跳转和call指令跳转,添加到控制流图中;最后将控制流图编码为控制依赖信息,表示函数间调用关系。
4.根据权利要求1所述的基于下推自动机引导的公共组件库自动化测试方法,其特征在于,所述步骤3包括:
步骤3.1:首先对程序中信息构建下推自动机模型,其中节点对应于公共组件库中的一个函数调用,边表示两个函数之间的调用关系,堆栈表示数据依赖信息,提供对函数调用上下文信息的鉴别;
步骤3.2:对调用序列进行提取,将函数f1的输出值与f2的输入值标签组成标签对<OutputValuef1,InputValuef2>压入栈中,与数据依赖关系进行比对,如果OutputValuef1的值和InputValuef2的值相同,则两者存在数据依赖关系,从栈中弹出标签对,并将函数f1和f2的调用序列保存;
步骤3.3:对函数调用序列继续预测,利用数据依赖信息指导下推自动机预测函数调用序列;将函数f1的输出值与f4的输入值标签组成的标签对<OutputValuef4,InputValuef1>压入栈中,和数据依赖关系进行比对,如果f1与f4存在数据依赖关系,从栈中弹出标签对,并将函数f1和f4的调用序列保存。
5.根据权利要求1所述的基于下推自动机引导的公共组件库自动化测试方法,其特征在于,所述步骤4包括:
步骤4.1:首先创建一个空函数LLVMFuzzerTestOneInput(),然后将识别出的函数参数和目标函数在空函数中进行定义,通过函数调用序列进行数据和控制信息的传递,实现公共组件库的相应功能;
步骤4.2:最后对合成的驱动程序代码进行编译生成驱动程序,并利用LibFuzzer模糊测试引擎进行自动化测试。
6.一种基于下推自动机引导的公共组件库自动化测试装置,其特征在于,包括:
预处理模块,用于针对二进制公共组件库和使用者程序,采用动态二进制插桩方法进行函数跟踪和信息提取,获取API函数的执行轨迹和元数据,并筛选输出参数和返回值;
依赖关系分析模块,用于根据获取的函数执行轨迹、输出参数和返回值分别采用数据依赖分析和控制依赖分析提取数据依赖信息和控制依赖信息;
函数路径探索模型构建模块,用于基于下推自动机模型、数据依赖信息和控制依赖信息构建函数路径探索模型,通过函数路径探索模型生成函数调用序列;
驱动程序合成模块,用于将上述获取的元数据和函数调用序列合成驱动程序,并进行自动化测试。
7.根据权利要求6所述的基于下推自动机引导的公共组件库自动化测试装置,其特征在于,所述预处理模块具体用于:
采用动态二进制插桩工具DynamoRIO,基于function interposition机制对二进制公共组件库和使用者程序进行插桩,获取API函数的执行轨迹和元数据;
通过线程ID将不同线程的执行轨迹进行区分,并监控指针指向的内容在进入和退出目标函数前后是否有变化,有变化即为输出参数,以此筛选输出参数和返回值。
8.根据权利要求6所述的基于下推自动机引导的公共组件库自动化测试装置,其特征在于,所述依赖关系分析模块具体用于:
首先定义函数数据依赖关系,并提取数据依赖,将函数f1的输出与函数f2的输入进行对比,如果函数值或函数类型相同,则认为两个函数存在数据依赖关系,如果类型信息一致的情况下两个函数的输出参数和返回值为0,则两个函数不匹配;然后扩大搜索范围,查看函数之间是否有隐藏的数据依赖关系,即如果函数f1的输出参数或返回值是函数f2的输入参数,函数f3的输出参数或返回值也是函数f2的输入参数,而函数f1的输出参数或返回值也是函数f4的输入参数,则推测函数f3的输出参数或返回值是函数f4的输入参数;
首先通过函数执行轨迹和线程ID、输出参数构造控制流图,将节点代表API函数的单次调用,每条边代表API函数的控制流,将跨函数调用的控制流进行编码,并描述具体的调用信息;然后采用污点分析将整数输出的调用点标记为污点,当间接调用点返回或检查点被污染时,污点传播停止,受污染的调用点被视为间接跳转和call指令跳转,添加到控制流图中;最后将控制流图编码为控制依赖信息,表示函数间调用关系。
9.根据权利要求6所述的基于下推自动机引导的公共组件库自动化测试装置,其特征在于,所述函数路径探索模型构建模块具体用于:
首先对程序中信息构建下推自动机模型,其中节点对应于公共组件库中的一个函数调用,边表示两个函数之间的调用关系,堆栈表示数据依赖信息,提供对函数调用上下文信息的鉴别;
对调用序列进行提取,将函数f1的输出值与f2的输入值标签组成标签对<OutputValuef1,InputValuef2>压入栈中,与数据依赖关系进行比对,如果OutputValuef1的值和InputValuef2的值相同,则两者存在数据依赖关系,从栈中弹出标签对,并将函数f1和f2的调用序列保存;
对函数调用序列继续预测,利用数据依赖信息指导下推自动机预测函数调用序列;将函数f1的输出值与f4的输入值标签组成的标签对<OutputValuef4,InputValuef1>压入栈中,和数据依赖关系进行比对,如果f1与f4存在数据依赖关系,从栈中弹出标签对,并将函数f1和f4的调用序列保存。
10.根据权利要求6所述的基于下推自动机引导的公共组件库自动化测试装置,其特征在于,所述驱动程序合成模块具体用于:
首先创建一个空函数LLVMFuzzerTestOneInput(),然后将识别出的函数参数和目标函数在空函数中进行定义,通过函数调用序列进行数据和控制信息的传递,实现公共组件库的相应功能;
最后对合成的驱动程序代码进行编译生成驱动程序,并利用LibFuzzer模糊测试引擎进行自动化测试。
CN202210094282.0A 2022-01-26 2022-01-26 基于下推自动机引导的公共组件库自动化测试方法及装置 Active CN114546836B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210094282.0A CN114546836B (zh) 2022-01-26 2022-01-26 基于下推自动机引导的公共组件库自动化测试方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210094282.0A CN114546836B (zh) 2022-01-26 2022-01-26 基于下推自动机引导的公共组件库自动化测试方法及装置

Publications (2)

Publication Number Publication Date
CN114546836A true CN114546836A (zh) 2022-05-27
CN114546836B CN114546836B (zh) 2024-06-21

Family

ID=81673627

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210094282.0A Active CN114546836B (zh) 2022-01-26 2022-01-26 基于下推自动机引导的公共组件库自动化测试方法及装置

Country Status (1)

Country Link
CN (1) CN114546836B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115687111A (zh) * 2022-10-27 2023-02-03 中国人民解放军国防科技大学 面向计算机二进制程序的直接比对依赖识别方法与系统

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20110219361A1 (en) * 2010-03-05 2011-09-08 International Business Machines Corporation Correct refactoring of concurrent software
CN108595334A (zh) * 2018-04-27 2018-09-28 刘尚国 一种计算Java程序动态切片的方法、装置及可读存储介质

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20110219361A1 (en) * 2010-03-05 2011-09-08 International Business Machines Corporation Correct refactoring of concurrent software
CN108595334A (zh) * 2018-04-27 2018-09-28 刘尚国 一种计算Java程序动态切片的方法、装置及可读存储介质

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
CHEN H等: ""MOPS: an infrastructure for examining security properties of software"", PROCEEDINGS OF THE 9TH ACM CONFERENCE ON COMPUTER AND COMMUNICATIONS SECURITY, 18 November 2002 (2002-11-18), pages 235 - 244 *
JIWEI YAN 等: "Efficient testing of GUI applications by event sequence reduction", SCIENCE OF COMPUTER PROGRAMMING, 11 August 2020 (2020-08-11), pages 1 - 29 *
尹中旭: "操作系统安全验证形式化分析框架", 计算机工程与科学, 15 March 2009 (2009-03-15), pages 24 - 26 *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115687111A (zh) * 2022-10-27 2023-02-03 中国人民解放军国防科技大学 面向计算机二进制程序的直接比对依赖识别方法与系统
CN115687111B (zh) * 2022-10-27 2024-05-14 中国人民解放军国防科技大学 面向计算机二进制程序的直接比对依赖识别方法与系统

Also Published As

Publication number Publication date
CN114546836B (zh) 2024-06-21

Similar Documents

Publication Publication Date Title
Zhong et al. An empirical study on API usages
Parr et al. Adaptive LL (*) parsing: the power of dynamic analysis
CN100483434C (zh) 病毒识别方法及装置
Kharkar et al. Learning to reduce false positives in analytic bug detectors
Kapdan et al. On the structural code clone detection problem: a survey and software metric based approach
Hague et al. Unboundedness and downward closures of higher-order pushdown automata
CN112131120B (zh) 一种源代码缺陷检测方法及装置
CN112765031B (zh) 一种群智化漏洞挖掘任务的分解方法
CN114996126B (zh) 一种针对eosio智能合约的漏洞检测方法及系统
CN114969755A (zh) 一种跨语言的未知可执行程序二进制漏洞分析方法
CN114546836A (zh) 基于下推自动机引导的公共组件库自动化测试方法及装置
US20230385037A1 (en) Method and system for automated discovery of artificial intelligence (ai)/ machine learning (ml) assets in an enterprise
Bernardi et al. Model checking to improve precision of design pattern instances identification in OO systems
CN114996705B (zh) 基于脆弱性类型和Bi-LSTM的跨软件脆弱性检测方法及系统
CN115310095A (zh) 一种区块链智能合约混合形式化验证方法及系统
Cheng et al. A Comprehensive Review of Learning-based Fuzz Testing Techniques
Jin et al. Current and future research of machine learning based vulnerability detection
Qian et al. Nimbus: Toward speed up function signature recovery via input resizing and multi-task learning
Shao et al. A survey of available information recovery of binary programs based on machine learning
Van Thuy et al. Automated large program repair based on big code
Yan et al. A survey of human-machine collaboration in fuzzing
CN114610320B (zh) 一种基于llvm的变量类型信息修复与比较方法及系统
WO2024214262A1 (ja) 解析機能付与装置、解析機能付与方法及び解析機能付与プログラム
Zhang et al. Propositional projection temporal logic specification mining
JP3531728B2 (ja) オブジェクト指向型プログラミング言語で記述されたプログラムの構成関係管理装置及び方法並びに記憶媒体

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