基于下推自动机引导的公共组件库自动化测试方法及装置制造方法及图纸

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

【技术实现步骤摘要】
Engineering in Practice(ICSE

SEIP).IEEE,2021:318

327.)将每一个函数作为一个独立的驱动程序,不考虑函数调用序列,缺点是在进行漏洞挖掘时可能会遗漏很多漏洞,产生漏报。

技术实现思路

[0004]本专利技术针对手工编写驱动程序通常需要安全人员深入了解程序的源代码,编写驱动程序过程既耗时又容易出错;以及现有的自动化驱动程序生成技术在进行函数调用序列生成时缺乏模型指导的问题,提出一种基于下推自动机引导的公共组件库自动化测试方法及装置,可以去除源代码的依赖,有效地生成函数调用序列合成驱动程序,并进行自动化测试。
[0005]为了实现上述目的,本专利技术采用以下技术方案:
[0006]本专利技术一方面提出一种基于下推自动机引导的公共组件库自动化测试方法,包括:
[0007]步骤1:针对二进制公共组件库和使用者程序,采用动态二进制插桩方法进行函数跟踪和信息提取,获取API函数的执行轨迹和元数据,并筛选输出参数和返回值;
[0008]步骤2:根据获取的函数执行轨迹、输出参数和返回值分别采用数据依赖分析和控制依赖分析提取数据依赖信息和控制依赖信息;
[0009]步骤3:基于下推自动机模型、数据依赖信息和控制依赖信息构建函数路径探索模型,通过函数路径探索模型生成函数调用序列;
[0010]步骤4:将上述获取的元数据和函数调用序列合成驱动程序,并进行自动化测试。
[0011]进一步地,所述步骤1包括:
[0012]步骤1.1:采用动态二进制插桩工具DynamoRIO,基于function interposition机制对二进制公共组件库和使用者程序进行插桩,获取API函数的执行轨迹和元数据;
[0013]步骤1.2:通过线程ID将不同线程的执行轨迹进行区分,并监控指针指向的内容在进入和退出目标函数前后是否有变化,有变化即为输出参数,以此筛选输出参数和返回值。
[0014]进一步地,所述步骤2包括:
[0015]步骤2.1:首先定义函数数据依赖关系,并提取数据依赖,将函数f1的输出与函数f2的输入进行对比,如果函数值或函数类型相同,则认为两个函数存在数据依赖关系,如果类型信息一致的情况下两个函数的输出参数和返回值为0,则两个函数不匹配;然后扩大搜索范围,查看函数之间是否有隐藏的数据依赖关系,即如果函数f1的输出参数或返回值是函数f2的输入参数,函数f3的输出参数或返回值也是函数f2的输入参数,而函数f1的输出参数或返回值也是函数f4的输入参数,则推测函数f3的输出参数或返回值是函数f4的输入参数;
[0016]步骤2.2:首先通过函数执行轨迹和线程ID、输出参数构造控制流图,将节点代表API函数的单次调用,每条边代表API函数的控制流,将跨函数调用的控制流进行编码,并描述具体的调用信息;然后采用污点分析将整数输出的调用点标记为污点,当间接调用点返回或检查点被污染时,污点传播停止,受污染的调用点被视为间接跳转和call指令跳转,添加到控制流图中;最后将控制流图编码为控制依赖信息,表示函数间调用关系。
[0017]进一步地,所述步骤3包括:
[0018]步骤3.1:首先对程序中信息构建下推自动机模型,其中节点对应于公共组件库中的一个函数调用,边表示两个函数之间的调用关系,堆栈表示数据依赖信息,提供对函数调用上下文信息的鉴别;
[0019]步骤3.2:对调用序列进行提取,将函数f1的输出值与f2的输入值标签组成标签对<OutputValuef1,InputValuef2>压入栈中,与数据依赖关系进行比对,如果OutputValuef1的值和InputValuef2的值相同,则两者存在数据依赖关系,从栈中弹出标签对,并将函数f1和f2的调用序列保存;
[0020]步骤3.3:对函数调用序列继续预测,利用数据依赖信息指导下推自动机预测函数调用序列;将函数f1的输出值与f4的输入值标签组成的标签对<OutputValuef4,InputValuef1>压入栈中,和数据依赖关系进行比对,如果f1与f4存在数据依赖关系,从栈中弹出标签对,并将函数f1和f4的调用序列保存。
[0021]进一步地,所述步骤4包括:
[0022]步骤4.1:首先创建一个空函数LLVMFuzzerTestOneInput(),然后将识别出的函数参数和目标函数在空函数中进行定义,通过函数调用序列进行数据和控制信息的传递,实现公共组件库的相应功能;
[0023]步骤4.2:最后对合成的驱动程序代码进行编译生成驱动程序,并利用LibFuzzer模糊测试引擎进行自动化测试。
[0024]本专利技术另一方面提出一种基于下推自动机引导的公共组件库自动化测试装置,包括:
[0025]预处理模块,用于针对二进制公共组件库和使用者程序,采用动态二进制插桩方法进行函数跟踪和信息提取,获取API函数的执行轨迹和元数据,并筛选输出参数和返回值;
[0026]依赖关系分析模块,用于根据获取的函数执行轨迹、输出参数和返回值分别采用数据依赖分析和控制依赖分析提取数据依赖信息和控制依赖信息;
[0027]函数路径探索模型构建模块,用于基于下推自动机模型、数据依赖信息和控制依赖信息构建函数路径探索模型,通过函数路径探索模型生成函数调用序列;
[0028]驱动程序合成模块,用于将上述获取的元数据和函数调用序列合成驱动程序,并进行自动化测试。
[0029]进一步地,所述预处理模块具体用于:
[0030]采用动态二进制插桩工具DynamoRIO,基于function interposition机制对二进制公共组件库和使用者程序进行插桩,获取API函数的执行轨迹和元数据;
[0031]通过线程ID将不同线程的执行轨迹进行区分,并监控指针指向的内容在进入和退出目标函数前后是否有变化,有变化即为输出参数,以此筛选输出参数和返回值。
[0032]进一步地,所述依赖关系分析模块具体用于:
[0033]首先定义函数数据依赖关系,并提取数据依赖,将函数f1的输出与函数f2的输入进行对比,如果函数值或函数类型相同,则认为两个函数存在数据依赖关系,如果类型信息一致的情况下两个函数的输出参数和返回值为0,则两个函数不匹配;然后扩大搜索范围,查看函数之间是否有隐藏的数据依赖关系,即如果函数f1的输出参数或返回值是函数f2的输入参数,函数f3的输出参数或返回值也是函数f2的输入参数,而函数f1的输出参数或返
回值也是函数f4的输入参数,则推测函数f3的输出参数或返回值是函数f4的输入参数;
[0034]首先通过函数执行轨迹和线程ID、输出参数构造控制流图,将节点代表API函数的单次调用,每条边代表API函数的控制流,将跨函数调用的控制流进行编码,并描述具体的调用信息;然后采用污点分析将整数输出的调用点标记为污点,当间接调用点返本文档来自技高网
...

【技术保护点】

【技术特征摘要】
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.一种基于...

【专利技术属性】
技术研发人员:武泽慧宗国笑尹中旭袁会杰魏强周国淼王允超
申请(专利权)人:中国人民解放军战略支援部队信息工程大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1