一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于值依赖图的源库模式Java安全漏洞检测方法与流程

2021-12-01 01:46:00 来源:中国专利 TAG:

一种基于值依赖图的源库模式java安全漏洞检测方法
技术领域
1.本发明涉及程序分析技术领域,尤其涉及一种基于值依赖图的源库模式java安全漏洞检测方法。


背景技术:

2.值依赖分析技术为静态程序分析中一种对数据流分析方法的深入研究,用来达到精度与效率的平衡,程序分析过程以程序建模开始,称其为值依赖图,是对源代码程序的一种图形式的准确的描述形式,使其可以支持对多种缺陷的正确检测,在缺陷描述阶段,关注缺陷模式的准确表达以及模式的完备程度,从而提高缺陷检测的覆盖范围,在缺陷检测阶段,基于守卫分析的概念可以提高检测的精度和速度,java值依赖图的构建是值依赖分析技术对于java语言的应用,在构建过程中充分考虑了java语言诸如继承多态等的特性,以及常用的java框架,如开源框架spring的依赖注入技术等。
3.java常见安全漏洞模式包括输入验证、api误用、安全特性、时间和状态、异常处理、代码质量、封装不当及环境问题等,本发明主要针对处理输入验证不足导致的安全问题,如跨站脚本攻击,sql注入等,支持cwe top 25及owasp top 10中输入验证类漏洞的检测,不受信任的数据进入系统后,若未进行合理的过滤和保护即使用,容易产生非预期的结果,从而被攻击者利用。
4.能够被程序系统接收的不受信任的源即为source点,其包括第三方库内某些函数的返回值,函数定义的参数等,从数据来源分包括来自网络的数据,来自数据库的数据,从文件中读取的数据等,sink点与其相对,为程序中使用了来自不受信任的数据,能够执行代码,返回数据给web服务,或进行数据库查询操作等的具有一定功能的方法或者对象,source点和sink点的配对定义了不受信任的数据在程序运行过程中的一条可能的路径,根据source点和sink点的不同可以区分不同类型的漏洞模式。
5.现有的污点分析技术包含了source

sink(源库)模式,该技术被广泛的用在数据泄漏检测,系统安全漏洞挖掘等领域,但其在不同平台,针对不同语言,不同框架不能提供一种通用的解决方案,对于上述问题需要定制处理,另外现有的以java字节码作为输入源的安全漏洞检测方式,采用关系型数据库的方式存储程序的函数调用图信息,从数据库中查找漏洞模式标记污染数据,该种方式不能友好的处理未编译通过的java源码,对源程序及框架支持等缺少充分的表达,同时不能提供详尽的漏洞缺陷模式,因而不可避免的会出现误漏报情况,另一种对控制流图进行遍历,建立安全状态机的检测方式,以函数为单元进行控制流图分析,依据函数调用关系将部分控制流图组成整个程序的控制流图,该种方式同样不能充分表达源程序,缺少域敏感,对象敏感等的分析将引入很多误报,漏洞模式的不足也会导致对诸多漏洞情况分析的欠缺,因此,本发明提出一种基于值依赖图的源库模式java安全漏洞检测方法以解决现有技术中存在的问题。


技术实现要素:

6.针对上述问题,本发明的目的在于提出一种基于值依赖图的源库模式java安全漏洞检测方法,该方法考虑了java语言特性,第三方库的特性,结合上下文敏感,对象敏感等技术,提高了值依赖图对程序表达的能力,具有检测速度快,准确度高的优点。
7.为了实现本发明的目的,本发明通过以下技术方案实现:一种基于值依赖图的源库模式java安全漏洞检测方法,包括以下步骤:步骤一:漏洞模式提取对漏洞接收不可信任数据的输入源source、特定的漏洞发生点sink以及filter模式进行提取;步骤二:构建java的值依赖图考虑java继承多态的特性,结合第三方库框架的特性,依靠分析技术,构建java的值依赖图,对被检测程序进行充分的表达;步骤三:实现安全漏洞检测遍历java的值依赖图,构建程序切片,获取source和sink的配对,排除受保护的情况后进行报错,实现对java的安全漏洞检测。
8.进一步改进在于:所述步骤一中,所述漏洞为通用漏洞或特定漏洞,所述filter模式为起保护或过滤作用的filter模式。
9.进一步改进在于:所述步骤一中,提取的模式以xml的结构存储于本地,并按照包名、类名和方法名的形式进行区分,对于同一包下的类名或者方法名以正则的形式来表达。
10.进一步改进在于:所述步骤二中,所述分析技术包括流敏感、对象敏感、域敏感、上下文敏感、常量传播和依赖分析。
11.进一步改进在于:所述步骤二中,所述java值依赖图构建过程中引入this表达式,构建过程中生成丰富函数调用图功能的类继承图,使基类或接口的函数调用能够扩展到其子类或者实现类。
12.进一步改进在于:所述步骤三中,在构建程序切片的过程中对java的值依赖图进行剪枝,排除掉确定的不可能执行的分支以减少误报。
13.进一步改进在于:所述步骤三中,程序切片构建后对切片进行分析,判断是否切片路径中存在filter模版中的函数,以及是否存在不一致的偏移,进一步减少误报。
14.本发明的有益效果为:本发明考虑了java语言特性,第三方库的特性,结合上下文敏感,对象敏感等技术,提高了值依赖图对程序表达的能力,具有检测速度快,准确度高的优点,且取决于提取的通用jar包,source

sink模版及filter模版的完备程度,检测结果的误漏报情况会有区别,开发者及测试者可以利用本发明方法查找被检程序中大部分的java输入验证类的漏洞。
附图说明
15.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
16.图1是本发明实施例的方法流程图;图2是本发明实施例的部分jar包示例图;图3是本发明实施例的java值依赖图构造流程图。
具体实施方式
17.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
18.在本发明的描述中,需要说明的是,术语“中心”、“上”、“下”、“左”、“右”、“竖直”、“水平”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”、“第三”、“第四”等仅用于描述目的,而不能理解为指示或暗示相对重要性。
19.在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。
20.参见图1,本实施例提供了一种基于值依赖图的源库模式java安全漏洞检测方法,包括以下步骤:步骤一:漏洞模式提取对通用漏洞或特定漏洞接收不可信任数据的输入源source、特定的漏洞发生点sink以及起保护或过滤作用的filter模式进行提取,提取的模式以xml的结构存储于本地,便于管理维护以及程序中快速的读取,并按照包名、类名和方法名的形式进行区分,对于同一包下的类名或者方法名以正则的形式来表达;如图2所示,java通用的第三方库jar包也应存于本地,随被检测程序一并检测,用于提供被检测程序中的方法或对象的准确来源,为漏洞模式匹配做准备;步骤二:构建java的值依赖图考虑java继承多态的特性,结合第三方库框架的特性,依靠流敏感、对象敏感、域敏感、上下文敏感、常量传播和依赖分析的分析技术,构建java的值依赖图,对被检测程序进行充分的表达,java值依赖图构建过程中引入this表达式,可以更好的对域成员变量偏移进行支持,构建过程中生成丰富函数调用图功能的类继承图,使基类或接口的函数调用能够扩展到其子类或者实现类,弥补了静态分析对于程序运行时函数调用检测的不足,针对框架所做的函数摘要,让值在图中的传递更加直接和准确;步骤三:实现安全漏洞检测遍历java的值依赖图,构建程序切片,获取source和sink的配对,排除受保护的情况后进行报错,实现对java的安全漏洞检测,java值依赖图中具有充分的信息,然而其并非程序执行过程的准确表达,比如因为继承多态特性的存在,同一个函数调用可能对应多个
函数定义,因而在构建程序切片的过程中对java的值依赖图进行剪枝,排除掉确定的不可能执行的分支以减少误报,程序切片构建后对切片进行分析,判断是否切片路径中存在filter模版中的函数,以及是否存在不一致的偏移,进一步减少误报。
21.构建值依赖图,在图上查找可能的符合漏洞模式的source

sink对,排除有保护的情况后进行报错,具体描述如下:(1)java通用jar包:java语言中包含大量的第三方库和框架,为保证检测漏报尽可能低,应详尽的准备有可能提供source和sink函数的jar包,其目的在于能提供准确的与漏洞模版相匹配的包名类名和方法名。
22.(2)漏洞通用模式:为保证检测的准确性,source和sink函数应严格匹配包名类名和方法名,所以预置的模版内应包含上述的情况,如常见的request.getparameter方法获取来自外部的参数,其方法的完整路径名为javax.servlet.http.httpservletrequest.getparameter,所以应匹配javax.servlet

api.jar包中相应的方法,其他情况则不应匹配到否则很可能会导致误报。很多静态代码分析工具只进行了部分匹配如类名以request结尾或者只匹配到了类名,都会在一定程度上导致误报的发生。另外,很多java框架有其自己的特性,如spring框架的依赖注入和注解,像被@requestmapping,@getmapping等注解表示的函数在某些情况下也应该作为source点即不受信任数据来源的入口从而减少漏报。
23.(3)保护方法:误报的另一种发生情况是即便匹配到了正确的source

sink对,但在不受信任数据传递过程中已通过调用某些函数对其进行了保护处理,则不再构成威胁,应将这种报错去掉,所以为降低误报率,这种保护函数的配置也至关重要。如org.owasp.esapi.encoder.encodeforhtml方法可以将

<
’‘
>
’‘
&’等字符进行转义从而避免跨站脚本攻击漏洞的发生,对于该种漏洞应详尽整理可能的保护函数来去除误报。
24.(4)java值依赖图:a.读取被检测程序源码进行词法、语法、语义分析构造抽象语法树(ast);b.构造中间表达形式控制流图(cfg);c.构建函数调用图(cg);d.基于控制流图和定值使用关系等分析技术构建值依赖图(vdg),如图3所示;e.结合java语言特性,框架特性等对值依赖图进行优化。
25.(5)遍历值依赖图:图的遍历主要以深度优先搜索的方式,对图进行切片,由于值依赖图的表示形式为有向图,因而遍历分为向前和向后两个方向。一般来说source点更具有通用性,同样的输入可以最终导致不同的漏洞,因而source模版的数量更为庞大,而sink点是针对于当前特定缺陷类型,其数量相对较少,所以通常采用以sink点为起点的向后遍历的方式效率更高,但对于部分缺陷类型,会有source模版的数量明显少于sink模版的情况,这时采用以source点为起点的向前遍历的方式较好。以下详细介绍两种方式。向前遍历方式:对于某一特定的漏洞类型,遍历每一个值依赖图中的结点,从ast层获得该点在程序中对应的完整路径名,判断其是否匹配该漏洞source中的模版,一旦确定匹配,则以此为起点向前遍历所有后续结点,判断其是否匹配该漏洞的sink模版,确定匹配后该点即为终点,起点和终点间的路径即为一个切片。如果路径中的点没有出现在该漏洞的保护模版中,则此路径表示了该不受信任的数据在程序中的传递过程,可以进行报错。向后遍历方式与之相对,遍历每一个值依赖图中的结点,判断其是否匹配该漏洞sink中的模版,确定匹配后,
以该点为起点向后遍历所有前续结点,判断其是否匹配该漏洞的source模版,作为终点,建立不受信任数据在程序中的传递路径。
26.以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献