基于智能路径引导的敏感点逼近方法

文档序号:9727260阅读:567来源:国知局
基于智能路径引导的敏感点逼近方法
【技术领域】
[0001] 本发明涉及漏洞挖掘和信息安全技术领域,特别涉及一种基于智能路径引导的敏 感点逼近方法。
【背景技术】
[0002] 动态数据流分析是研究与发现软件漏洞的有效手段,其中动态污点分析技术的使 用最为突出。动态污点分析从软件安全漏洞利用的本质出发,标记外部输入为污点数据,跟 踪污点数据在内存中的扩散过程,检测程序是否非法使用污点数据,譬如覆盖栈中返回地 址,作为EIP的值等等。动态污点分析技术广泛运用于软件回归测试、软件脆弱性分析、网络 渗透攻击检测分析等领域中。由于其抓住了软件安全漏洞利用的实质,无论安全漏洞是否 已经公开,该检测技术在原理上都是行之有效的。但是如何高效地进行动态污点分析是软 件分析中的重要问题。为解决测试案例集覆盖率低下的问题,目前研究的热点是将程序抽 象为形式化模型,采用测试案例自动生成算法对形式化模型中的各种信息进行提取、生成 一个完备的测试案例集,其中最常用的方法是符号执行。符号执行是一种基于符号化的模 型检验方法,广泛用于符号调试,测试案例生成等。其核心思想是使用符号值代替具体的变 量输入,并使用符号表达式来表示程序中各变量的值。最终,程序的输出值被转化为一个以 符号值作为输入的函数。符号执行将程序抽象为符号执行树,其中顺序语句对应着树的计 算节点,分支语句对应着分支节点,而对于循环语句,将其按循环次数展开为语义上等价的 分支语句。一般,一条循环语句对应一组分支节点。可以认为,在符号执行过程中,程序只有 顺序和分支两种结构。符号执行的过程本质上是路径条件的构造过程。路径条件指的是对 于执行该路径的测试案例,程序输入值所需要满足的数学约束条件。因而一个路径条件唯 一地对应一条执行路径。一个路径条件由一组子条件(sub-condi t ion)组成,每一个被执行 分支的条件作为一个子条件。在初始时路径条件为true,在探索程序的过程中,每遇到一个 分支语句,就更新路径条件,将被执行分支的条件加入到路径条件中,公式为PC = PC~new sub-condition。由于每一个分支语句都对应着true和false两个分支,而符号执行基于静 态分析,变量没有具体的数值,因而无法确定执行哪一条分支。所以对两条分支都进行探索 (搜索顺序可按需定义,深度优先,广度优先等),即分别以两个分支的条件作为子条件来更 新路径条件。这样就得到了两个新的路径条件,对应两条不同的执行路径。之后,继续对这 两条路径分别进行探索。符号执行实现了对程序的全路径探索。当程序探索结束时就得到 了被测程序所有执行路径的路径条件。最后,检查所有得到的路径条件,如果路径条件是无 法被满足的,则说明该路径是一条不可执行路径,如果路径条件可以被满足,则说明该路径 是一条可执行路径。将路径条件输入约束求解器即可解出对应的测试案例。
[0003]但是现阶段符号执行的使用仍存在一定阻碍,使得其难以大规模使用。首先符号 执行是一种基于搜索的遍历算法,需要对程序的所有分支进行遍历,虽然可以通过一些附 加的剪枝条件进行优化,但其算法的复杂度非常高,为〇(2 n),其中η为被测程序中分支点的 数目,导致路径爆炸,测试的效率就受到较大影响。其次针对二进制代码,由于其缺乏包含 语义和语法的类型信息。使得对其的污点分析污染源往往是外部输入的比特流,只能按字 节等内存操作数的粒度来定义污点数据;同样地,对于符号执行来说,对输入数据的符号化 也将针对字节粒度等。这不仅增加了技术实现的复杂性,也会使得符号执行得到的符号表 达式往往非常庞大、冗余很多,由此得到的路径条件往往相当复杂或难于求解。

【发明内容】

[0004] 针对现有技术中的不足,本发明提供一种基于智能路径引导的敏感点逼近方法, 根据漏洞模型识别出可疑漏洞位置,有效缓解路径爆炸问题,提高漏洞挖掘的效率。
[0005] 按照本发明所提供的设计方案,一种基于智能路径引导的敏感点逼近方法,包含 如下步骤:
[0006] 步骤1.标记敏感点,提取不同类型的漏洞模型,通过静态分析,识别出可疑的漏洞 位置,标记为敏感点;
[0007] 步骤2.以敏感点为起点,采用路径回溯算法向上回溯,查找所有路径分支点,找到 跳转指令地址,直至回溯到离程序入口点最近的路径分支点,将所有的路径分支点放入可 达路径集合T = ( tl,t2 . . . tm);
[0008] 步骤3.对被测程序进行指令级插粧,输入初始样本,记录与污点有关的二进制指 令序列;
[0009] 步骤4.将二进制指令序列提升为中间语言描述;
[0010] 步骤5.获得中间语言描述的路径分支点P=(P1,P2. . .pn),第一个分支点pi肯定在 集合T= (tl,t2. . . tm)中,并且pi = tl,根据分支点是否位于集合T中,对分支点进行翻转,弓| 导控制流抵达敏感点,若PleT且巧+1 g 7(l<i<n),则将中间语言描述中的分支点?1进行 翻转,若PieT且pi+1 eT( 1 < i <n),则不改变分支点,找到不在集合T中的分支点,若所有分 支点都在集合T中,说明控制流已抵达敏感点,算法结束,否则,进入步骤6;
[0011] 步骤6.从翻转后的中间语言描述中提取约束范式,使用STP约束求解器进行求解, 产生新的样本,回到步骤3,重新输入样本。
[0012]上述的,步骤2具体包含如下内容:
[0013]步骤2.1、将敏感点位置记为A,建立队列LI、L2,并初始化为空;
[0014] 步骤2.2、获取厶的交叉引用以1^~)=汽4),(41,六2-_)表示交叉引用结果的集 合,判断集合中元素的个数N,若N为0,执行步骤2.5;若N为1,执行步骤2.3;若大于1,则执行 步骤2.4;
[0015] 步骤2.3、获取元素对应的汇编指令,若为跳转指令,则判断元素是否存在于最终 结果集合RES中,若不存在,则保存到最终结果集合RES中;若存在,则不保存,将元素位置设 为A,执行步骤2.2;
[0016] 步骤2.4、获取元素对应的汇编指令,若为跳转指令,则判断元素是否存在于最终 结果集合RES中,若不存在,则保存到最终结果集合RES中;若存在,则不保存,并判断元素是 否在L1或者L2中,不在的元素结果入队L2;
[0017] 步骤2.5、获取队列L2队头,位置设为A,将A入队L1,执行步骤2.2,并判断队列L2, 若队列L2为空,则算法结束。
[0018] 上述的,所述步骤5中根据分支点是否位于集合T中,对分支点进行翻转,引导控制 流抵达敏感点,具体包含如下内容:
[0019] 步骤5.1、输入当前分析的路径分支点序号i,查找指定分支点,包括路径分支点pi 的相对地址和模块名称,逐行扫描中间语言描述文件,计算出指定路径分支点序号i的程序 分支点的相对地址和所在模块名称;
[0020] 步骤5.2、查询集合T,判断路径分支点pi相对地址是否在集合T中,若pi相对地址 不在集合T中或pi为当前路径最后分支点,则算法结束,否则进入步骤5.3;
[0021] 步骤5.3、查询集合1',判断路径分支点?1 + 1相对地址是否在集合1'中,若?1+1相对 地址不在集合T中,则将分支点pi翻转,得到翻转后的中间语言文件,否则,进入步骤5.4; [0022]步骤5.4、不翻转当前路径分支点pi,i递增1,将当前分析的路径分支点切换为下 一个,跳转步骤5.1执行。
[0023]上述的,所述步骤5.1中,查找指定分支点,包括路径分支点pi的相对地址和模块 名称,逐行扫描中间语言描述文件,计算出指定路径分支点序号i的程序分支点的相对地址 和所在模块名称,具体包含如下步骤:
[0024] 步骤5 · 1 · 1、打开中间语言描述文件,设置bool型变量found为false;
[0025] 步骤5.1.2、判断是否到达文件终止处,若是,则跳转至步骤5.1.8,否则,读取一行 文件内容到字符串line中,备份读取该行前的文件指针值到curposl,备份读取该行后的文 件指针值到curpos2;
[0026] 步骤5.1.3、判断line中保存的内容是否是assert语句所在行内容,若是,贝1J进入 步骤5.1.4,否则,跳转至步骤5.1.6执行;
[0027] 步骤5.1.4、判断该assert语句对应的分支点深度是否等于i,若是,则将found变 量赋值为true,并进入步骤5.1.5,否则,跳转至步骤5.1.2执行;
[0028]步骤5.1.5、利用curpos 1读取上一行的内容,使用字符串截取出内容中该分支点 指令的绝对地址addr,跳转至步骤5.1.2执行;
[0029] 步骤5.1.6、通过字符串比较操作,判断line中保存的内容是否是loaded module 所在行内容,若是,则进入步骤5.1.7,否则,跳转至步骤5.1.2执行;
[0030]步骤5. 1.7、截取出模块名称、模块低地址和模块高地址,存放于结构体数组 module中,跳转至步骤5.1.2执行;
[0031] 步骤
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1