法律状态公告日
法律状态信息
法律状态
2022-08-26
实质审查的生效 IPC(主分类):G06F21/57 专利申请号:202210381604X 申请日:20220413
实质审查的生效
2022-08-09
公开
发明专利申请公布
技术领域
本发明属于网络安全技术领域,尤其涉及一种基于静态污点分析的二进制污点型漏洞检测方法及系统。
背景技术
随着嵌入式设备在人们日常生活中普及,给人们带来便捷的同时,也带来了敏感数据泄露等风险,尤其是路由器设备的安全。路由器作为网络枢纽,能够连通同一场所下的大部分智能设备,因此成为被攻击的高风险对象。大多嵌入式设备为闭源,虽然提高了攻击难度,但也导致其安全性主要依赖于安全测试员等少部分人,增加了系统出现漏洞的可能性,因此需要直接对二进制形式的固件进行检测。
二进制漏洞静态分析技术主要分为两种,其一是通过与存在漏洞的二进制文件进行相似性比较,检测目标二进制文件中是否存在相同漏洞,常使用机器学习的方式来对危险代码进行特征识别;其二是静态污点分析,通过构建某个种类漏洞的模型,使用模式匹配对二进制文件进行检测,符合模型的点被当作潜在的脆弱点输出。与动态测试相比,静态检测存在误报率高以及路径爆炸的问题,但由于其使用时间短,资源消耗非常小,因此常被用于二进制漏洞挖掘的工作中。而且静态污点分析能够对某一类别的漏洞进行检测,扩大了检测的范围,因此本文选择静态污点分析的方式进行漏洞检测。
静态污点分析技术主要依赖于目标对象中可能存在的被污染的数据流,主要针对Web类应用和Android应用,因为这两类目标对象都存在大量的用户交互,由复杂组件带来的大量风险点以及部分或全部源码的可得性等特点。对Web类应用的检测,主要是对其脚本语言进行检测,例如PHP、JavaScript等;Android 应用的检测目的是保护用户隐私等敏感信息是否被窃取。
当前,静态污点分析存在路径爆炸、数据流不敏感以及对低级语言进行的大规模数据流分析导致的模型复杂度增大和精度降低的问题。静态检测的对象一般为机器码、汇编代码或者中间语言,直接对低级语言进行大规模的数据流检测,会增加模型的复杂度,导致检测的时间增长以及精度降低。除此以外,静态检测技术也存在路径爆炸以及数据流不敏感的问题。
已有的使用静态污点分析扫描二进制文件中的漏洞的方法,通常是利用约束,从输入点跟踪输入流,一直到输出点,因为是静态分析,因此需要对所有的代码做分析,其中不乏很多路径分叉口和重复分析某个函数,这就会导致路径的数量呈指数级增长;除此以外,静态污点分析的目标一般为机器码、汇编以及中间语言等低级语言,这就使得当数据流很长时间,路径中的约束和限制条件也会爆炸,使得消耗的资源增大,检测的精度降低等。
发明内容
本发明针对现有使用静态污点分析扫描二进制文件中的漏洞的方法存在的路径的数量呈指数级增长,当数据流很长时间,路径中的约束和限制条件也会爆炸,使得消耗的资源增大,检测的精度降低等问题,提出一种基于静态污点分析的二进制污点型漏洞检测方法及系统,通过构建函数原子池,将函数为带属性的原子;设定起点和终点,构建所有从起点到终点的路径网络图,并且使用原子属性对路径图进行优化;通过污点分析和漏洞特征相结合的方式判断危险函数调用点是否满足存在漏洞的特征。本发明通过将函数降维为原子,消除了污点分析过程在函数中的路径增量,避免了静态污点分析路径爆炸的问题,通过分离函数内外联系的方法,简化了分析的过程,降低了分析的复杂度,并且,通过针对函数内的污点分析,提高了静态污点分析在函数内的精度,使函数之间的关系可以更加清晰,提高了数据流的敏感度。
为了实现上述目的,本发明采用以下技术方案:
本发明一方面提出一种基于静态污点分析的二进制污点型漏洞检测方法,包括:
步骤1,构建函数原子池:使用IDA Pro对二进制文件进行反汇编,得到C 语言代码;以函数参数和外部输入点为污染源,遍历整个函数,获取被污染的变量、函数的调用关系以及被调用函数的参数的污染情况,对所有的函数执行上述操作,并以函数为原子,以提取的数据作为原子的属性,存放到数据库中;
步骤2,路径网络图的构建及优化:设定外部输入函数为起点,以调用起点的函数为路径的开端,以危险函数作为终点,以调用危险函数的函数作为路径的结尾,根据函数之间的调用关系,使用广度优先算法,从起点到终点进行正向遍历,构建所有从起点到终点的路径网络图;并使用原子的属性对路径网络图进行优化,剪除不能达到的路径;
步骤3,脆弱性成立判定:构建注入类和溢出类漏洞的漏洞模型,检索路径结尾函数中的危险函数调用点是否符合漏洞模型,若符合则可认为该调用点为漏洞点。
进一步地,所述外部输入函数包括nvram_bufget、get_var、websGetVar;所述危险函数包括system、strcpy、memcpy。
进一步地,所述步骤1包括:
步骤1.1,使用反汇编工具IDA Pro对二进制文件进行反汇编,得到C语言代码;
步骤1.2,进行函数内污点传播分析:首先设定一个污染池,初始污染源为函数参数和函数内的直接外部输入,遍历函数的内部代码路径,对变量进行分类,并将存在直接污染和间接污染的变量添加到污染池中,获取被调用函数列表,并记录被调用函数的参数的污染情况;
步骤1.3,对C语言代码中所有的函数执行步骤1.2操作;
步骤1.4,以函数为原子,以提取的数据作为原子的属性,存放到mongoDB 数据库中,完成函数原子池构建。
进一步地,所述步骤3包括:
构建注入类和溢出类漏洞的漏洞模型;其中溢出类漏洞对应的函数参数须符合源变量可控且其指向的内存空间大于目标变量;注入类漏洞对应的函数参数需满足字符串类型以及执行部分的字符串可控;
检索路径结尾函数中的危险函数调用点是否符合构建的漏洞模型,若符合则认为该调用点为漏洞点,若不符合则删除与该危险函数调用点存在调用关系的路径。
本发明另一方面提出一种基于静态污点分析的二进制污点型漏洞检测系统,包括:
构建模块,用于构建函数原子池:使用IDA Pro对二进制文件进行反汇编,得到C语言代码;以函数参数和外部输入点为污染源,遍历整个函数,获取被污染的变量、函数的调用关系以及被调用函数的参数的污染情况,对所有的函数执行上述操作,并以函数为原子,以提取的数据作为原子的属性,存放到数据库中;
构建优化模块,用于进行路径网络图的构建及优化:设定外部输入函数为起点,以调用起点的函数为路径的开端,以危险函数作为终点,以调用危险函数的函数作为路径的结尾,根据函数之间的调用关系,使用广度优先算法,从起点到终点进行正向遍历,构建所有从起点到终点的路径网络图;并使用原子的属性对路径网络图进行优化,剪除不能达到的路径;
脆弱性判定模块,用于进行脆弱性成立判定:构建注入类和溢出类漏洞的漏洞模型,检索路径结尾函数中的危险函数调用点是否符合漏洞模型,若符合则可认为该调用点为漏洞点。
进一步地,所述外部输入函数包括nvram_bufget、get_var、websGetVar;所述危险函数包括system、strcpy、memcpy。
进一步地,所述构建模块具体用于:
步骤1.1,使用反汇编工具IDA Pro对二进制文件进行反汇编,得到C语言代码;
步骤1.2,进行函数内污点传播分析:首先设定一个污染池,初始污染源为函数参数和函数内的直接外部输入,遍历函数的内部代码路径,对变量进行分类,并将存在直接污染和间接污染的变量添加到污染池中,获取被调用函数列表,并记录被调用函数的参数的污染情况;
步骤1.3,对C语言代码中所有的函数执行步骤1.2操作;
步骤1.4,以函数为原子,以提取的数据作为原子的属性,存放到mongoDB 数据库中,完成函数原子池构建。
进一步地,所述脆弱性判定模块具体用于:
构建注入类和溢出类漏洞的漏洞模型;其中溢出类漏洞对应的函数参数须符合源变量可控且其指向的内存空间大于目标变量;注入类漏洞对应的函数参数需满足字符串类型以及执行部分的字符串可控;
检索路径结尾函数中的危险函数调用点是否符合构建的漏洞模型,若符合则认为该调用点为漏洞点,若不符合则删除与该危险函数调用点存在调用关系的路径。
与现有技术相比,本发明具有的有益效果:
本发明首先针对单个函数进行数据流分析,以参数和外部输入为污染源,利用静态污点分析的方法对函数内变量和调用函数的参数的污染情况作分析,获取函数的相关信息。获取完成后,便可以将函数作为一个带有属性的原子,从而将分析的重点,放在函数之间的路径构件上。单个函数分析的复杂度要远小于组合函数的复杂度,也避免了函数重复分析带来的弊端。而且本发明检测的目标是使用IDA反汇编后的C语言代码,并且结合原子组合的方法,这就使得数据流的路径长度将大大缩短和精简,有利于减少所需要的资源以及提高检测的精度。
本发明首先对函数进行原子化,是对函数分析难度的降级。通过对整个程序的解耦,降低组合函数分析的复杂度,然后将函数当作一个整体,对其进行分析,在此将静态污点分析的难度下调,这些操作都会使得静态污点分析所消耗的资源减少。在构建路径网络图的时候,使用的原材料是已经构建后的函数原子,这些原子都有调用信息和被调用信息等属性,因此可以通过组装的形式快速构建路径网络图,并且使用原子的调用参数的污染情况等属性,对路径进行优化,使得获得地从输入点到危险函数调用点的路径可达性大大提升。
附图说明
图1为本发明实施例一种基于静态污点分析的二进制污点型漏洞检测方法的基本流程图;
图2为本发明实施例一种基于静态污点分析的二进制污点型漏洞检测方法构建的路径网络图;
图3为本发明实施例一种基于静态污点分析的二进制污点型漏洞检测方法的污点分析图;
图4为本发明实施例一种基于静态污点分析的二进制污点型漏洞检测方法经过污点分析优化后的路径网络图;
图5为本发明实施例一种基于静态污点分析的二进制污点型漏洞检测方法的脆弱点成立判定图;
图6为本发明实施例一种基于静态污点分析的二进制污点型漏洞检测系统的架构示意图。
具体实施方式
下面结合附图和具体的实施例对本发明做进一步的解释说明:
如图1所示,一种基于静态污点分析的二进制污点型漏洞检测方法,该方法通过静态污点分析对路由器固件中的注入类和溢出类漏洞等污点型漏洞做检测;首先以函数为整体,获取其调用关系以及变量污染集;其次使用函数调用图组装所有以用户输入或者主函数为起点,以存在漏洞点函数为终点的路径网络图,并且利用原子池中的数据对路径网络图进行优化,去除掉不可利用的路径;最后使用模式匹配的方式对路径末端的函数进行分析,筛选出潜在的脆弱点。主要包括三个关键步骤:
步骤S101,构架函数原子池。使用IDA Pro对二进制文件进行反汇编,得到C语言代码;以函数参数和外部输入点为污染源,遍历整个函数,获取被污染的变量,函数的调用关系以及被调用函数的参数的污染情况,对所有的函数执行上述操作,并以函数为原子,以提取的数据作为原子的属性,存放到数据库中。
步骤S102,路径网络图的构建及优化。设定外部输入函数为起点,例如 nvram_bufget、get_var、websGetVar,以调用起点的函数为路径的开端。以system、 strcpy、memcpy等危险函数作为终点,以调用危险函数的函数作为路径的结尾。根据函数之间的调用关系,使用广度优先算法,从起点到终点进行正向遍历,构建所有从起点到终点的路径网络图,并且使用原子的属性对路径网络图进行优化,剪除不能达到的路径。
步骤S103,脆弱性成立判定。构建注入类和溢出类漏洞的漏洞模型,检索路径结尾函数中的危险函数调用点是否符合漏洞模型,若符合则可认为该调用点为漏洞点。
具体地,步骤S101,构建函数原子池包括:
以函数为主体,获取函数的调用以及被调用关系,函数内数据污染的变量集合,以及函数内被调用函数的参数污染情况。该步骤的主要目的是为了对函数进行复杂度降级,提取必要信息后,即可将函数视为带有属性的原子节点,简化构建污染路径的复杂度。
使用反汇编工具IDA Pro对收集的二进制文件进行反汇编。函数内污点传播分析,首先设定一个污染池,初始污染源为函数参数和函数内的直接外部输入,例如nvram_bufget、get_var、websGetVar。遍历函数的内部代码路径,对变量进行分类,并将存在直接污染和间接污染的变量添加到污染池中,获取被调用函数列表,并记录这些函数参数的污染情况。对C语言代码中所有的函数执行上述函数内污点传播分析操作。具体地原子池构建算法如下所示:
算法1:原子池构建算法
然后以函数为原子,以提取的数据作为原子的属性,使用mongoDB数据库对提取出的原子属性进行存储,存储格式如下:
具体地,步骤S102,路径网络图的构建及优化包括:
该步需要构建路径网络图并对其进行优化,使得外部输入数据能够到达危险函数调用点。首先,设定起始点和终点;然后构建从起点到终点的所有路径;最后,利用上一步构建的原子池的中的原子属性,对构建的路径进行优化,删除掉不可用的路径。
起始点即可直接接受外部输入的函数,例如nvram_bufget、get_var、websGetVar等,输入函数一般被其他函数调用时才能发挥作用,因此函数路径的第一节一般为直接调用输入函数的函数。终点是漏洞发生的危险函数,例如 system、strcpy、memcpy等函数,同输入函数一样终点单独并不触发漏洞,所以路径的最后一节一般为符合漏洞特征的终点函数调用函数。路径网络图的构建,使用广度优先算法,从起点到终点进行正向遍历。遍历算法如下所示:
算法2:广度优先的路径网络图遍历算法
根据算法2构建的路径网络图,如图2所示。
图2中所有的以圆表示的节点均为函数,各个节点以有向箭头相连接,箭头的起点是函数调用函数,终点为被调用函数;左侧空白圆为可接受外界输入的函数,右侧黑色实体圆为危险函数,中间的灰色圆为污点传播函数。
由于路径网络图是从起点到终点的所有路径,因此存在许多不可用路径,例如被调用的函数的参数并没有被污染或者全部污染,这就使得输入的数据并不能通过这一节点,故应删除此类节点。节点删除的依据是第一步获得的函数原子的属性,其中记录有函数中,被调用函数的参数的污染情况。优化过程如图3和图 4所示。
具体地,步骤S103,脆弱性成立判定包括:
目前为止已经获得了优化后的污点传输路径,外部的外部输入已经可以正确到达危险函数调用函数。因此该步骤的工作即为判定危险函数的参数是否可控以及其参数特征是否注入类漏洞和溢出类漏洞的漏洞特征,若符合,则可认为,该调用点为潜在的漏洞点。
危险函数的参数是否可控,可依据危险函数调用函数的原子属性得到。溢出类漏洞的特征须符合源变量可控且其指向的内存空间大于目标变量;注入类漏洞的触点一般为系统命令执行函数,因此其被污染的参数需满足字符串类型以及执行部分的字符串需可控,因为部分命令执行函数在运行时会限制命令的长度。
算法3脆弱性成立判定算法
对于判定为不成立的脆弱点(危险函数调用点),则删除与该脆弱点存在调用关系的路径,该组调用关系一般存在与路径的结尾,如图5所示。然后将判定成立的路径保存到数据库中。
如图6所示,在上述实施例的基础上,本发明还提出一种基于静态污点分析的二进制污点型漏洞检测系统,包括:
构建模块,用于构建函数原子池:使用IDA Pro对二进制文件进行反汇编,得到C语言代码;以函数参数和外部输入点为污染源,遍历整个函数,获取被污染的变量、函数的调用关系以及被调用函数的参数的污染情况,对所有的函数执行上述操作,并以函数为原子,以提取的数据作为原子的属性,存放到数据库中;
构建优化模块,用于进行路径网络图的构建及优化:设定外部输入函数为起点,以调用起点的函数为路径的开端,以危险函数作为终点,以调用危险函数的函数作为路径的结尾,根据函数之间的调用关系,使用广度优先算法,从起点到终点进行正向遍历,构建所有从起点到终点的路径网络图;并使用原子的属性对路径网络图进行优化,剪除不能达到的路径;
脆弱性判定模块,用于进行脆弱性成立判定:构建注入类和溢出类漏洞的漏洞模型,检索路径结尾函数中的危险函数调用点是否符合漏洞模型,若符合则可认为该调用点为漏洞点。
进一步地,所述外部输入函数包括nvram_bufget、get_var、websGetVar;所述危险函数包括system、strcpy、memcpy。
进一步地,所述构建模块具体用于:
步骤1.1,使用反汇编工具IDA Pro对二进制文件进行反汇编,得到C语言代码;
步骤1.2,进行函数内污点传播分析:首先设定一个污染池,初始污染源为函数参数和函数内的直接外部输入,遍历函数的内部代码路径,对变量进行分类,并将存在直接污染和间接污染的变量添加到污染池中,获取被调用函数列表,并记录被调用函数的参数的污染情况;
步骤1.3,对C语言代码中所有的函数执行步骤1.2操作;
步骤1.4,以函数为原子,以提取的数据作为原子的属性,存放到mongoDB 数据库中,完成函数原子池构建。
进一步地,所述脆弱性判定模块具体用于:
构建注入类和溢出类漏洞的漏洞模型;其中溢出类漏洞对应的函数参数须符合源变量可控且其指向的内存空间大于目标变量;注入类漏洞对应的函数参数需满足字符串类型以及执行部分的字符串可控;
检索路径结尾函数中的危险函数调用点是否符合构建的漏洞模型,若符合则认为该调用点为漏洞点,若不符合则删除与该危险函数调用点存在调用关系的路径。
综上,本发明首先针对单个函数进行数据流分析,以参数和外部输入为污染源,利用静态污点分析的方法对函数内变量和调用函数的参数的污染情况作分析,获取函数的相关信息。获取完成后,便可以将函数作为一个带有属性的原子,从而将分析的重点,放在函数之间的路径构件上。单个函数分析的复杂度要远小于组合函数的复杂度,也避免了函数重复分析带来的弊端。而且本发明检测的目标是使用IDA反汇编后的C语言代码,并且结合原子组合的方法,这就使得数据流的路径长度将大大缩短和精简,有利于减少所需要的资源以及提高检测的精度。
本发明首先对函数进行原子化,是对函数分析难度的降级。通过对整个程序的解耦,降低组合函数分析的复杂度,然后将函数当作一个整体,对其进行分析,在此将静态污点分析的难度下调,这些操作都会使得静态污点分析所消耗的资源减少。在构建路径网络图的时候,使用的原材料是已经构建后的函数原子,这些原子都有调用信息和被调用信息等属性,因此可以通过组装的形式快速构建路径网络图,并且使用原子的调用参数的污染情况等属性,对路径进行优化,使得获得地从输入点到危险函数调用点的路径可达性大大提升。
以上所示仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
机译: 静态污点分析系统和计算机程序代码的污点分析方法
机译: 静态污点分析系统及计算机程序代码解析的污点分析方法
机译: 快速静态污点分析的方法和系统