一种Java源代码缺陷检测方法及装置制造方法

文档序号:6550218阅读:124来源:国知局
一种Java源代码缺陷检测方法及装置制造方法
【专利摘要】本发明公开了一种Java源代码缺陷检测方法及装置,所述方法首先对Java源程序字节码进行静态分析,生成函数调用图;根据所述函数调用图生成保存有所述Java源程序基本信息的关系数据库;根据预先建立的漏洞模式,以关系数据库查询的方式对所述Java源程序进行指针别名分析和污点分析;根据污点分析的结果,产生缺陷报告。该方法及装置能够全面而准确地检测Java源代码的安全缺陷,同时减少程序运算量,提高检测性能。
【专利说明】—种Java源代码缺陷检测方法及装置
【技术领域】
[0001]本发明涉及源代码静态分析【技术领域】,尤其涉及一种Java源代码缺陷检测方法及装置。
【背景技术】
[0002]源代码的静态安全检测是指在不运行代码的前提下,分析程序的语法、语义、控制流等信息,验证代码是否满足安全性。目前,静态分析主要有类型推断、数据流分析和约束分析3种方法:
I)类型推断方法:类型推断是一个处理过程,其目的是保证每个操作都是针对一组数目正确,类型合适的对象进行,以保证操作的有效性。类型推断可以检查类型错误,选择合适的操作,根据情况确定必要的类型转换。
[0003]2)数据流分析方法:数据流分析是一项编译时使用的技术,它能从程序代码中收集程序的语义信息并通过代数的方法在编译时确定变量的定义和使用,数据流分析被用于解决编译优化、程序验证、调试、测试、并行、向量化和串行编程环境等问题。数据流分析是通过对变量构造定义一引用对来实现的。
[0004]3)约束分析方法将程序分析过程分为约束产生和约束求解两个阶段,前者利用约束产生规则建立变量类型或分析状态之间的约束系统,后者对这些约束系统进行求解。约束系统可以分为等式约束、集合约束和混合。
[0005]上述现有技术中的三种方法都是通过解释程序的抽象语义,建立程序属性的数学模型,再通过求解这个数学模型,确定程序的属性。相比较而言,约束分析具有最强的检测能力和最慢的检测速度,适合进行软件的安全检测;数据流分析具有较强和较快的检测速度,适合检查需要考虑控制流信息而且变量属性之间的操作十分简单的静态分析问题;类型推断则具有最弱的检测能力和最快的检测速度,适合检查属性域有限而且与控制流无关的安全属性。但上述三种方法均无法全面准确的检测出Java源代码的安全缺陷,检测性能无法得到提高。

【发明内容】

[0006]本发明的目的是提供一种Java源代码缺陷检测方法及装置,能够全面而准确地检测Java源代码的安全缺陷,同时减少程序运算量,提高检测性能。
[0007]一种Java源代码缺陷检测方法,所述方法包括:
对Java源程序字节码进行静态分析,生成函数调用图;
根据所述函数调用图生成保存有所述Java源程序基本信息的关系数据库;
根据预先建立的漏洞模式,以关系数据库查询的方式对所述Java源程序进行指针别名分析和污点分析;
根据污点分析的结果,产生缺陷报告。
[0008]所述以关系数据库查询的方式对所述Java源程序进行指针别名分析,具体包括: 获得每个函数调用图以及函数依赖分析生成的函数调用序列;
以main函数为入口,根据函数调用持续迭代计算每个过程的指针信息;
根据所述函数调用序列分别计算每个语句对所述指针信息的影响;
其中,在此框架中过程内分析与过程间分析是并行的,当在过程内分析,遇到函数调用时,则进行过程间的分析;当在过程间分析,如果将调用者名字空间内的信息映射到被调用者名字空间中,则可进入过程间分析。
[0009]所述以关系数据库查询的方式对所述Java源程序进行污点分析,具体包括:
通过查询所述关系数据库,并与漏洞模式比对,找到将用户数据引入到所述Java源程
序中的函数,并将其返回结果标记为污点数据;
记录所述污点数据在所述Java源程序中的传播;
通过查询所述关系数据库,并与漏洞模式比对,找到使所述污点数据执行的函数,并记录污点传播的过程。
[0010]一种Java源代码缺陷检测装置,所述装置包括:
程序识别模块,用于对Java源程序字节码进行静态分析,生成函数调用图,根据所述函数调用图生成保存有所述Java源程序基本信息的关系数据库;
解释模块,用于对Java源程序安全漏洞描述进行解释;
静态数据流分析模块,用于根据预先建立的漏洞模式,以关系数据库查询的方式对所述Java源程序进行指针别名分析;
安全漏洞分析模块,以关系数据库查询的方式对所述Java源程序进行污点分析,根据污点分析的结果,产生缺陷报告。
[0011 ] 所述解释模块进一步包括:
别名解释单元,用于使用形式化的描述语言对别名分析规则进行描述;
漏洞模式解释单元,用于使用形式化的语言完整描述SQL注入等漏洞。
[0012]所述安全漏洞分析模块进一步包括:
污点数据引入单元,用于通过查询所述关系数据库,并与漏洞模式比对,找到将用户数据引入到所述Java源程序中的函数,并将其返回结果标记为污点数据;
污点数据传播单元,用于记录所述污点数据在所述Java源程序中的传播;
污点数据执行单元,通过查询所述关系数据库,并与漏洞模式比对,找到使所述污点数据执行的函数,并记录污点传播的过程。
[0013]由上述本发明提供的技术方案可以看出,该方法及装置能够全面而准确地检测Java源代码的安全缺陷,同时减少程序运算量,提高检测性能。
【专利附图】

【附图说明】
[0014]为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他附图。
[0015]图1为本发明实施例所提供Java源代码缺陷检测方法流程示意图;
图2为本发明实施例提供的对所述Java源程序进行指针别名分析的过程示意图; 图3为本发明实施例提供的对所述Java源程序进行污点分析的过程示意图;
图4为本发明实施例所提供Java源代码缺陷检测装置的结构示意图。
[0016]
【具体实施方式】
[0017]下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明的保护范围。
[0018]本发明实施例所述检测方法及装置针对的是Java的字节码,用于检测Java源代码的未验证输入漏洞中的SQL注入漏洞和跨站脚本漏洞,并生成缺陷报告。下面将结合附图对本发明实施例作进一步地详细描述,如图1所示为本发明实施例所提供Java源代码缺陷检测方法流程示意图,所述方法包括:
步骤11:对Java源程序字节码进行静态分析,生成函数调用图;
步骤12:根据所述函数调用图生成保存有所述Java源程序基本信息的关系数据库;步骤13:根据预先建立的漏洞模式,以关系数据库查询的方式对所述Java源程序进行指针别名分析和污点分析;
在该步骤中,本实施例提供了指针别名分析的方法,该方法全面而高效;此外本实施例还提供了污点分析的方法,全面而准确地分析了污点传播过程,减少了误报率和漏报率。
[0019]以关系数据库查询的方式对所述Java源程序进行指针别名分析的具体过程如图2所示,参考图2:
首先,在预处理阶段首先进行准备工作,即先获得每个函数调用图以及函数依赖分析生成的函数调用序列;
以main函数为入口,根据函数调用持续迭代计算每个过程的指针信息;
根据所述函数调用序列分别计算每个语句对所述指针信息的影响;
其中,在此框架中过程内分析与过程间分析是并行的,当在过程内分析,遇到函数调用时,则进行过程间的分析;当在过程间分析,如果将调用者名字空间内的信息映射(map)到被调用者名字空间中,则可进入过程间分析。
[0020]上述以关系数据库查询的方式对所述Java源程序进行污点分析的操作如图3所示,参考图3:
首先,通过查询所述关系数据库,并与漏洞模式比对,找到将用户数据引入到所述Java源程序中的函数,并将其返回结果标记为污点数据;
记录所述污点数据在所述Java源程序中的传播;
再通过查询所述关系数据库,并与漏洞模式比对,找到使所述污点数据执行的函数,并记录污点传播的过程。
[0021]另外,上述污点数据可以通过“普通操作”、“函数调用”、“函数返回”、“特殊函数调用及返回”四种方法在所述Java源程序中的传播,具体来说:
通过“普通操作”传播:普通操作既不是函数调用也不是函数返回。它不会产生污点数据,也不会使污点数据执行,但有可能传播或“杀死”污点数据。假设在状态为s e Stmt,上下文为vc e VC条件下,有普通操作X.fn=y.fm且m,n e N,其表示对x进行η次域操作,对I进行m次域操作,那么规则为:1)当y.fm.fp为污点数据时,则将X.fn的相应域也标记为污点数据;2)如果y.f的相应域不是污点数据,则将X.fn.fp去除。
[0022]通过“函数调用”传播:对于函数调用操作c.111(?...an),那么规则为:1)如果调用函数的对象c为污点数据,则在被调用函数中将this标记为污点数据;2)如果调用函数的实参为污点数据,则将被调用函数形参标记为污点数据;3)当某个字段为静态字段并且为污点数据时,在调用函数中将其标记为污点数据。
[0023]通过“函数返回”传播:对于函数调用操作p=c.!11(?...an),那么规则为:1)如果被调用上下文中this为污点数据,则将调用上下文中c标记为污点数据;2)如果被调用函数形参为污点数据,那么将调用函数的实参标记为污点数据;3)当函数的参数既不是基本变量(如int, char等),也不是不可变的变量(如String)时,如果该参数被标记为污点数据,那么在调用者的上下文vcl中也将其标记为污点数据。 [0024]通过“特殊函数调用及返回”传播:我们将特殊函数分为三种类型:1)源类型:即我们定义的sourceOO函数,该函数将污点数据引入到系统中;2)传播类型:即我们定义的PDerivation (v)和HDerivation (v)。其中derivation (V)是将污点数据从函数的参数传播的到函数的返回值(如String, append ()函数)或者函数的参数(如String, getchars O函数)。而HDerivation (V)是将污点数据从该函数所属类的对象传播到函数的返回值(如String.toStringO函数);3) sink类型:即我们定义的sink (V),该函数会将污点数据执行。
[0025]步骤14:根据污点分析的结果,产生缺陷报告。
[0026]通过上述步骤操作,对Java源程序字节码进行扫描,就可以发现Java源程序的安全缺陷。
[0027]基于上述的方法,本发明实施例还提供了一种Java源代码缺陷检测装置,如图4所示为本发明实施例所提供装置的结构示意图,所述装置包括:
程序识别模块,用于对Java源程序字节码进行静态分析,生成函数调用图,根据所述函数调用图生成保存有所述Java源程序基本信息的关系数据库;其中,后续的静态分析工作都会在这个中间表示形式的基础上进行;
解释模块,用于对Java源程序安全漏洞描述进行解释;该解释模块作为接口,很好的连接起了安全漏洞自身本质的分析和实际安全漏洞的分析两个部分;
静态数据流分析模块,用于根据预先建立的漏洞模式,以关系数据库查询的方式对所述Java源程序进行指针别名分析;该模炔基于程序的抽象表示形式,进行漏洞检测所需程序静态信息的收集,其中很重要的一部份是别名信息的收集;
安全漏洞分析模块,以关系数据库查询的方式对所述Java源程序进行污点分析,根据污点分析的结果,产生缺陷报告。
[0028]其中,所述解释模块进一步包括:
别名解释单元,用于使用形式化的描述语言对别名分析规则进行描述;别名解释单元解释这些行为描述,进而进行漏洞分析;
漏洞模式解释单元,用于使用形式化的语言完整描述SQL注入等漏洞;漏洞模式解释单元解释这些行为描述,进而进行漏洞分析。[0029]所述安全漏洞分析模块进一步包括:
污点数据引入单元,用于通过查询所述关系数据库,并与漏洞模式比对,找到将用户数据引入到所述Java源程序中的函数,并将其返回结果标记为污点数据;
污点数据传播单元,用于记录所述污点数据在所述Java源程序中的传播;
污点数据执行单元,通过查询所述关系数据库,并与漏洞模式比对,找到使所述污点数据执行的函数,并记录污点传播的过程。
[0030]综上所述,本发明实施例所提供的方法及装置可以有效地检测Java源代码中存在的安全缺陷,与其他静态分析方式相比,通过漏洞模式匹配的方法全面跟踪污点数据的引入及其在不同上下文中的传播过程,检测结果更加全面而准确;同时通过前向别名分析,减少了程序运算量,提高了检测性能。
[0031]以上所述,仅为本发明较佳的【具体实施方式】,但本发明的保护范围并不局限于此,任何熟悉本【技术领域】的技术人员在本发明披露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书的保护范围为准。
【权利要求】
1.一种Java源代码缺陷检测方法,其特征在于,所述方法包括: 对Java源程序字节码进行静态分析,生成函数调用图; 根据所述函数调用图生成保存有所述Java源程序基本信息的关系数据库; 根据预先建立的漏洞模式,以关系数据库查询的方式对所述Java源程序进行指针别名分析和污点分析; 根据污点分析的结果,产生缺陷报告。
2.根据权利要求1所述Java源代码缺陷检测方法,其特征在于,所述以关系数据库查询的方式对所述Java源程序进行指针别名分析,具体包括: 获得每个函数调用图以及函数依赖分析生成的函数调用序列; 以main函数为入口,根据函数调用持续迭代计算每个过程的指针信息; 根据所述函数调用序列 分别计算每个语句对所述指针信息的影响; 其中,在此框架中过程内分析与过程间分析是并行的,当在过程内分析,遇到函数调用时,则进行过程间的分析;当在过程间分析,如果将调用者名字空间内的信息映射到被调用者名字空间中,则可进入过程间分析。
3.根据权利要求1所述Java源代码缺陷检测方法,其特征在于,所述以关系数据库查询的方式对所述Java源程序进行污点分析,具体包括: 通过查询所述关系数据库,并与漏洞模式比对,找到将用户数据引入到所述Java源程序中的函数,并将其返回结果标记为污点数据; 记录所述污点数据在所述Java源程序中的传播; 通过查询所述关系数据库,并与漏洞模式比对,找到使所述污点数据执行的函数,并记录污点传播的过程。
4.一种Java源代码缺陷检测装置,其特征在于,所述装置包括: 程序识别模块,用于对Java源程序字节码进行静态分析,生成函数调用图,根据所述函数调用图生成保存有所述Java源程序基本信息的关系数据库; 解释模块,用于对Java源程序安全漏洞描述进行解释; 静态数据流分析模块,用于根据预先建立的漏洞模式,以关系数据库查询的方式对所述Java源程序进行指针别名分析; 安全漏洞分析模块,以关系数据库查询的方式对所述Java源程序进行污点分析,根据污点分析的结果,产生缺陷报告。
5.根据权利要求4所述Java源代码缺陷检测装置,其特征在于,所述解释模块进一步包括: 别名解释单元,用于使用形式化的描述语言对别名分析规则进行描述; 漏洞模式解释单元,用于使用形式化的语言完整描述SQL注入等漏洞。
6.根据权利要求4所述Java源代码缺陷检测装置,其特征在于,所述安全漏洞分析模块进一步包括: 污点数据引入单元,用于通过查询所述关系数据库,并与漏洞模式比对,找到将用户数据引入到所述Java源程序中的函数,并将其返回结果标记为污点数据; 污点数据传播单元,用于记录所述污点数据在所述Java源程序中的传播; 污点数据执行单元,通过查询所述关系数据库,并与漏洞模式比对,找到使所述污点数据执行的函数,并记录污点传播的过程。
【文档编号】G06F11/36GK104021084SQ201410277241
【公开日】2014年9月3日 申请日期:2014年6月19日 优先权日:2014年6月19日
【发明者】韩丽芳, 崔宝江, 侯婷婷, 刘楠, 高昆仑 申请人:国家电网公司, 中国电力科学研究院, 北京华夏信安科技有限公司, 江苏省电力公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1