基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法

文档序号:8412809阅读:744来源:国知局
基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法
【技术领域】
[0001] 本发明涉及一种基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法,该方法 能够运用于漏洞检测以及安全审计,代替人工自动验证静态分析缓冲区溢出漏洞的结果等 方向,属于软件测试技术应用领域。
【背景技术】
[0002] 软件安全是使软件在受到恶意攻击的情形下仍能够继续保证功能性正确及确保 软件被在授权范围内合法使用。然而由于软件开发者开发软件时的疏忽或者编程语言的局 限性,软件中常常存在潜在的漏洞。这些漏洞能够极大削弱软件安全性,一旦被攻击者利用 会造成非常严重的后果,缓冲区溢出漏洞是软件漏洞中十分常见的一种。
[0003] 缓冲区溢出漏洞指的是通过往程序的缓冲区写超出其长度的内容,造成缓冲区的 溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令。缓冲区溢出攻击可 以导致程序运行失败、系统关机、重新启动,或者执行攻击者的指令,比如非法提升权限,可 能造成十分严重的后果。
[0004] 目前存在动态测试和静态分析两种手段来发现程序中的缓冲区溢出漏洞,动态测 试通过编写测试用例运行不同的程序路径,分析是否能够触发潜在漏洞。动态分析的缺点 十分明显,需要软件测试人员设计精巧的测试用例,而测试用例一旦设计的不够完善,会导 致漏洞无法被检测到。静态分析指的是不运行程序,匹配事先设定的缓冲区溢出模型或者 特征,静态漏洞测试转换为特征匹配问题。由于漏洞可能发生在某条特定的路径中,所以静 态分析技术往往是路径相关的,分析的结果可能会给出一条不完整的路径片段。静态分析 工具为了保证分析结果的准确性而产生了大量的警报,这些警报绝大部分是冗余的,只包 含了小部分真正漏洞。真正在使用这些工具的过程中,需要安全审计人员手工检查上述缓 冲区溢出警报,编写测试用例覆盖静态分析产生的路径,以分析该路径是否存在缓冲区溢 出的可能,从而耗费大量时间和精力。
[0005] 符号执行技术是一种计算机以符号推倒的方式来模拟程序实际执行的执行,最早 提出于1976年,其基本思想是用符号代替实际输入,在执行过程中,遇到分支则复制已有 的环境信息,收集相关约束执行到程序出口或发现错误时,根据收集到的约束条件求解,产 生测试用例。

【发明内容】

[0006] 技术问题:本发明提出了一种基于符号执行路径剪枝的缓冲区溢出漏洞自动检测 方法,首先通过漏洞特征匹配等静态分析手段得到溢出漏洞疑似路径,静态分析高效方便 但是存在大量误报,然后通过符号执行验证静态缓冲区溢出分析的漏洞疑似路径,在执行 过程中构建缓冲区溢出漏洞模型验证该路径是否存在对应的测试用例能够触发以达到消 除误报精化结果的目的。同时符号执行存在状态爆炸的问题,本发明也解决如何利用静态 分析的结果引导符号执行的方向,避免执行无用路径的执行。
[0007] 技术方案:本发明提出的基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法 结合了动态测试和静态分析的特点,解决了这两种手段目前存在的不足,本方法主要分为 两步:通过漏洞特征匹配等静态分析手段得到溢出漏洞疑似路径,这些路径存在大量误报, 然后使用状态空间缩减,路径剪枝的符号执行技术验证静态缓冲区溢出分析的漏洞疑似路 径。符号执行用于在测试过程中覆盖尽可能多的程序路径,通过引导符号执行的过程,使其 只执行潜在可能触发缓冲区溢出漏洞的路径,通过构建缓冲区溢出模型来自动验证该路径 是否安全。
[0008] 符号执行技术的基本思想是用符号代替实际输入,在执行过程中,遇到分支则复 制已有的环境信息,收集相关约束执行到程序出口或发现错误时,根据收集到的约束条件 求解,产生测试用例。传统的符号执行技术用于提高测试是程序的覆盖度以及内存相关的 漏洞检测,我们将符号执行导向某些特定的方向,并将漏洞疑似位置点处的漏洞溢出条件 加入整条路径的约束条件中,在该程序位置点处进行缓冲区溢出漏洞与路径约束求解,可 通过对约束解的值的分析高效检验缓冲区溢出漏洞是否会发生,重复上述步骤完成缓冲区 溢出漏洞的自动检测。
[0009] 面向缓冲区溢出误报检测的路径剪枝符号执行方法基本步骤如下:
[0010] 步骤1 :程序源码漏洞特征匹配
[0011] 扫描程序源代码,匹配源代码中缓冲区溢出漏洞,用可扩展标记语言存储缓冲区 溢出漏洞疑似路径,一条漏洞路径由多个程序位置点组成,一个程序位置点由程序的行号 位置以及该位置所属于的文件名所唯一标识,漏洞路径的起始点和结束点分别表示缓冲区 的内存分配语句和缓冲区溢出语句,位于起始点和结束点的位置点代表该缓冲区相关的操 作语句;
[0012] 步骤2 :搜索基本块路径
[0013] 为待测试的程序或者系统构建控制流图,所谓控制流图是一个有向图,控制流图 中每个节点代表一个基本块,程序中的每个语句都对应图中的一个节点,控制流在离开基 本块之前不会跳转或者停机;
[0014] 将缓冲区溢出漏洞疑似路径中的每一个程序位置点映射到控制流图的基本块,多 个程序位置点可能会映射到同一个控制流图的基本块,从而形成一条不完整的由基本块组 成路径;
[0015] 根据设定的路径搜索策略获取从程序入口至程序溢出点的一条完整基本块路 径;
[0016] 步骤3:抽取动态测试路径
[0017] 上述的基本块组成路径不能够用于引导符号执行的分析过程,原因在于符号执行 的过程是对符号执行中间码指令的解释过程,每个指令都能映射到所属于的基本块,基本 块内部的指令不存在跳转关系,基本块之间则存在跳转关系;只有在到达基本块入口时,删 除该入口指令才有可能阻止符号执行进入无用的基本块,抽取基本块路径中每一个基本块 的入口指令的信息即:指令对应程序所在文件名称以及行号,获取以上信息重新生成一条 动态测试路径;
[0018] 步骤4:符号执行路径剪枝
[0019] 将当前准备分析的系统或者程序编译到符号执行平台,将动态测试路径以及符号 执行编译指令作为输入给符号执行平台,符号执行的过程其实是对中间码指令的逐条解释 的过程,在执行过程中,抽取指令的所属于的程序源码的文件以及行号信息,与动态测试路 径中的配置信息相对比,跳过不必要执行的中间码,以达到路径剪枝,加快执行速度以及缩 减执行状态空间的目的;
[0020] 步骤5 :缓冲区溢出漏洞路径误报检测
[0021] 检查符号执行的进程是否到达缓冲区溢出漏洞的疑似点,构建缓冲区溢出漏洞约 束条件根据不同的操作设定不同的溢出条件;将溢出条件加入当前路径约束条件,进行约 束求解,如果可解,则说明该路径确实存在漏洞,属于溢出路径,如果不可解,则说明该路径 是安全路径;
[0022] 步骤6 :缓冲区溢出点判定
[0023] 重复以上若干步骤,直到所有的漏洞特征匹配到的路径都已经被验证,对溢出疑 似点进行判定:使用如下判定准则:一个缓冲区溢出疑似点对应多条疑似路径,如果缓冲 区溢出疑似点的路径集合中有一条为漏洞路径,那么该程序点确认为溢出;如果缓冲区溢 出疑似点的路径集合中的每一条都为安全路径,那么该程序点确认为误报点。
[0024] 所述程序源码漏洞特征匹配的方法,获取的结果能
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1