本发明专利技术公开了一种基于控制流分析和数据流分析的Java程序静态分析方法,主要解决现有静态分析方法分析准确率低的问题。其实现步骤是:1.将Java源程序转化为Jimple语言的中间表示形式;2.将Java程序静态分析问题抽象为过程间分布式子集问题IFDS;3.定义过程间分布式子集问题IFDS求解器的接口类;4.通过求解器类接口中的数据流功能函数FlowFunctions<N,D,M>,设置数据流分析规则;5.运行过程间分布式子集问题IFDS,在控制流图的基础上进行数据流分析,得出分析结果。本发明专利技术提高了静态分析的完整性和准确性,分析效率高,扩展性强,可用对较大系统规模的程序分析。
【技术实现步骤摘要】
本专利技术涉及计算机安全领域,更进一步涉及一种检测分析方法,可用于对Java语言环境中的程序静态检测,实现对Java程序的分析。
技术介绍
Java语言,作为软件开发的代表性语言,以它独特的优势占据着市场的主要份额。Java语言是由美国SUN公司开发的一种面向对象的程序设计语言,它比C和C++语言有着更好的通用性、高效性、跨平台性以及安全性。开发者使用Java语言可大大提高软件开发的效率,但同时,随着软件程序代码规模的逐步增加,复杂度的提高,程序代码的检测就会变得越来越困难,这也使得人们在查找漏洞过程中面临更大的挑战。基于Java源程序的漏洞分析和检测现有的方法有很多种,从大的分类来看,其可分为程序执行过程中进行的检测即动态检测和程序源代码的分析检测即静态检测。国内外对Java程序的静态分析和动态分析已经有相当的经验和成果。其中主要针对Java程序语言的几种相对典型的问题,例如内存溢出、Java并行程序、Javaapplets、数组越界等都是人们在编写Java程序时常常出现或者遗漏在代码中的问题。动态分析最常用的是插桩技术,在程序运行过程中对被检测的代码段插入具有一定功能的检测代码,然后运行程序,收集程序运行过程中的相关信息,以发现程序运行的错误,从而达到检测代码中存在的漏洞的目标。动态分析的难点是有一定的盲目性,在无法预计程序功能块的前提下,盲目的插入检测代码到程序的逻辑块中,影响代码的时间复杂度和空间复杂度。静态分析不同于动态分析,它是在不运行程序的前提下,对程序的执行逻辑逐步分析,生成语法树和流程图,在对程序中某个功能块的分析已经完备的前提下,对程序的运行结果的可能性进行分析,得出结论。但这种静态分析有一定的限制,它只是在分析中去推测程序运行的结果中可能出现的问题,会出现误报或者漏报的情况,影响分析结果的准确性。
技术实现思路
本专利技术在目的在于针对上述现有静态分析的不足,提出一种基于控制流分析和数据流分析的Java程序静态检测方法,减小误报或者漏报,提高分析结果的准确性。为实现上述目的,本专利技术的技术方案包括:(1)使用开源工具Soot,将Java源程序转化为Jimple语言的中间表示形式,并对中间表示形式进行数据结构的拆分,建立抽象语法树,生成控制流图;(2)将Java程序静态分析问题抽象为过程间分布式子集问题IFDS,并以过程间分布式子集问题IFDS求解器的方式表示该过程间分布式子集问题IFDS;(3)定义过程间分布式子集问题IFDS求解器的接口类:3a)规定过程间分布式子集问题IFDS求解器接口类参数的形式,即用字母N表示节点参数,用字母D表示数据参数,用字母M表示方法参数,用字母V表示值参数,用字母G表示控制流图参数;3b)规定过程间分布式子集问题IFDS求解器的类接口的名称为:IFDSSlover<N,D,M,V,G>;3c)规定过程间分布式子集问题IFDS求解器的类接口IFDSSlover<N,D,M,V,G>中包含有如下四个功能函数:数据流函数FlowFunctions<N,D,M>,控制流图函数interproceduralCFG(),初始化种子函数initialSeeds(),零值表示函数zeroValue();(4)在数据流函数FlowFunctions<N,D,M>中设置数据流分析规则:4a)规定控制流图上节点的类型包括:普通节点,调用节点及返回节点;4b)根据节点的类型规定节点之间边的类型:若当前节点为普通节点,且当前节点的下一个节点为普通节点,则规定这两个节点之间边的类型为普通边;若当前节点为调用节点,且当前节点的下一个节点为普通节点,则规定这两个节点之间边的类型为调用边;若当前节点为返回节点,且当前节点的下一个节点为普通节点,则规定这两个节点之间边的类型为返回边;若当前节点为调用节点,且当前节点的下一个节点为返回节点,则规定这两个节点之间边的类型为调用返回边;4c)根据边的类型确定边上数据流分析的不同操作规程:对于普通边的操作是:先执行对应的控制流图边上的程序,再以数据等量赋值或数据空值截流的方式,将当前节点的数据传递给当前普通节点的下一个普通节点;对于调用边的操作是:先执行对应的控制流图边上的程序,再以变量名称替换和数据等量赋值的方式,将当前节点的数据传递给当前调用节点的下一个普通节点;对于返回边的操作是:先执行对应的控制流图边上的程序,再以变量名称替回和数据等量赋值或数据空值截流的方式,将当前节点的数据传递给当前返回节点的下一个普通节点;对于调用返回边的操作是:先执行对应的控制流图边上的程序,再以数据等量赋值或数据空值截流的方式,将当前节点的数据传递给返回节点。(5)运行过程间分布式子集问题IFDS求解器接口类IFDSSlover<N,D,M,V,G>,在控制流图的基础上进行数据流分析:5a)将控制流图传递给过程间分布式子集问题IFDS求解器接口类IFDSSlover<N,D,M,V,G>中的控制流图参数G,再通过控制流图参数G将控制流图填充到控制流图函数interproceduralCFG()中;5b)初始化种子函数initialSeeds(),即以控制流图的第一个节点为起始节点,生成初始化种子,从初始化种子节点开始按照控制流图的执行逻辑,应用数据流分析规则,进行数据流分析;5c)执行(4)数据流规则,根据步骤4c)数据流操作规程中的数据传递方式,确定具体的值传递操作方式:若传递方式为数据等量赋值,则直接将该值传递给下一个节点;若传递方式为数据空值截流,则先调用零值表示函数zeroValue()将空值转化为空值符号NULL,再将该空值符号NULL传递给下一个节点;5d)判断当前节点传递给下一个节点是否成功:若当前节点的下一个节点正确接收当前节点传递的等量值或空值符号NULL,则当前节点传递给下一个节点成功,跳转到步骤5e);若当前节点的下一个节点不能正确接收当前节点传递的等量值或空值符号NULL,则当前节点传递给下一个节点失败,退出数据流分析;5e)判断当前节点的下一个节点是否为最后一个节点:若当前节点的下一个节点不是最后一个节点,则从当前节点的下一个节点开始,返回5c);若果当前节点的下一个节点是最后一个节点,则数据流分析完成,输出最终结果。本专利技术与现有技术相比具有以下优点:1.分析效率高。本专利技术将J本文档来自技高网...

【技术保护点】
一种基于控制流分析和数据流分析的Java程序静态分析方法,包括:(1)使用开源工具Soot,将Java源程序转化为Jimple语言的中间表示形式,并对中间表示形式进行数据结构的拆分,建立抽象语法树,生成控制流图;(2)将Java程序静态分析问题抽象为过程间分布式子集问题IFDS,并以过程间分布式子集问题IFDS求解器的方式表示该过程间分布式子集问题IFDS;(3)定义过程间分布式子集问题IFDS求解器的接口类:3a)规定过程间分布式子集问题IFDS求解器接口类参数的形式,即用字母N表示节点参数,用字母D表示数据参数,用字母M表示方法参数,用字母V表示值参数,用字母G表示控制流图参数;3b)规定过程间分布式子集问题IFDS求解器的类接口的名称为:IFDSSlover<N,D,M,V,G>;3c)规定过程间分布式子集问题IFDS求解器的类接口IFDSSlover<N,D,M,V,G>中包含有如下四个功能函数:数据流函数FlowFunctions<N,D,M>,控制流图函数interproceduralCFG(),初始化种子函数initialSeeds(),零值表示函数zeroValue();(4)在数据流函数FlowFunctions<N,D,M>中设置数据流分析规则:4a)规定控制流图上节点的类型包括:普通节点,调用节点及返回节点;4b)根据节点的类型规定节点之间边的类型:若当前节点为普通节点,且当前节点的下一个节点为普通节点,则规定这两个节点之间边的类型为普通边;若当前节点为调用节点,且当前节点的下一个节点为普通节点,则规定这两个节点之间边的类型为调用边;若当前节点为返回节点,且当前节点的下一个节点为普通节点,则规定这两个节点之间边的类型为返回边;若当前节点为调用节点,且当前节点的下一个节点为返回节点,则规定这两个节点之间边的类型为调用返回边;4c)根据边的类型确定边上数据流分析的不同操作规程:对于普通边的操作是:先执行对应的控制流图边上的程序,再以数据等量赋值或数据空值截流的方式,将当前节点的数据传递给当前普通节点的下一个普通节点;对于调用边的操作是:先执行对应的控制流图边上的程序,再以变量名称替换和数据等量赋值的方式,将当前节点的数据传递给当前调用节点的下一个普通节点;对于返回边的操作是:先执行对应的控制流图边上的程序,再以变量名称替回和数据等量赋值或数据空值截流的方式,将当前节点的数据传递给当前返回节点的下一个普通节点;对于调用返回边的操作是:先执行对应的控制流图边上的程序,再以数据等量赋值或数据空值截流的方式,将当前节点的数据传递给返回节点。(5)运行过程间分布式子集问题IFDS求解器接口类IFDSSlover<N,D,M,V,G>,在控制流图的基础上进行数据流分析:5a)将控制流图传递给过程间分布式子集问题IFDS求解器接口类IFDSSlover<N,D,M,V,G>中的控制流图参数G,再通过控制流图参数G将控制流图填充到控制流图函数interproceduralCFG()中;5b)初始化种子函数initialSeeds(),即以控制流图的第一个节点为起始节点,生成初始化种子,从初始化种子节点开始按照控制流图的执行逻辑,应用数据流分析规则,进行数据流分析;5c)执行(4)数据流规则,根据步骤4c)数据流操作规程中的数据传递方式,确定具体的值传递操作方式:若传递方式为数据等量赋值,则直接将该值传递给下一个节点;若传递方式为数据空值截流,则先调用零值表示函数zeroValue()将空值转化为空值符号NULL,再将该空值符号NULL传递给下一个节点;5d)判断当前节点传递给下一个节点是否成功:若当前节点的下一个节点正确接收当前节点传递的等量值或空值符号NULL,则当前节点传递给下一个节点成功,跳转到步骤5e);若当前节点的下一个节点不能正确接收当前节点传递的等量值或空值符号NULL,则当前节点传递给下一个节点失败,退出数据流分析;5e)判断当前节点的下一个节点是否为最后一个节点:若当前节点的下一个节点不是最后一个节点,则从当前节点的下一个节点开始,返回5c);若果当前节点的下一个节点是最后一个节点,则数据流分析完成,输出最终结果。...
【技术特征摘要】
1.一种基于控制流分析和数据流分析的Java程序静态分析方法,包括:
(1)使用开源工具Soot,将Java源程序转化为Jimple语言的中间表示形式,并对中间表
示形式进行数据结构的拆分,建立抽象语法树,生成控制流图;
(2)将Java程序静态分析问题抽象为过程间分布式子集问题IFDS,并以过程间分布式
子集问题IFDS求解器的方式表示该过程间分布式子集问题IFDS;
(3)定义过程间分布式子集问题IFDS求解器的接口类:
3a)规定过程间分布式子集问题IFDS求解器接口类参数的形式,即用字母N表示节点
参数,用字母D表示数据参数,用字母M表示方法参数,用字母V表示值参数,用字母G
表示控制流图参数;
3b)规定过程间分布式子集问题IFDS求解器的类接口的名称为:
IFDSSlover<N,D,M,V,G>;
3c)规定过程间分布式子集问题IFDS求解器的类接口IFDSSlover<N,D,M,V,G>中包含
有如下四个功能函数:数据流函数FlowFunctions<N,D,M>,控制流图函数
interproceduralCFG(),初始化种子函数initialSeeds(),零值表示函数zeroValue();
(4)在数据流函数FlowFunctions<N,D,M>中设置数据流分析规则:
4a)规定控制流图上节点的类型包括:普通节点,调用节点及返回节点;
4b)根据节点的类型规定节点之间边的类型:
若当前节点为普通节点,且当前节点的下一个节点为普通节点,则规定这两个节点之间
边的类型为普通边;
若当前节点为调用节点,且当前节点的下一个节点为普通节点,则规定这两个节点之间
边的类型为调用边;
若当前节点为返回节点,且当前节点的下一个节点为普通节点,则规定这两个节点之间
边的类型为返回边;
若当前节点为调用节点,且当前节点的下一个节点为返回节点,则规定这两个节点之间
边的类型为调用返回边;
4c)根据边的类型确定边上数据流分析的不同操作规程:
对于普通边的操作是:先执行对应的控制流图边上的程序,再以数据等量赋值或数据空
\t值截流的方式,将当前节点的数据传递给当前普通节点的下一个普通节点;
对于调用边的操作是:先执行对应的控制流图边上的程序,再以变量名称替换和数据等
量赋值的方式,将当前节点的数据传递给当前调用节点的下一个普通节点;
对于返回边的操作是:先执行对应的控制流图边上的程序,再以变量名称替回和数据等
量赋值或数据空值截流的方式,将当前节点的数据传递给当前返回节点的下一个普通节点;
对于调用返回边的操作是:先执行对应的控制流图边上的程序,再以数据等量赋值或数
据空值截流的方式,将当前节点的数据传递给返回节点。
(5)运行过程间分布式子集问题IFDS求解器接口类IFDSSlover<N,D,M,V,G>,在控制流
图的基础上进行数据流分析:
5a)将控制流图传递给过程间分布式子集问题IFDS求解器接口类
IFDSSlover<N,D,M,V,G>中的控制流图参数G,再通过控制流图参数G将控制流图填...
【专利技术属性】
技术研发人员:王旭,杨超,孙聪,马建峰,纪倩,张邦元,金方圆,张鹏,
申请(专利权)人:西安电子科技大学,
类型:发明
国别省市:陕西;61
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。