一种支持多维数组的符号执行方法及漏洞检测系统与流程

文档序号:23589867发布日期:2021-01-08 14:25阅读:70来源:国知局
一种支持多维数组的符号执行方法及漏洞检测系统与流程

本发明涉及符号执行技术领域,尤其涉及一种支持多维数组的符号执行方法及漏洞检测系统。



背景技术:

符号执行是一种程序分析技术,它可以通过分析程序来得到让特定代码区域执行的输入。使用符号执行分析一个程序时,该程序会使用符号值作为输入,而非一般执行程序时使用的具体值。在到达目标代码时,分析器可以得到相应的路径约束,然后通过约束求解器来得到可以触发目标代码的具体值。

对于简单程序,静态符号执行即可完成全部动作,而当程序规模大或复杂时,复杂数据结构成为符号执行的一个重要问题。通常对于复杂数据结构通过懒初始化进行处理,针对指针可以使用。但当复杂数据结构为多维数组的符号化索引时,该如何初始化以及初始化为多大的数组,同时因为非确定的初始化结果导致的程序误报或运行错误成为当前需要解决的问题。



技术实现要素:

本发明所要解决的技术问题是:克服现有技术存在的上述缺陷,提供一种支持多维数组的符号执行方法及漏洞检测系统,优化对多维数组中符号化索引的初始化。

本发明的技术解决方案是:提供一种支持多维数组的符号执行方法,其特征在于,包含以下步骤:

s1:程序输入值分析,确定是否为复杂数据结构的符号处理,若是复杂数据结构,则对复杂数据结构采用懒初始化方法进行处理,反之,则对输入数据采用静态符号执行进行处理;

s2:懒初始化复杂数据结构时,依据手动设置及程序执行过程中的自动调整,获取最佳固定长度值,利用该最佳固定长度值初始化复杂数据结构;

s3:在访问复杂数据结构的数据时,判断访问偏移量是否有效;若偏移量有效,则指针调用初始化为已有数据类型的最佳固定长度数据,并获取访问的符号数据;若偏移量无效,则访问越界;

s4:依据访问结果进行程序分析,调用约束求解器对路径条件的可满足性进行求解,判断各程序路径的可行性,产生对应路径的输入;

s5:调用程序计数器,触发计算目标代码的具体值。

优选的,所述最佳固定长度值在首次初始化时为30,在程序运行过程中,通过固定值调优函数,逐步自增,获取内存范围内有效数据长度值。

优选的,所述复杂数据结构保存在堆中。

优选的,所述复杂数据结构为多维数组。

优选的,所述多维数组中存放符号化索引。

优选的,所述访问偏移量为访问的指针引用相对于多维数组基地址的偏移量,有效访问偏移量值大于0且小于最佳固定长度值,无效访问偏移量值小于0或大于最佳固定长度值。

优选的,所述最佳固定长度值可在多次访问时使用。

优选的,所述符号化索引在初始化多维数组时即直接符号化全部可能的成员。

另一方面,本发明还提供一种支持多维数组的符号执行漏洞检测系统,基于其上任一项所述的一种支持多维数组的符号执行方法,所述符号执行漏洞检测系统包含程序指令分析模块、参数分析模块、符号执行模块及漏洞测试模块,其中:

程序指令分析模块接收用户输入的指令及数据,对用户输入进行处理并传递测试参数给参数分析模块;

参数分析模块接收程序指令分析模块输入的测试参数,处理测试参数,将符号化的测试参数传递给符号执行模块;

符号执行模块接收参数分析模块发送的符号化的测试参数,依据符号化的测试参数进行符号化执行,对路径条件的可满足性进行求解及判断,将路径求解结果传递给漏洞测试模块;

漏洞测试模块接收符号执行模块传递的路径求解结果,对各条路径的具体目标代码进行执行,并得出测试结果。

本发明产生的有益效果是:本发明自主研发了一种支持多维数组的符号执行方法及漏洞检测系统。在程序规模较大或复杂时,复杂数据结构成为符号执行需要面临的问题,而复杂数据结构保存在堆中,懒初始化成为复杂堆数据结构的常用方法。但对于数组和数组符号化索引,懒初始化无法解决初始化数组大小的问题。本发明通过在懒初始化过程中,通过手动配置及程序自动调整,逐步确定初始化数组大小,符号化时通过判断指针偏移量的有效性,减少了符号执行过程中的误报,同时通过求解空间限制,保证了符号执行的实际可行性。

附图说明

图1为本发明提供的一种支持多维数组的符号执行方法的流程图;

图2为本发明提供的一种支持多维数组的符号执行漏洞检测系统的结构框图。

具体实施方式

为使本领域技术人员更加清楚和明确本发明的技术方案,下面结合实施例及附图对本发明作进一步详细的描述,需要说明的是,在不冲突的情况下,本申请的实施例及实施例中的特征可以相互结合。

参见图1,图1为本实施例提供的一种支持多维数组的符号执行方法流程图,该方法包含五个步骤。

s1:程序输入值分析,确定是否复杂数据结构的符号处理,若是,则对复杂数据结构采用懒初始化方法进行处理,反之,则对输入数据采用静态符号执行进行处理。其中复杂数据结构指结构体、线性链表、队列、树等,复杂数据结构一般保存在堆中。

s2:懒初始化复杂数据结构时,依据手动设置及程序执行过程中的自动调整,获取最佳固定长度值,利用该最佳固定长度值初始化复杂数据结构;需要说明的是,该最佳固定长度值可以在多次访问中被重复使用。

以二维数组为例,给定函数func(structa,*a),其中,struct表示结构体,结构体a具有一个int型的指针变量p,该指针在访问二维数组数据时用到;定义默认设置固定长度值n=30,其中30为初始值,定义变量i,j;若i,j为具体值,第一次访问a[i]时,实例化默认的n个结构体a数组;下一次访问a[i][j]时,继续为a[i]分配n个int成员。

s3:在访问复杂数据结构为多维数组的数据时,若偏移量有效,则指针调用初始化为已有数据类型的最佳固定长度数据,并获取访问的符号数据;若偏移量无效,则访问越界;优选地,步骤s3通过引用指针与多维数组基地址的比对判断偏移量是否有效。该步骤其实现逻辑如下:

若f未初始化{

若f为t类型的指针引用

若存在以f为基地址,偏移量大于0的访问

{

将f非确定化地初始化为

1.null

2.一个t类型的固定大小为n的数组

3.一个已有的t类型数组

若某性质成立的谓词不成立

回溯做其余选择

}否则{

将f非确定化地初始化为

1.null

2.一个t类型的对象

3.一个已有的t类型对象

若某性质成立的谓词不成立

回溯做其余选择

}

若f为原始类型或字符串

将f初始化为对应类型的符号值

}

以访问二维数组为例,分别考虑i>=n或i<0、0<i<n两种情况,第一种情况,访问报越界错误,第二情况下则初始化所有a[0].p、a[1].p…a[n].p。

判断本次访问越界后,若i>=n且i值在初始化内存大小范围内,可设定n的可能最大值为1000,程序自动对固定长度值n通过固定长度调优函数进行自增调整,获取一个较优固定长度值,作为下一步最佳固定长度值,返回s2继续执行;若i<0或i>1000,退出程序。

s4:依据访问结果进行程序分析,调用约束求解器对路径条件的可满足性进行求解,判断各程序路径的可行性,产生对应路径的输入;

当路径条件满足时,说明所对应的程序路径可行,产生该路径的输入,如果路径条件不可满足,则说明所对应的程序路径不可行,终止对该路径的分析。当某条路径到达终点或遇到bug时,终止对路径的分析并得到相应路径的路径约束。

s5:调用程序计数器,触发计算目标代码的具体值。

参见图2,图2为本实施例提供的一种支持多维数组的符号执行系统,包含程序指令分析模块、参数分析模块、符号执行模块及测试模块。其中:

程序指令分析模块接收用户输入的指令及数据,对用户输入进行处理并传递测试参数给参数分析模块;

参数分析模块接收程序指令分析模块输入的测试参数,处理测试参数,将符号化的测试参数传递给符号执行模块;

符号执行模块接收参数分析模块发送的符号化的测试参数,依据符号化的测试参数进行符号化执行,对路径条件的可满足性进行求解及判断,将路径求解结果传递给漏洞测试模块;

漏洞测试模块接收符号执行模块传递的路径求解结果,对各条路径的具体目标代码进行执行,并得出测试结果。

综上所述,本发明通过在懒初始化过程中,通过手动配置及程序自动调整,逐步确定初始化数组大小,符号化时通过判断指针偏移量的有效性,减少了符号执行过程中的误报,同时通过求解空间限制,保证了符号执行的实际可行性。

以上对本发明所提供的一种支持多维数组的符号执行方法及漏洞检测系统进行了详细介绍,并通过实施例对本发明的具体原理及实施方式进行了阐述,这些说明只是用于帮助理解本发明的核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也属于本发明权利要求的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1