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

技术编号:22219705 阅读:21 留言:0更新日期:2019-09-30 01:37
本发明专利技术涉及一种基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法,包括:A.初始化缓存;B.获取待测试的二进制程序的控制流图;C.对当前符号执行的跳转路径进行评分;D.调整待执行路径的执行顺序;E.对于和已符号执行的路径相同路径后缀的待执行路径,直接调用已执行结果;F.对缓冲区溢出的约束条件进行求解,判断当前的符号执行路径是否能够触发缓冲区溢出,并将已经求解的路径加入缓存中;G.从步骤C重复执行,直到所有路径执行完毕。本发明专利技术能够通过动/静态结合的方式自动检测缓冲区溢出漏洞,能够运用于漏洞检测以及安全审计,以及够快速进行自动检测并生成溢出漏洞触发测试用例,极大程度的节省了检测时间和人力成本。

An Automatic Buffer Overflow Vulnerability Detection Method Based on Symbol Execution Path Pruning

【技术实现步骤摘要】
一种基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法
本专利技术涉及软件测试的方法,具体讲是一种基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法。
技术介绍
软件安全是一种旨在保护软件免受恶意攻击和黑客攻击,以便软件在这些潜在风险下继续正常运行的思想。然而由于种种局限,如语言本身的安全缺陷或者开发者在开发过程中的疏漏等,使得软件往往存在一些可利用的漏洞。这些漏洞的存在使得软件的安全性大大降低,一旦被攻击者找到并利用,将对软件用户和版权拥有者造成巨大损失。缓冲区溢出是一种最为常见的软件漏洞。内存错误漏洞是软件漏洞的一种重要表现形式,而内存错误漏洞主要表现为缓冲区溢出(BufferOverflow)。缓冲区在系统中的表现形式是多样的,高级语言定义的变量、数组、结构体等在运行时可以说都是保存在缓冲区内的,按照冯.诺依曼存储程序原理,程序代码是作为二进制数据存储在内存的,同样程序的数据也在内存中,因此直接从内存的二进制形式上是无法区分哪些是数据哪些是代码的,这也为缓冲区溢出攻击提供了可能。缓冲区溢出分为堆溢出,栈溢出和BSS段溢出等形式。攻击者通过注入ShellCode(一段用于利用软件漏洞而执行的代码)的方式来跳转执行任意代码,进行破坏、控制等。该攻击方式危害大,影响范围广,难以彻底消除。缓冲区溢出漏洞指的是通过往程序的缓冲区写超出其长度的内容,从而造成缓冲区的溢出,破坏程序的堆栈,造成程序转而执行其它指令以达到攻击的目的。缓冲区溢出攻击可以导致攻击者非法提升权限获取系统控制权限等,可造成严重后果。目前存在动态测试和静态分析两种手段来发现程序中的缓冲区溢出漏洞。静态分析不涉及被测软件的动态执行,并且可以在运行程序之前的早期阶段检测可能的缺陷。在编码之后和执行单元测试之前完成。可以由机器完成,以自动“遍历”源代码并检测不合规规则。经典的例子是一个编译器,它可以找到词汇、句法甚至一些语义错误。由于漏洞可能发生在某条特定的路径中,所以静态分析技术往往是路径相关的,分析的结果可能会给出一条不完整的路径片段。静态分析工具为了保证分析结果的准确性而产生了大量的警报,这些警报绝大部分是冗余的,只包含了小部分真正漏洞。真正在使用这些工具的过程中,需要安全审计人员手工检查上述缓冲区溢出警报,编写测试用例覆盖静态分析产生的路径,以分析该路径是否存在缓冲区溢出的可能。动态测试通过编写测试用例运行不同的程序路径,分析是否能够触发潜在漏洞。动态分析的缺点十分明显,即需要软件测试人员手动设计测试用例,而测试用例一旦设计的不够完善,将可能导致漏洞无法被检测到。符号执行(SymbolicExecution)是一种程序分析技术,它可以通过分析程序来得到让特定代码区域执行的输入。顾名思义,使用符号执行分析一个程序时,该程序会使用符号值作为输入,而非一般执行程序时使用的具体值。在达到目标代码时,分析器可以得到相应的路径约束,然后通过约束求解器来得到可以触发目标代码的具体值。Angr是一个基于python的二进制程序符号执行分析框架,它将以前多种分析技术集成进来,它能够进行动态的符号执行分析(如:KLEE或Mayhem),也能够进行多种静态分析。在二进制代码中寻找并且利用漏洞是一项非常具有挑战性的工作,它的挑战性主要在于人工很难直观的看出二进制代码中的数据结构、控制流信息等。Angr的基本工作原理如下:首先将二进制程序载入Angr分析系统,将二进制程序转换成中间语言(intermediaterepresentation,IR),随后将IR语言转换成语义较强的表达形式再执行进一步的分析,如完整的或者部分的静态分析(依赖关系分析,程序分块)、程序空间的符号执行探索(挖掘溢出漏洞)、一些对于上面方式的结合。专利申请号201510161507.X的公开文本就是一种典型的静态分析缓冲区溢出漏洞的方法。其输入的基础数据是源代码,此种方式只适合对开源软件的检测,而闭源软件因无法获得其源代码,因此该方法并不适用。同时,随着技术的更新迭代,新的分析框架(如Angr)已经可以将静态分析步骤自动化,因此该公开方法中的重要组成部分手动的静态控制流图分析不再需要。并且,该方法中所述的剪枝方案,即跳过基本代码块中不必要执行的中间码和直接跳转,该方式在Angr框架中已成为基本功能之一,不需再手动实现,因此Angr框架已经实现了该公开方法的内容。
技术实现思路
本专利技术提供了一种基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法,通过动静态结合的检测方式,代替人工分析缓冲区溢出漏洞,快速进行自动检测并生成溢出漏洞触发测试用例,以节省时间和人力成本。本专利技术一种基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法,包括:A.初始化缓存:通过随机或根据操作者的经验预先选取相应的路径,符号执行所述的路径,并将执行后的结果添加到缓存中;B.获取待测试的二进制程序的控制流图(CFG图),并且对控制流图中的基本块的内部不存在跳转的指令进行约简,以及对基本块之间的直接跳转指令进行合并。CFG图为一个有向图,图中节点称为基本块(block),程序中的每个执行路径都和CFG图中的block一一映射对应。由block特性可知,每个block内部不可能存在跳转指令,只可能在两个block之间存在跳转指令,而跳转指令分为直接跳转和间接跳转;动态符号执行只需要提取存在间接跳转的路径即可完成完整的路径分析,故对block内部不存在跳转的指令进行约简,以及对block之间的直接跳转指令进行合并。C.符号执行主要问题之一在于路径爆炸问题,因此根据缓存中已符号执行完的路径的历史触发漏洞情况,对当前符号执行的跳转路径进行动态评分。D.根据评分结果,调整待执行路径队列中待执行路径的执行顺序。E.对于和已符号执行的路径具有相同路径后缀的待执行路径,直接调用已符号执行路径的执行结果,不再执行该待执行路径。通过步骤E和步骤E,有效提高了符号执行的效率,降低了大规模应用程序在符号执行时较为严重的路径爆炸问题。F.对缓冲区溢出的约束条件进行求解,判断当前的符号执行路径是否能够触发缓冲区溢出,并将已经求解的路径加入缓存中;G.从步骤C重复执行,直到所有根据评分判断为可能缓冲区溢出的路径执行完毕,则认为符号执行结束,统计步骤E得到的缓冲区溢出漏洞路径并输出结果。通过本专利技术的检测方法,有效抑制了符号执行过程中的状态爆炸问题。具体的,步骤C包括:对已经符号执行完成的路径的结果进行缓存,根据当前符号执行的跳转路径是否为已检测路径的子路径,以及该跳转路径和已缓存路径的相似度,结合已缓存路径的历史触发漏洞情况,对所有当前各跳转路径进行动态评分。具体的,步骤D所述的调整待执行路径队列中待执行路径的执行顺序为:让更可能存在缓冲区溢出漏洞的路径优先执行,对评分低于设定阈值的路径认为其不具备缓冲区溢出的可能,将其从待执行路径队列中删除。具体的,步骤F中,先将缓冲区溢出的约束条件添加到当前符号执行路径中得到新的约束条件集,然后对所述的约束条件集进行求解,判断当前的符号执行路径是否能够触发缓冲区溢出,并将已经求解的路径加入缓存中。在此基础上,步骤B中,先对待测试的二进制程序进行逆向分析,获取其程序的类源码信息,再根据所述的类源码信息获取待测试的二进制程序本文档来自技高网
...

【技术保护点】
1.一种基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法,其特征包括:A.初始化缓存:预先选取相应的路径,符号执行所述的路径,并将执行后的结果添加到缓存中;B.获取待测试的二进制程序的控制流图,并且对控制流图中的基本块的内部不存在跳转的指令进行约简,以及对基本块之间的直接跳转指令进行合并;C.根据缓存中已符号执行完的路径的历史触发漏洞情况,对当前符号执行的跳转路径进行动态评分;D.根据评分结果,调整待执行路径队列中待执行路径的执行顺序;E.对于和已符号执行的路径具有相同路径后缀的待执行路径,直接调用已符号执行路径的执行结果,不再执行该待执行路径;F.对缓冲区溢出的约束条件进行求解,判断当前的符号执行路径是否能够触发缓冲区溢出,并将已经求解的路径加入缓存中;G.从步骤C重复执行,直到所有根据评分判断为可能缓冲区溢出的路径执行完毕,则认为符号执行结束,统计步骤E得到的缓冲区溢出漏洞路径并输出结果。

【技术特征摘要】
1.一种基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法,其特征包括:A.初始化缓存:预先选取相应的路径,符号执行所述的路径,并将执行后的结果添加到缓存中;B.获取待测试的二进制程序的控制流图,并且对控制流图中的基本块的内部不存在跳转的指令进行约简,以及对基本块之间的直接跳转指令进行合并;C.根据缓存中已符号执行完的路径的历史触发漏洞情况,对当前符号执行的跳转路径进行动态评分;D.根据评分结果,调整待执行路径队列中待执行路径的执行顺序;E.对于和已符号执行的路径具有相同路径后缀的待执行路径,直接调用已符号执行路径的执行结果,不再执行该待执行路径;F.对缓冲区溢出的约束条件进行求解,判断当前的符号执行路径是否能够触发缓冲区溢出,并将已经求解的路径加入缓存中;G.从步骤C重复执行,直到所有根据评分判断为可能缓冲区溢出的路径执行完毕,则认为符号执行结束,统计步骤E得到的缓冲区溢出漏洞路径并输出结果。2.如权利要求1所述的一种基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法,其特征为:步骤C包括:对已经符号执行完成的路径的结果进行缓存,根据当前符号执行的跳转路径是否为已检测路径的子路径,以及该跳转路径和已缓存路径的相似度,结合已缓存路径的历史触发漏洞情况,对所有当前各跳转路径...

【专利技术属性】
技术研发人员:谢海朱涛陈水全
申请(专利权)人:成都积微物联集团股份有限公司
类型:发明
国别省市:四川,51

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

1