基于程序切片技术的Web服务安全分析方法

文档序号:6442664阅读:678来源:国知局
专利名称:基于程序切片技术的Web服务安全分析方法
技术领域
本发明给出了一种基于程序切片技术的Web服务安全分析方案,主要分析Java语言开发的Web服务源代码中可能存在的安全漏洞,并对漏洞进行修复,属于Web服务安全的领域。
背景技术
随着Internet的迅速发展,大量网络应用体系结构应运而生,主要可分为B/S(Browser/Server)结构的纯Web应用方式和传统桌面程序的分布式应用。这些体系在当前都得到了大量的应用,并取得了较大的成功。Web服务使应用程序的集成比以前更快、更容易而且更便宜。Web服务集成在协议栈中较高层,可以实现业务功能的松散集成。很多企业之间和企业内部都可以通过Web来连接业务。企业内外都可以使用一致化编程模型的方法,通过基础设施并以ー种通用的方法进行应用程序集成。在利用现有的语言和平台以及旧应用程序的情况下,可以以ー种增量的方式来集成和应用Web服务。引领业界的许多公司,例如IBM、Microsoft以及Sun公司等,都支持Web服务,他们不仅在市场上推广Web服务,而且还各自开发和发布了自己的Web服务产品。此外,现有的许多工程应用类的产品都将Web服务的功能集成到它们的特征集中,这就意味着我们现在拥有大量的Web服务平台和可供利用的Web服务开发工具。随着Web服务的大规模使用,其安全问题却日益凸显。自从1988年的Morris病毒袭击应用程序以来,应用程序中存在的安全问题就呈几何级数增长,特别是近年来,随着Web 2.0的普及,互联网应用中的安全问题也越来越多,导致的损失也日益巨大。因此不管是从经济角度还是安全角度来考虑,怎样消除应用程序中存在的安全问题已经成为业界关注的重要课题。一般情况下,可以针对软件开发过程的不同阶段,包括需求分析、设计、编码、测试、维护等阶段,分别添加安全措施来减少软件中的安全问题,此过程有助于软件抵御外部恶意攻击。Web服务作为一种网络应用软件,构建在XML(Extensible Markup Language,可扩展标记语言)基础之上,提供了ー种面向服务的架构(Services Oriented Architecture,简称S0A)。在ー个分布式的计算环境中,Web服务器动态地描述、发布、发现和调用Web服务。随着Web服务普及程度越来越高,越来越多的攻击者将注意力都放到了对Web服务及服务器的攻击方面。攻击目的主要是试图恶意访问数据或者服务。Web服务安全问题引起了企业的注意,企业关注如何构建安全方案来保障企业间的Web服务的安全数据传输;研究如何既提高数据交互效率,又能提高安全性能。在保护Web服务的安全性方面,可以利用一些已经成熟的安全技术来实现,如基于防火墙的保护、使用SSL(Secure Sockets Layer,安全套接字层)、使用VPN(Virtual Private Network,虚拟私有网络)等。对于已经发布的Web服务,考虑到外部用户的攻击,可以设计入侵检测系统对外部用户身份进行验证;对于尚未发布的Web服务,可以考虑分析Web服务的源码,分析安全漏洞及它的传播与扩散情况,并采取相应的解决方案,达到增强安全性的目的。
Web服务被设计成能够通过防火墙的一种应用,这就导致Web服务暴露了更多的功能接口。Web服务允许连接不同的应用程序,使得Web服务面临很多的威胁和攻击,而且通常在一个Web服务的源代码中的许多接口可能有一些是其他一些重要接口的辅助函数,也可能是一些只能被Web服务管理员调用的一些重要接口。对于是辅助函数的接口,如果将其发布出去,不会造成严重的后果,但是如果将一些只能被管理员调用的重要接口发布出来,那么就是一个严重的Web服务安全漏洞。如果该接口被攻击者恶意使用,那么就会造成严重的后果。在实际发布的过程中,发布者往往使用一些工具直接对Web服务源代码进行发布,缺少必要的对待发布的Web服务源代码进行检测分析的过程,如果这些服务代码中就存在上述说的有安全漏洞的接口,发布这些接口就会产生安全漏洞,就会被攻击者利用。这样的安全问题往往难以被察觉,因此对于一个达到功能要求的Web服务来说,往往可能他的可靠性并没有达到设计者的要求。尽管Web服务发展很迅速,但是传统的一些Web服务安全技术并不能有效地保证Web服务的安全性,这阻碍了 Web服务更进一步的发展。传统的技术只是在Web服务发布以后进行一些保护措施,而实际上引发Web服务安全的漏洞并没有彻底被解决,存在安全漏洞的接口仍然暴露给用户,只是通过其他方法使得用户暂时不能访问,如果攻击者通过其他一些方法间接调用了存在安全漏洞的接口,同样可以对Web服务进行破坏。因此,需要在根源上对Web服务进行安全分析检测。由于Web服务的安全问题日益凸显,因此很多研究学者也对Web服务安全进入了深入的研究,提出了许多不同的方法,对Web服务各个层次的安全都进行了研究,包括Web服务的协议层、Web服务的实现层以及Web服务的应用层等等。有学者对现有的Web服务安全技术如XML签名、XML加密和ws-Security规范进行了详细的研究,在此基础上对网上商店的业务进行了安全设计。有学者实现了具有一定通用性的安全模型,能够提供一种端到端的安全解决方案,如加密机制、签名机制、安全管理、存取控制等等。有学者提出的安全措施既利用了一系列最新的、基于XML消息的Web服务安全技术,又包含了法律法规、管理制度、教育培训等非技术性措施。也有的学者着重分析研究了 XML加密解密、XML签名验证和XML密钥管理规范,介绍了基本原理和处理流程,提出了 Web服务安全性模型,这个基于消息层的Web服务安全模型不仅保证了 S0AP(Simple Object Access Protocol,简单对象访问协议)消息的机密性和完整性,还提供了端到端的安全性和可扩展性,对Web服务提供了全面的安全保障。在本发明中,我们创新性地使用了程序切片技术。程序切片的思想是于1979年在Mark Weiser博士论文中首次被建立的,程序切片在程序理解、分析、调试以及软件的测试、度量和维护等方面有着广泛的应用。程序切片可以被划分为前向切片和后向切片前向切片包含受该变量影响的所有语句和断言;后向切片包含影响该变量的所有语句和断言。程序切片还可分为静态切片和动态切片方法静态切片仅仅在静态程序中被使用,动态切片考虑输入值所带来的影响,更方便分析切片,但是存在着有效性的限制。直观上讲,程序切片技术可以根据服务间的依赖关系来发现服务所依赖的其他服务。在Web服务中,服务是与语言无关的,理论上,这个服务可以是使用任意语言编写的,可以是C,Java, Haskell等等一系列的语言。其中Haskell是现代的、描述式的、高价的 、纯函数式程序设计语言,具有代码简洁、安全可靠、无副作用、易扩展、易理解、高组合性等特性,它还拥有表达力强的语法,以及丰富的内置数据类型,包括任意精度的整数和有理数。国内外已有越来越多的程序设计爱好者使用该语言,用该语言实现的软件系统也越来越多,规模也越来越大。考虑到该Web服务分析方法的安全性和易用性,采用Haskell语言来实现本发明中的安全分析方法。参考文献[I]Web-Service website,2009. http://en. wikipedia. org/wiki/ffeb_service.[2]张迎周,徐宝文.一种新型形式化程序切片方法.中国科学E辑信息科学,2008,38 (2) :161-176.

发明内容
技术问题本发明提出一种基于程序切片技术的Web服务安全分析方法,主要目的是提供一种切实可行且有效的分析方法对Web服务的安全进行检 测及分析。技术方案该分析方案从Java开发的Web服务的源代码入手,对Java源码进行分析,构建基于程序切片技术的Web服务安全分析方法。一般的安全分析方法只对发布后的Web服务进行安全分析,但是有时候很多漏洞的源头是存在于源代码中的,并且往往这样的漏洞又是很危险的,因此我们提出了针对Web服务源代码的安全分析方法,对Web服务源代码分析并得到它的方法依赖图,根据方法依赖图,使用程序切片技术对Web服务安全漏洞进行分析,希望能从根本上去发现安全漏洞并对漏洞进行修复。最终使用服务发布和服务测试功能对本发明中的安全分析方法分析过的Web服务进行发布和测试,验证使用该方法修复过并发布的Web服务的安全漏洞是否存在。本发明提出了一种基于程序切片技术的Web服务安全分析方法,对Web服务源代码中存在的安全漏洞进行检测和修复,旨在将提高Web服务安全性能。本发明中的安全分析方法包含漏洞分类模块、代码分析模块、切片模块、漏洞修复模块、服务发布模块以及服务测试模块。本发明先通过漏洞分类模块对漏洞进行分类,然后使用代码分析模块对代码进行分析,得到Java代码中方法之间的依赖关系(即方法之间的调用关系),生成方法依赖图。之后使用切片模块对源代码和方法依赖图进行切片分析,检测源代码中每一种漏洞,并使用漏洞修复模块对漏洞进行修复,使Web服务具有更高的安全性。然后再使用服务发布模块将修复过的Web服务源代码进行发布。最后可以使用服务测试模块对修复过的Web服务进行安全性验证,证明本发明的安全分析方法的正确性以及有效性。每个模块的具体功能如下(I)漏洞分类模块这个模块对Web服务中的安全漏洞进行分类。我们认为一个Web服务源代码中肯定会存在一些存储私有信息的变量,我们将这些变量称作为关键信息。如果这些关键信息被修改的话,那么就有可能产生安全漏洞。一个Java方法可以直接修改关键信息的值(在定义中直接定义修改关键信息的语句,直接修改关键信息值),也可以间接修改关键信息的值(在定义中调用了修改关键信息的其他方法,间接修改关键信息值)。本模块根据关键信息被修改的方式,将安全漏洞分为显式漏洞(直接修改)和隐式漏洞(间接修改)。由此可见,通过方法之间的调用关系,显式漏洞可以导致隐式漏洞。(2)代码分析模块这个模块对Web服务的源代码进行分析,生成方法依赖图。方法依赖图是记录Web服务源代码中每个方法之间依赖关系的一个有向图。当一个方法被另一个方法调用了,这两个方法就会被记录在方法依赖图中,并用一个有向的直线连接它们,方向是从被调用的方法指向调用的方法。这个模块详细介绍了方法依赖图的概念以及方法依赖图中存在的依赖关系的类型(直接依赖,间接依赖)。这个模块中还给出了方法依赖图的生成方法以及详细的生成步骤。(3)切片模块在这个模块中,根据不同类型的安全漏洞,我们将切片方法分为语句级别的切片和方法级别的切片。对于显式漏洞,我们使用语句级别的切片对源代码中每ー个语句进行分析,抽取出那些直接修改关键信息值的语句,以此来检测出存在显式漏洞的方法。对于隐式漏洞,我们使用方法级别的切片对代码分析模块中得到的方法依赖图进行分析,分析显式漏洞在方法之间的传播与扩散情況,以此来检测存在隐式漏洞的方法。(4)漏洞修复模块在这个模块中,对切片模块中检测出来的具有显式和隐式漏洞的方法进行漏洞修复,保证这些不安全的方法在Web服务发布期间被隐藏,不被发布成服务接ロ,用户也就无法调用此方法对关键信息进行恶意篡改,进ー步提高Web服务的安全性。 (5)服务发布模块此模块使用Axis2对漏洞修复后的Web服务源代码进行发布。Axis2是ー个目前比较流行的Web服务引擎,使用Axis2可以实现Web服务发布。默认的Axis2发布流程包含的步骤比较多且过程比较繁琐,本模块借助源代码分析模块分析所得的信息以及用户所提供的基本信息,简化了发布过程,实现了服务的快速自动发布。(6)服务测试模块此模块主要用于对已经发布的Web服务进行测试并验证漏洞修复是否成功。对发布后的Web服务的WSDL文件(Web Services Description Language,Web服务描述语言)进行分析,自动生成测试数据、测试用例以及SOAP请求消息,然后把SOAP请求消息发送到Web服务器,获取SOAP反馈消息,根据反馈的结果来分析存在安全漏洞的服务操作的访问情況。如果存在安全漏洞的服务操作不能被访问,则说明本发明的安全分析方法的修复功能是可行的。具体方法如下该方法对安全漏洞进行分类,分为显式漏洞和隐式漏洞,针对显式漏洞,使用程序切片技术对Web服务的Java源代码中的语句进行语法解析,以此来检测显式漏洞;针对隐式漏洞,以图论知识为理论基础,以程序切片为技术手段,根据Web服务的Java源代码中的方法之间的依赖关系,生成方法依赖图并对其切片,以此来检测隐式漏洞;该安全漏洞检测方法包括漏洞分类模块、代码分析模块、切片模块、漏洞修复模块、服务发布模块以及服务测试模块;该方法从Java语言开发的Web服务着手,根据Web服务Java源代码中的语法结构以及Java方法之间的依赖关系,结合切片技术对其中的安全漏洞进行检测与修复,并实现对修复后的Web服务进行发布以及测试功能;该方法具体包含以下步骤步骤I :将用户提供的Web服务的Java源代码作为输入;步骤2 :用代码分析模块对Web服务的Java源代码进行语法解析,得到一个中间类型结构以及记录Java方法之间依赖关系的ー个Method类型的列表;步骤3 :根据步骤2中的中间类型结构记录的方法之间的调用关系,使用依赖图生成算法生成依赖关系集合S1 ;步骤4 :根据步骤2中的Method类型的列表中记录的方法之间的依赖关系,使用依赖图生成算法生成方法依赖关系集合S2 ;步骤5 :对步骤3和4中的两个集合S1和S2使用并集操作,得到一个新的依赖关系集合,根据该集合生成Web服务源代码的方法依赖图;步骤6 :检测显式漏洞,使用程序切片技术对Java源代码中修改了关键信息的语句进行语法解析,得到一个包含显式漏洞的不安全方法的列表;步骤7 :检测隐式漏洞,使用程序切片技术,将步骤6中得到的包含显式漏洞的不安全方法的列表作为切片节点,对步骤5中生成的方法依赖图进行切片,得到的最终结果是一个包含隐式漏洞的不安全方法列表;步骤8 :合并步骤6和步骤7中的不安全方法列表得一个新的不安全方法列表,这个列表就是安全检测得到的最终的不安全方法的列表;步骤9 :根据步骤8中的不安全方法列表,使用漏洞修复模块对源代码中的不安全方法的关键词进行修改,如果不安全方法的关键词是public,则改为private,如果不安全方法的关键词是除了 public以外的关键词,则保持不变,最终将修改后的代码作为Web服务新的源代码;步骤10 :用户提供Axis2平台所在的路径、Web服务的名称以及相应的描述信息;步骤11 :根据用户在步骤10提供的信息,使用Axis2平台和服务发布模块,实现对Web服务的自动发布;步骤12 :对发布后的Web服务进行测试,使用服务测试模块的功能生成测试用例并对Web服务中发布的操作进行自动测试,验证被修复过的漏洞是否还存在。有益效果本发明中的Web服务安全分析方法从Web服务的源代码着手,分析源代码中的方法对关键信息的修改情况以及方法之间的依赖关系,使用程序切片技术检测安全漏洞,并提供修复、发布以及测试功能。本发明具有以下的一些特点及创新之处 根据对关键信息的修改方式的不同进行安全漏洞的分类本发明根据Web服务Java源代码中方法对关键信息的修改方式的不同,将安全漏洞分为显式漏洞和隐式漏洞。包含显式或者隐式漏洞的方法都是不安全方法。本发明中的安全分析方法针对这两种类型的漏洞对代码进行全面分析,可以有效提高漏洞分析结果的全面性,降低漏洞检测过程中发生漏检和错检的概率。 基于方法调用关系的依赖图生成算法本发明着重对方法之间的调用关系进行分析,将这种调用关系看成是一种依赖关系,并提出使用方法依赖图对方法之间的依赖关系进行记录。本发明中详细介绍了方法依赖图的概念以及性质,并将依赖关系分为直接依赖和间接依赖。除此之外,还详细地介绍了依赖图的生成算法,即如何从源代码生成该源代码的方法依赖图。先对源代码进行分析,对其中的方法调用语句进行抽取,然后根据这些语句生成方法依赖二元组的集合,最后根据这个方法依赖二元组集合中的记录生成方法依赖图。方法依赖图可以很好的反应方法之间的调用和被调用的关系,可以更好的帮助我们的安全分析方法对源程序进行分析和理解。 为不同类型的安全漏洞设计不同的切片方法本发明中,针对不同类型的安全漏洞,设计了不同类型的切片方法。对于存在显式漏洞的方法,其在修改关键信息的时候是直接修改的,因此在检测此类安全漏洞的时候,只需要对方法定义体中的语句进行检测,看其是否修改了关键信息的值,所以在检测显式漏洞的时候,本发明使用的是语法级别的切 片,就是传统对语句进行分析和抽取的切片方法,根据切片结果判断是否存在显式漏洞。对于存在隐式漏洞的方法,其在修改关键信息的时候是间接修改的,即通过方法之间的调用关系进行间接修改,因此在检测此类安全漏洞的时候,需要对方法之间的调用关系进行分析,本发明中使用的是方法级别的切片,对分析源代码后得到的方法依赖图进行切片,根据切片后的依赖子图判断是否存在隐式漏洞。
基于代码重写方法的安全漏洞的修复在本发明中,使用Axis2进行Web服务的发布。Axis2是用Java语言开发的ー个简单、方便使用的Web服务引擎,用来完成Web服务的发布以及部署。而我们的安全分析方法也是主要针对Java语言开发的Web服务,因此从语言的兼容性以及使用方便程度等因素考虑,选择Axis2作为本发明中的Web服务发布平台。在发布前,我们首先要将检测出的安全漏洞进行修复。根据Axis2平台只发布“public”方法的特点,使用代码重写方法将Web服务源代码中存在安全漏洞的方法的关键词由“public”修改为“private”,达到在Web服务发布阶段屏蔽不安全方法的目的。 便捷的发布过程以及自动测试功能使用Axis2发布时,需要手动配置ー些文件,步骤比较繁琐,甚至还需要一定的XML技术基础,例如在配置过程中需要编写XML文件。本发明实现了 Web服务的自动发布,用户只需提供例如服务名等这些简单的信息就可以实现Web服务发布。在服务发布之后,本发明还给出了 Web服务自动测试方法,可以对修复后的服务进行验证,验证漏洞修复成功与否。


图I是本发明中的安全分析方法的一个整体的流程框架图。图2描述了分析Method类型列表的算法流程图。图3描述了语句级别的切片算法的算法流程图。图4描述了方法级别的切片算法的算法流程图。图5描述了漏洞修复模块的流程图。图6给出了服务发布模块的流程图。
具体实施例方式本发明中的Web服务安全分析方法包含漏洞分类模块、代码分析模块、切片模块、漏洞修复模块、服务发布模块以及服务测试模块。图I给出了本发明平台的一个整体的流程框架,描述了各个模块的工作流程。下面的内容是对本发明中的各个模块在实现上的详细描述。I,漏洞分类模块在Web服务的源代码中,或多或少会存在一些存储与服务相关的私有变量,这些变量如果被恶意修改后,可能就会导致ー些严重后果,因此除了 Web服务的开发者或者管理者,其他人员是无权修改这些变量的。在本发明中,我们将这些变量称作关键信息。Java源代码中可能存在很多方法会调用或者修改这些关键变量,对于仅仅只是调用这些变量的方法来说,发布后不会造成严重后果,因为用户通过这个方法无法修改关键信息的值,但是对于那些修改关键变量的方法,发布后就会造成严重后果,因为用户可以通过调用这个方法达到恶意篡改关键信息的目的。因此,这些修改了关键信息的方法就是存在安全漏洞的方法。这些不安全的方法在进行安全分析的时候,要被检测出来并进行修复。在本发明中,我们根据方法对关键信息的修改方式,将Web服务源代码中的安全漏洞分为显式漏洞和隐式漏洞。定义I :显式漏洞(直接修改关键信息)当Web服务源代码中的方法的定义体中直接包含修改关键信息的语句时,就会导致显式漏洞,这个方法就是一个包含显式漏洞的不安全方法。其实这样的安全漏洞还是比较容易被发现的,因为直接修改关键信息的语句可以在方法的定义里面找到,但是当代码量巨大的时候,还是需要使用程序自动进行分析的。定义2 隐式漏洞(间接修改关键信息)当Web服务源代码中的方法的定义体中并不包含直接修改关键信息的语句,但是这个方法的定义中却包含调用其他方法的语句,而被调用的方法是一个可以修改关键信息的方法时,就会导致隐式漏洞,这个方法就是一个包含隐式漏洞的不安全方法。可见除了直接修改关键信息外,Web服务源代码中的方法也可以间接修改关键信息。这种间接修改往往很难被发现,因其是通过调用其他方法而修改关键信息的。 通过对安全漏洞进行分类可以使得我们的安全分析方法在检测安全漏洞的时候能够定制不同的方法对不同的漏洞进行检测,使得检测过程更有目的性,减少错检和漏检的概率。2,代码分析模块代码分析模块的主要作用就是生成Web服务源代码的方法依赖图。首先介绍一下方法依赖图的概念以及相关定义。定义I :方法依赖图(method dependence graph, MDG)方法依赖图是一个表示方法依赖关系二元组集合的有向图。一个依赖关系二元组(a, b)表示的是方法b调用方法a,可以说成方法b依赖方法a或者a被依赖于b,在图中用一条有向直线连接方法a和方法b,并且直线方向是由被调用方法指向调用它的方法,也就是由a指向b。方法依赖图显示了 Java源代码中方法之间的调用与被调用关系。在方法依赖图中,方法之间的关系可以被分为两种基本的依赖关系直接依赖关系和间接依赖关系。定义2 :直接依赖关系(direct dependence relation, DDR)如果方法b的定义中直接调用了方法a,那么方法a、b之间的依赖关系就称为直接依赖关系,用二元组(a,b)表示,在图中用一个带有箭头的实线连接a、b,箭头方向为a指向b,表示b依赖a。定义3 :间接依赖关系(indirect dependence relation, I DR)因直接依赖关系而产生依赖的两个方法之间的关系称为间接依赖关系。例如方法c直接调用b,方法b直接调用方法a,那么方法c就会通过方法b间接调用方法a,方法a和c之间的关系就是间接依赖关系。间接依赖关系其实就是直接依赖关系之间的传递。例如,由直接依赖关系(a,b)和(b,c),可以得出a和c之间的关系是间接依赖关系。本发明使用Haskell的语言对Java源码进行预处理,得到方法之间的依赖关系二元组集合,最后通过绘图软件生成最终的方法依赖图。我们定义了一个processMethods函数去处理Java代码中的方法,并得到依赖关系二元组集合[(BeCalled, Calling)]。该函数的定义如下
processMethods::[Methodlnvocation]- > [(BeCalled, Calling)]使用该函数可以生成依赖关系ニ元组集合,但是为了生成的结果尽量准确,我们还使用了另ー种方法对其进行生成。在此方法中,通过分析源代码文件,生成了ー个递归类型Method的列表,Method类型的定义如下data Method = {Name, Paras, Return, Location, Method}这个Method类型中记录了方法的名称,方法的參数,方法的返回类型,方法在代码中的位置以及该方法定义中调用的其他方法。我们对Method类型的列表进行分析,就可以得到依赖关系ニ元组集合。Method类型是ー个递归类型,设计ー个递归算法对Method类型进行分析。这个递 归算法的具体步骤如下步骤I :先建立ー个集合S (初始值为空)来储存得到的依赖关系ニ元组集合;建立一个变量η,记录Method类型的个数,Method类型指针指在Method列表的第一个元素;步骤2 :如果η的值为0,则表示所有的Method类型已经分析结束,返回集合S,否则执行步骤3 ;步骤3 :检查Method类型指针所指的元素,看这个元素中的Method定义是否为空,如果为空,那么η的值减1,Method类型指针往后移动ー个,然后继续执行步骤2,如果不为空,则根据Method的记录生成一个关系ニ元组,并将其加入到步骤I中的集合S中,然后η的值减1,Method类型指针往后移动ー个,继续执行步骤2。图2给出了此算法的算法流程图。在图2中,M是ー个指向Method列表的第一个Method元素的指针。一般情况下,使用processMethods函数得到的依赖图集合应该和使用对Method列表进行分析的方法所得到的依赖关系集合相等,但是为了保证依赖集合的正确性与全面性,我们对两个集合进行并集操作。在得到关系依赖ニ元组集合后,需要根据它来生成方法依赖图。文中使用了第三方软件Graphviz进行方法依赖图的绘制。Graphviz是开源可视化图形软件,实现了图的布局与生成。文中主要使用的是Graphviz中的dot工具。dot是ー个根据文本信息生成有向图的工具。只要用户遵循一定的规则编写ー个dot格式的脚本文件,然后就可以使用dot工具进行画图。既然选择使用dot来绘制方法依赖图,那么就需要将关系依赖ニ元组集合记录到dot脚本文件中。为了更好的表示依赖关系ニ元组,定义了ー个关系类型,定义如下type Rel a b = Set (a, b)定义了ー个Rel类型。ー个Rel类型就表示ー个集合。依赖关系ニ元组中记录的是方法名称,因此可以用Rel String String来表示依赖关系ニ元组集合Set (String,String)。对Java源代码进行分析后得到的是ー个依赖关系ニ元组的列表[(BeCalled,Calling)],因此须先将此列表转化为上述的关系类型。在此,使用了 IistToSet函数,此函数的声明如下IistToSet: : [a]- > Set aa表示任意类型,在处理依赖关系ニ元组集合吋,IistToSet的类型就是[(BeCalled, Calling)] - > Set (BeCalled, Calling)。又定义了 createEadges,用来生成dot文件中边的相关信息,其定义如下createEdge::(String, String)- > StringcreateEdges::[(String, String)]- > StringcreateEdges edges = map createEdge edges在createEdges函数中,使用了 setToList函数将Rel类型转化为依赖关系ニ元组集合,然后使用map函数对集 合中的每ー个关系ニ元组进行createEdge操作,之后将得到的所有字符串都写入到文件中,生成dot格式的脚本文件,最后使用dot命令进行图形的绘制。方法依赖图的生成总结起来有如下几个步骤步骤I :首先获取源文件,对其进行预处理,得到中间结构类型以及Method类型列表;步骤2 :对中间类型进行分析,得到依赖关系ニ元组集合S1 ;步骤3 :对Method类型列表进行分析,得到依赖关系ニ元组集合S2 ;步骤4 :对S1和S2执行并集操作,得到最終的依赖关系ニ元组集合S ;步骤5 :根据依赖关系ニ元组集合S,生成方法依赖关系图的dot脚本文件;步骤6 :根据dot脚本文件,使用dot工具,生成最終的方法依赖关系图。3,切片模块本发明在切片模块中针对漏洞分类模块中的每ー种漏洞都提出了相应的切片算法,可以提高漏洞的检测率。针对显式漏洞,我们采用语句级别的切片方法,对方法定义中直接修改关键信息的语句进行抽取与分析,针对隐式漏洞,我们采用方法级别的切片对方法之间的依赖关系进行抽取与分析,以此来发现间接修改关键信息的方法。3. I语句级别的切片方法针对显式漏洞,主要是分析代码中对关键信息直接进行修改的语句,使用语句级别的切片方法将这些语句抽取出来,这些语句就是显式漏洞,而具有这些语句的方法则是不安全方法。本切片方法以Java源代码和关键信息作为输入,输出的就是存在显式漏洞的不安全方法,具体切片步骤如下步骤I :分析Java源代码中各个方法的定义,并将他们的定义存在集合S中;步骤2:分析集合S中的方法的定义,将没有使用到关键信息的方法的定义从集合S中移去;步骤3 :再分析集合S,将其中只是引用了关键信息而并没有直接修改关键信息的方法从集合S中移去;步骤4 :对集合S中的定义进行处理,保存集合S中方法的名称在一个新的集合M中,返回M作为本切片算法的最終結果。图3给出了该语法级别切片算法的流程图。3. 2方法级别的切片针对隐式漏洞,已经不能单纯使用传统的语句级别的切片对其进行分析了,因为语句级别的切片只能分析语法,不能分析方法之间的依赖关系,所以我们使用方法级别的切片,将切片算法的研究对象扩大到方法上,通过分析方法之间的调用依赖关系,对生成的方法依赖图进行切片,进而完成隐式漏洞的检测。在该切片算法的步骤中,输入是原始依赖关系集合,输出是切片依赖关系集合,该集合中记录的元素就是存在隐式漏洞的不安全方法,算法的具体步骤如下步骤I :创建一个集合S (初始值为空)存储切片得到的依赖关系二元组集合,一个集合D(D的初始值为切片起点)存储节点的直接依赖节点;步骤2 :如果集合D为空,则返回集合S作为切片的结果。如果集合D不为空,则对于集合D中的所有节点搜索它们的直接依赖关系(假设存储在集合R中),以及所有节点的直接依赖节点(假设存储在集合N中,如果已经到达最底层的叶子节点,则集合为空,表明最底层叶子节点不再存在直接依赖关系以及直接依赖节点);步骤3 :将步骤2中得到的直接依赖关系二元组集合R加入到集合S中。将步骤2中得到的直接依赖节点集合N赋值给D,再次执行步骤2。此切片算法的算法流程图如图4所示。4,漏洞修复模块此模块的主要用途是对利用切片模块检测到的不安全漏洞进行修复。本发明中用到的发布平台是Axis2平台。Axis2是目前比较流行的Web服务引擎。使用Axis2,可以将Java源代码发布为Web服务。Axis2默认发布的是公有类中的公有方法,即被定义在public类中的被public修饰的方法是默认被发布的,而被其他关键词修饰的方法是默认不被发布的,因此我们可以采用代码重写的方法,对存在安全漏洞的方法的关键词进行改写,将public改为private,即可完成漏洞的修复。为了实现这样的功能,定义了如下的函数modifyJFile::[MethodName]- > FilePath- > String参数[MethodName]是存在安全漏洞的不安全方法的列表,参数Filepath是Java源代码文件,返回类型是修改后的Java代码的字符串。这个函数在执行的时候,首先分析Java源文件,获取所有方法的定义,然后修改存在安全漏洞的方法的定义,将它们的关键词修改为private。具体步骤如下,其中输入是Java源代码以及不安全的方法,输出是经过漏洞修复后的代码。该模块的流程图如图5所示。步骤I :使用切片模块对源代码进行分析,检测其中的不安全方法,记录在集合S中;步骤2 :分析集合S中方法的定义,如果其关键词是public,则修改为private ;步骤3 :分析集合S中方法的定义,如果其关键词是其他的,则保持不变;步骤4 :用修改后的定义代替原来的定义,并将修改后的代码作为输出。5,服务发布模块本模块使用Axis2平台进行服务发布。Axis2官方手册中关于使用Axis2进行发布的步骤过于繁琐,其中需要人工进行参与的工作也很多,而且很多工作是需要有一定XML技术基础的人才能完成的,例如build, xml以及services, xml文件的编写。因此,在此模块中,我们设计了一个自动发布方法,使得普通用户能够很方便快捷的发布Web服务。该方法只需用户提供Web服务的Java源文件所在的路径,Axis2平台所在的路径以及服务的描述及服务的名称。具体的发布步骤如下步骤I :分析java源程序,获得这个Java文件的package定义(使用services,xml进行发布的java源程序必须存在package定义); 步骤2 :根据用户提供的信息生成一个build, xml的配置信息。这些信息包括源文件目录,Axis2目录以及要发布的Java方法;步骤3 :使用基于切片的安全分析方法对待发布Web服务源代码进行分析,得到不安全方法的列表,并使用代码重写技术对源代码进行修改,屏蔽不安全方法;步骤4 :分析build, xml文件,生成ServiceInfo类型,获得Java源代码目录以及Axis2的目录;步骤5 :根据ServiceInfo记录的信息来生成services, xml,并新建META-INF目录,并将services, xml保存到该目录下;步骤6 :编译Java源代码(代码重写方法修改过的源代码),保存在classes目录下; 步骤7 :将classes和META-INF目录进行打包,生成后缀名为.arr的文件,并将这个文件移动到Axis2的目录下,实现Web服务的发布。其中步骤3是对Web服务源代码进行安全检测,使Web服务在自动被发布的前提下能够达到安全性能的要求。图6给出了服务发布模块的流程图。6,服务测试模块该模块主要实现了对已经发布的Web服务进行测试的功能。该测试模块可以测试在本发明中已经被修复的漏洞是否还存在,以此来验证本发明的安全分析方法的正确性。该模块包含WSDL分析器、测试数据生成器、测试用例生成器以及Web服务自动测试器。> WSDL分析器对发布的服务的WSDL文件进行分析,获取服务接ロ的參数类型。>测试数据生成器根据WSDL分析器得到的結果,自动生成与类型相符合的參数值。>测试用例生成器自动生成Web服务的测试用例。>自动测试器自动将生成的测试用例发送到Web服务器端,并解析反馈消息,返回测试結果。
权利要求
1.一种基于程序切片技术的Web服务安全漏洞检测方法,其特征在于该方法对安全漏洞进行分类,分为显式漏洞和隐式漏洞;针对显式漏洞,使用程序切片技术对Web服务的Java源代码中的语句进行语法解析,以此来检测显式漏洞;针对隐式漏洞,以图论知识为理论基础,以程序切片为技术手段,根据Web服务的Java源代码中的方法之间的依赖关系,生成方法依赖图并对其切片,以此来检测隐式漏洞;该安全漏洞检测方法包括漏洞分类模块、代码分析模块、切片模块、漏洞修复模块、服务发布模块以及服务测试模块;该方法从Java语言开发的Web服务着手,根据Web服务Java源代码中的语法结构以及Java方法之间的依赖关系,结合切片技术对其中的安全漏洞进行检测与修复,并实现对修复后的Web服务进行发布以及测试功能;该方法具体包含以下步骤 步骤I :将用户提供的Web服务的Java源代码作为输入; 步骤2 :用代码分析模块对Web服务的Java源代码进行语法解析,得到ー个中间类型结构以及记录Java方法之间依赖关系的ー个Method类型的列表; 步骤3 :根据步骤2中的中间类型结构记录的方法之间的调用关系,使用依赖图生成算法生成依赖关系集合S1 ; 步骤4 :根据步骤2中的Method类型的列表中记录的方法之间的依赖关系,使用依赖图生成算法生成方法依赖关系集合S2 ; 步骤5 :对步骤3和4中的两个集合S1和S2使用并集操作,得到一个新的依赖关系集合,根据该集合生成Web服务源代码的方法依赖图; 步骤6 :检测显式漏洞,使用程序切片技术对Java源代码中修改了关键信息的语句进行语法解析,得到ー个包含显式漏洞的不安全方法的列表; 步骤7 :检测隐式漏洞,使用程序切片技木,将步骤6中得到的包含显式漏洞的不安全方法的列表作为切片节点,对步骤5中生成的方法依赖图进行切片,得到的最終结果是一个包含隐式漏洞的不安全方法列表; 步骤8 :合并步骤6和步骤7中的不安全方法列表得一个新的不安全方法列表,这个列表就是安全检测得到的最終的不安全方法的列表; 步骤9 :根据步骤8中的不安全方法列表,使用漏洞修复模块对源代码中的不安全方法的关键词进行修改,如果不安全方法的关键词是public,则改为private,如果不安全方法的关键词是除了 public以外的关键词,则保持不变,最終将修改后的代码作为Web服务新的源代码; 步骤10 :用户提供Axis2平台所在的路径、Web服务的名称以及相应的描述信息; 步骤11 :根据用户在步骤10提供的信息,使用Axis2平台和服务发布模块,实现对Web服务的自动发布; 步骤12 :对发布后的Web服务进行测试,使用服务测试模块的功能生成测试用例并对Web服务中发布的操作进行自动测试,验证被修复过的漏洞是否还存在。
全文摘要
本发明给出了一种基于程序切片技术的Web服务安全分析方法,该发明以Java开发的Web服务为研究对象,以Java源代码中的关键信息作为研究出发点,将Java源代码中的漏洞分为显式漏洞和隐式漏洞两种。对于显式漏洞的检测,可以通过传统的语句级别的切片对源代码进行分析和抽取,得到显式漏洞的分析结果。对于隐式漏洞的检测,该方法首先分析了源代码中方法之间的依赖关系,生成了方法依赖图,并使用方法级别的切片对方法依赖图进行切片,得到隐式漏洞的分析结果。结合对显式和隐式漏洞的分析,使用漏洞修复模块对漏洞进行修复,并使用服务发布模块对修复过的Web服务进行发布。
文档编号G06F21/22GK102622556SQ20111043543
公开日2012年8月1日 申请日期2011年12月22日 优先权日2011年12月22日
发明者刘玲玲, 周国强, 张卫丰, 张迎周, 朱宪庭, 符炜, 许晓曼, 邹德国, 郑梁须, 顾帅帅 申请人:南京邮电大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1