一种静态分析辅助的符号执行漏洞检测方法

文档序号:8473234阅读:585来源:国知局
一种静态分析辅助的符号执行漏洞检测方法
【技术领域】
[0001]本发明涉及软件漏洞的识别和检测,特别涉及一种基于静态程序分析、对待检测软件进行符号执行实施软件漏洞识别和检测的方法。
【背景技术】
[0002]软件漏洞是一种程序错误,通过利用该错误,攻击者可以潜在地违反受害者计算机系统的安全策略。随着软件规模的不断增加与应用范围的不断扩大,软件漏洞对人们生活与工作的危害也不断增强。因此,如何高效地检测并验证软件漏洞成为软件开发与测试人员的关注焦点。符号执行技术是常用的漏洞检测技术,可以遍历整个目标程序并为每条程序路径产生一个测试样例以验证路径的可达性及安全性。但是,符号执行会在漏洞无关的路径上浪费大量的计算时间和资源,限制了漏洞检测的效率。而且,在计算时间或者资源有限的情况下,对漏洞无关路径的探索也会降低漏洞检测的精度,使漏报率增加。
[0003]为此,本发明提出了一种静态分析辅助的符号执行漏洞检测方法。首先,对目标程序进行快速、高效的静态分析,获得漏洞相关的程序控制流信息;之后,使用获得的控制流信息辅助符号执行漏洞检测以降低符号执行漏洞检测的时间与空间开销,提高漏洞检测的效率。本发明通过将静态程序分析与符号执行技术相结合,提高了漏洞检测效率与精度,在时间和资源有限的情况下,能够检测到更多的漏洞。

【发明内容】

[0004]本发明目的是,为了能够高效快速地检测并验证软件漏洞,提供了一种静态分析辅助的符号执行漏洞检测方法。通过静态分析快速获得漏洞相关的控制流信息并对程序分支按照后续子程序中的漏洞相关路径占总路径的比例进行打分;在之后符号执行过程中,使用静态分析得到的控制流信息将符号执行过程约束在漏洞相关路径上,并按照静态分析得到的分支打分优先分析漏洞相关路径比例更高的程序分支。通过该方法减少浪费在漏洞无关路径上的计算时间和资源,提高符号执行漏洞检测的效率,进一步地,在时间和资源有限的情况下,检测到更多的漏洞。
[0005]为实现上述目的,本发明采取如下技术方案:一种静态分析辅助的符号执行漏洞检测方法,包括轻量级符号执行、图生成、静态分析和符号执行等阶段;
[0006]I)轻量级符号执行阶段,使用KLEE符号执行工具以简单的符号化策略在很小的时间开销下对目标程序字节码文件进行符号执行以获得完成链接过程后的完整程序的字节码;轻量级符号执行过程使用符号执行工具KLEE对目标程序字节码进行符号执行得到链接后的完整程序字节码,符号化策略为:-sym-args I I 2,即I个长度为I个字节的符号作为程序输入;
[0007]2)图生成阶段,在完整程序的字节码的基础上,通过使用LLVM 3.1工具集中的opt工具生成完整程序的函数调用图与各个函数的控制流图;生成的函数调用图中包括两类语句:函数描述语句与函数调用关系描述语句;函数描述语句中包括了函数调用图中出现的所有函数的函数名与函数编号;函数调用关系描述语句则描述了所有函数之间的调用关系;函数的控制流图中包含两类语句:基本块描述语句与基本块间关系描述语句;基本块描述语句描述了函数中每个基本块的基本块编号,基本块标签和基本块包含的指令,特别地,如果该基本块的最后一条语句是条件分支指令,基本块描述语句中还会包含跳转到各个分支的条件取值;基本块间关系描述语句则描述了所有基本块之间的前驱与后继关系;
[0008]3)静态分析阶段,以完整程序的函数调用图、各个函数的控制流图以及配置文件作为输入,通过程序模块预处理、敏感相关函数和敏感导向函数识别、有效跳转收集与分支打分四个过程对程序进行静态分析,定位敏感函数位置,收集程序分支语句中能够导向敏感操作的有效跳转并以后续子程序中敏感操作相关路径占总路径的比例为标准对程序分支进行打分,得到有效跳转表与分支打分表;其中,函数识别过程包含两个子过程:敏感相关函数识别与敏感导向函数识别;
[0009]4)符号执行等阶段,使用有效跳转表与分支打分表辅助漏洞检测符号执行,输入为目标程序的字节码文件、配置文件以及静态分析阶段得到的有效跳转表和分支打分表;在具体实施中,符号执行部分在KLEE符号执行工具的基础上在指令执行过程中添加了静态辅助方法并增加了基于后续子程序中敏感操作相关路径比例的分支选择过程;当检测到敏感操作时,使用约束求解器STP求解当前执行环境下敏感操作能否违反安全约束,如果有解,则表示该敏感操作是可利用的安全漏洞,返回对应的测试样例给用户;
[0010]5)本方法的关键操作如下:
[0011](I)程序模块预处理,通过分析目标程序的函数调用图和各个函数的控制流图对静态分析阶段的程序模块进行预处理,为静态分析中的后续过程提供分析的对象;
[0012](2)敏感相关函数识别,将所有包含敏感操作的函数标记为敏感相关函数,并将所有调用敏感相关函数的函数标记为敏感相关函数;
[0013](3)敏感导向函数识别,将所有在执行完成返回后依然存在敏感操作或敏感相关函数调用操作的函数标记为敏感导向函数;
[0014](4)有效跳转收集,在敏感相关且非敏感导向的函数中收集能够导向敏感操作的分支条件取值到有效跳转表中;
[0015](5)分支打分,按照后续子程序中敏感操作相关路径占总路径的比例对程序中的每个分支进行打分,将分数记录在分支打分表中;
[0016](6)漏洞检测符号执行,使用有效跳转和分支打分辅助符号执行,探索敏感操作相关路径检测敏感操作是否能够违反安全约束,并优先探索敏感操作相关路径比例高的程序分支;
[0017]6)在符号执行工具KLEE的基础上修改了指令执行部分,添加了基于敏感操作相关路径比例的分支选择部分;在指令执行部分,通过有效跳转表将符号执行过程限制在敏感操作相关路径范围内,并对敏感操作按照配置文件中的安全约束进行检查,如果在执行环境下敏感操作能够违反安全约束,则表示该敏感操作是可利用的安全漏洞,返回对应的测试样例给用户;在分支选择部分,以分支打分表中各个分支的分数为标准,选择敏感操作相关路径比例最高的分支作为下一次符号执行路径探索的目标,进一步加快探索敏感操作的速度。
[0018]程序模块预处理流程:以完整程序的函数调用图和控制流图为输入,预处理静态分析中的程序模块,静态分析中后续的函数识别、有效跳转收集和分支打分都是在程序模块的基础上分析得到的;使用程序模块来表示当前正在静态分析的程序;程序模块中包括如下数据结构:函数链表,以链表的形式存储了该程序模块中所有函数的指针;敏感相关函数链表,以链表的形式存储了程序模块中所有被标记为敏感相关的函数的指针;敏感导向函数链表,以链表的形式存储了程序模块中所有被标记为敏感导向的函数的指针;有效跳转表,以集合的形式存储了函数模块中的有效跳转,集合中的元组〈funct1n, instruct1n, condit1n)表不指令 instruct1n 是函数 funct1n 中的分支指令,且如果分支条件取值为condit1n就能够导向敏感操作;分支分数表,以哈希表的形式存储了程序模块中分支的分数,表中元组〈funct1n, instruct1n, score〉表示指令instruct1n是函数funct1n中某个基本块的起始指令且以该指令为起始指令的分支分数为score ;目标操作集合,以集合的形式存储检测过程中的目标操作;敏感操作及安全约束表,以哈希表的形式存储用户定义的敏感操作和每个敏感操作对应的安全约束,如果在所处的执行环境下敏感操作能够违反安全约束,则该敏感操作被认为是可触发的程序漏洞;对于程序模块中的函数,包含如下数据结构:函数名;函数编号;调用者函数链表,以链表的形式存储所有调用该函数的函数指针;调用函数链表,以链表的形式存储所有被该函数调用的函数的指针;基本块链表,以链表的形式存储该函数中基本块的指针;函数中的基本块,包含如下的数据结构:基本块编号;基本块标签;指令链表,以链表的形式存储基本块中的指令;前驱基本块链表,以链表的形式存储该基本块所有前驱基本块的指针;后继基本块链表,以链表的形式存储该基本块所有的后继基本块指针。
[0019]本发明的有益效果是,将静态程序分析与符号执行技术相结合,通过静态程序分析,收集程序分支语句中能够导向敏感操作相关路径的条件取值,并依据后续程序中敏感操作相关路径占总路径的比例对程序分支进行打分。后续的符号执行过程在静态分析结果的
当前第1页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1