一种应用程序的漏洞检测方法和装置的制作方法

文档序号:6441413阅读:388来源:国知局
专利名称:一种应用程序的漏洞检测方法和装置的制作方法
技术领域
本申请涉及网络数据处理领域,特别涉及一种应用程序的漏洞检测方法和装置。
背景技术
应用程序是指为了完成某项或某几项特定任务而被开发运行于操作系统之上的计算机程序。PHP(超级文本预处理语言,Hypertext Preprocessor)应用程序是众多应用程序中的一种,PHP是一种HTML(超文本标记语言,Hypertext Markup Language)内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言。PHP是将应用程序嵌入HTML文档中去执行,因为在执行过程中需要保证正确无误,所以对PHP应用程序的漏洞检测就十分必要。现有技术中有一种对应用程序进行漏洞检测的方法,以PHP应用程序为例,主要基于对应用程序源代码进行静态分析来实现的。根据输入的PHP源代码,先根据语法与语义抽象出足够多的信息得到抽象语法树,再根据规则库分析程序的结构与关键特征,从而获得程序的安全风险,再参照规则库的相关语法与语义进行比对,将最终确定的漏洞提交给用户。但是现有技术因为是对源代码进行静态分析的,即是分析过程中不会执行该源代码,所以有些在源代码运行时才会产生的运行流程是无法捕捉到的,这就导致源代码中的有些必须要执行才能产生的漏洞无法全部检测得到,而源代码的漏洞如果检测不完全,就会导致应用程序在实际执行时导致执行应用程序的计算机系统被入侵或者瘫痪。

发明内容
本申请提供一种应用程序的漏洞检测方法,用以解决现有技术中由于源代码的漏洞检测不完全,导致的应用程序在实际执行时,影响执行应用程序的计算机系统运行性能,甚至会导致瘫痪的问题。本申请还提供了一种应用程序的漏洞检测装置,用以保证上述方法在实际中的实现及应用。为了解决上述问题,本申请公开了一种应用程序的漏洞检测方法,包括:编译器将待检测的应用程序的源代码编译为虚拟执行代码;虚拟执行器在执行所述虚拟执行代码的过程中进行漏洞检测,所述漏洞检测的过程包括:依据存储器中存储的脏变量集合、脏函数集合、保留函数规则库和清理函数规则库,虚拟执行器识别当前生成的脏变量;所述脏函数的返回值为脏变量;依据所述脏变量和所述存储器中的漏洞规则库,虚拟执行器检测当前调用函数的过程是否存在漏洞,所述漏洞规则库用于保存漏洞规则。本申请公开了一种应用程序的漏洞检测装置,包括:该装置包括编译器和虚拟执行器,所述虚拟执行器包括脏变量识别模块和漏洞检测模块;所述编译器,用于将待检测的应用程序的源代码编译为虚拟执行代码;所述脏变量识别模块,用于依据存储器中存储的初始脏变量集合、脏函数集合、保留函数规则库和清理函数规则库,识别当前生成的脏变量;所述脏函数的返回值为脏变量;所述漏洞检测模块,用于依据所述脏变量和所述存储器中的漏洞规则库,检测当前调用函数的过程是否存在漏洞,所述漏洞规则库用于保存漏洞规则。与现有技术相比,本申请包括以下优点:本申请实施例因为在虚拟执行过程中对漏洞进行检测,所以可以将源代码的漏洞检测的更完全,这样就会避免应用程序在实际执行时给执行应用程序的计算机系统带来更大的影响,也会借此而提升计算机系统运行的性能,避免执行应用程序的计算机系统的被入侵或者瘫痪。进一步的,因为根据实际应用场景的不同,或者根据每次漏洞检测时待检测的漏洞情况不同,后续还可以通过对脏变量集合和脏函数集合的调整而使得每一次都能识别出符合实际场景需求的脏变量,并且进一步通过对漏洞规则的调整也能够使得检测出的漏洞及漏洞类型更能符合场景需求。进一步的,本实施例中检测出的漏洞类型还能够更有利于调整漏洞规则,以及后续对源代码的调整。当然,实施本申请的任一产品并不一定需要同时达到以上所述的所有优点。


为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。图1是本申请的一种超级文本预处理语言PHP应用程序的漏洞检测方法实施例1的流程图;图2是在本申请方法实施例1中识别脏变量的流程图;图3是本申请方法实施例1中步骤103的流程图;图4本申请的一种超级文本预处理语言PHP应用程序的漏洞检测方法实施例2的流程图;图5本申请的一种超级文本预处理语言PHP应用程序的漏洞检测方法实施例3的流程图;图6是本申请的一种超级文本预处理语言PHP应用程序的漏洞检测装置实施例1的结构框图;图7是本申请装置实施例1中识别模块621的结构框图;图8是本申请装置实施例1中检测模块622的结构框图;图9是本申请的一种超级文本预处理语言PHP应用程序的漏洞检测装置实施例2的结构框图;图10是本申请的一种超级文本预处理语言PHP应用程序的漏洞检测装置实施例 3的结构框图。
具体实施例方式下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。本申请可用于众多通用或专用的计算装置环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器装置、包括以上任何装置或设备的分布式计算环境等等。本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。本申请的主要思想之一可以包括,因为对于应用程序的源代码来讲,一些漏洞只有在其执行的时候才会发现,所以本申请实施例采用虚拟执行的技术来检测源代码中存在的漏洞,具体可通过预先设置脏变量集合、脏函数集合、保留函数规则库和清理函数规则库的方式先识别出虚拟执行代码中的脏变量,再看在调用函数的过程是否这些脏变量作为实际参数传递给函数的风险形参,并结合风险形参与脏变量的逻辑与运算结果确定一个函数在调用过程中是否产生漏洞。可见本申请实施例因为在虚拟执行过程中对漏洞进行检测,所以可以将源代码的漏洞检测的更完全,这样就会避免应用程序在实际执行时给执行应用程序的计算机系统带来更大的影响,也会借此而提升计算机系统运行的性能,避免计算机系统的被入侵或者瘫痪。参考图1,其示出了本申请一种超级文本预处理语言PHP应用程序的漏洞检测方法实施例1的流程图,所述方法可以应用于虚拟执行器上,可以包括以下步骤:步骤101:编译器将待检测的应用程序的源代码编译为虚拟执行代码。编译器(compiler)可以将源代码编译成一种精简语言,该语言作为一种中间语言,屏蔽了安全无关的代码部分,并将复杂的源代码中的语句拆分成多个精简指令,称为虚拟执行代码(VE CODE, Virtual-executing Code), VE CODE表示与实际的源代码并不对等,而是一种简化后的语义与实际代码相似的中间代码。但是,在安全漏洞扫描方面,VE CODE又保留了安全相关的因素。VE CODE将复杂的源代码语句拆分成一条一条简化指令,但VECODE仍然是一种文本,虽然指令相比源代码已经精简了,但是语法仍然类似于源代码,即屏蔽了与漏洞评估无关的源代码中的指令,又保存了源代码行号与指令间的对应关系。VE CODE包含了原有代码的每行的行号,因此,当后面的Executor执行到任一地方时,都能对应找到源代码相对应的代码片段。因为VE CODE的执行目的只是为了漏洞检测,而不需要虚拟执行所有代码中的运算符,因此,与源代码相比,仅具有更少的运算符。本申请实施例所述的虚拟执行是以一种模拟的方式解释执行源代码。
在本申请实施例中,为了便于本领域技术人员更好的了解本申请的实施,均以PHP应用程序为例进行说明,但是本申请并不限于PHP应用程序。在编译虚拟执行代码之后,虚拟执行器在执行所述虚拟执行代码的过程中,可以进行漏洞检测,所述漏洞检测的过程包括如下步骤102 步骤103。步骤102:虚拟执行器依据存储器中存储的脏变量集合、脏函数集合、保留函数规则库和清理函数规则库,识别当前生成的脏变量;所述脏函数的返回值为脏变量。本申请实施例中所提到的虚拟执行器可以是在开发PHP代码漏洞扫描中产生的工具,该工具称为PHPCHECK,可以通过虚拟执行PHP源代码来找出隐藏在源代码中的漏洞。PHP源代码中的变量如果受污染,则该变量就成为一个脏变量(Dirty Variable),这里所述的受污染指的是该变量受到用户输入的影响,可由用户控制。脏变量包含用户输入内容或其他非安全的变量(例如数据库和文件中读出的数据)。而本实施例中在进行虚拟执行之前,就预置了脏变量集合脏函数集合,这些预定义的脏变量(Predefined DirtyVariable)是某种语言或者某种运行环境下的用户输入变量,这些变量是语言和运行环境本生就具备的,而脏函数(Dirty Function)指返回脏变量,即是返回值是脏变量的函数。因为这些脏变量和脏函数是预先知道的,所以需要预置出来,以供后续执行虚拟执行代码的时候识别出其中的脏变量。在本申请实施例中,一个变量是不是脏变量可以通过该变量的描述符的值来识另1J。脏变量的描述符(Dirty Descriptor)是描述变量或者形参的脏变量属性集,在本实施例中假设将其设置为8位,则脏变量描述符就是一个8位数字。可以参考表I所示:表I
权利要求
1.一种应用程序的漏洞检测方法,其特征在于,包括: 编译器将待检测的应用程序的源代码编译为虚拟执行代码; 虚拟执行器在执行所述虚拟执行代码的过程中进行漏洞检测,所述漏洞检测的过程包括: 依据存储器中存储的脏变量集合、脏函数集合、保留函数规则库和清理函数规则库,虚拟执行器识别当前生成的脏变量;所述脏函数的返回值为脏变量; 依据所述脏变量和所述存储器中的漏洞规则库,虚拟执行器检测当前调用函数的过程是否存在漏洞,所述漏洞规则库用于保存漏洞规则。
2.根据权利要求1所述的方法,其特征在于,所述漏洞规则包括:相互对应的风险函数和风险形参,则所述依据所述脏变量和所述存储器中的漏洞规则库,检测当前需调用的函数是否存在漏洞,具体包括: 判断所述函数是否为所述风险函数;如果是,则从漏洞规则库中获取与所述风险函数对应的风险形参; 在调用所述函数的过程中,判断 所述脏变量是否作为所述函数的实际参数传递给所述风险形参,如果是,则根据所述脏变量的描述符与所述风险形参的值的逻辑运算结果,检测调用所述函数的过程是否会产生漏洞。
3.根据权利要求2所述的方法,其特征在于,所述漏洞规则还包括漏洞类型,则所述方法还包括: 依据所述漏洞规则中的漏洞类型来判断产生漏洞的函数所存在的漏洞类型。
4.根据权利要求1所述的方法,其特征在于,所述保留函数规则库中的保留函数规则包括:相互对应的保留函数和风险形参,所述清理函数规则库中的清理函数规则包括:相互对应的清理函数和风险形参,以及清理脏属性的域,则所述识别当前生成的脏变量,具体包括: 如果当前调用函数是保留函数,则虚拟执行器获取与所述保留函数规则的风险形参对应的实参,并至少根据所述脏变量集合判断该实参是否为脏变量,如果是,则确定当前调用函数的返回值为脏变量; 如果当前调用函数是清理函数,则虚拟执行器获取与所述清理函数规则的形参对应的实参,并至少根据所述脏变量集合判断该实参是否为脏变量,如果是,则在所述清理函数的返回值清理所述实参的脏属性域之后,判断该脏变量是否存在至少一个脏属性域具有脏属性,如果是,则确定当前调用函数的返回值为脏变量; 判断当前需调用的函数是否与所述脏函数集合中的脏函数相同,如果是,则确定所述函数的返回值为脏变量。
5.根据权利要求4所述的方法,其特征在于,所述至少根据所述脏变量集合判断该实参是否为脏变量,包括: 根据预定义的脏变量集合以及权利要求4所识别的脏变量来判断该实参是否为脏变量。
6.根据权利要求1所述的方法,其特征在于,还包括: 对所述存储器中的脏变量集合、脏函数集合及预置的漏洞规则库、保留函数规则库和清理函数规则库进行更新。
7.根据权利要求1所述的方法,其特征在于,还包括: 依据所述漏洞在虚拟执行代码中的位置信息检测出源代码中出现漏洞的位置,和/或, 依据所述漏洞获取所述脏变量在所述函数调用过程中的传递信息。
8.根据权利要求7所述的方法,其特征在于,还包括: 依据检测出的漏洞在所述源代码中的位置和/或传递信息,调整所述源代码。
9.一种应用程序的漏洞检测装置,其特征在于,该装置包括编译器和虚拟执行器,所述虚拟执行器包括脏变量识别模块和漏洞检测模块;所述编译器,用于将待检测的应用程序的源代码编译为虚拟执行代码; 所述脏变量识别模块,用于依据存储器中存储的初始脏变量集合、脏函数集合、保留函数规则库和清理函数规则库,识别当前生成的脏变量;所述脏函数的返回值为脏变量; 所述漏洞检测模块,用于依据所述脏变量和所述存储器中的漏洞规则库,检测当前调用函数的过程是否存在漏洞,所述漏洞规则库用于保存漏洞规则。
10.根据权利要求9所述的装置,其特征在于,所述漏洞规则包括:相互对应的风险函数和风险形参,则所述检测模块具体包括: 第一判断子模块,用于判断所述函数是否为所述风险函数; 获取风险形参子模块,用于在所述第一判断子模块的结果为是的情况下,从漏洞规则库中获取与所述风险函数 对应的风险形参; 第二判断子模块,用于在调用所述函数的过程中,判断所述脏变量是否作为所述函数的实际参数传递给所述风险形参; 检测子模块,用于在所述第二判断子模块的结果为是的情况下,根据所述脏变量的描述符与所述风险形参的值的逻辑运算结果,检测调用所述函数的过程是否会产生漏洞。
全文摘要
本申请提供了一种应用程序的漏洞检测方法及装置,包括编译器将待检测的PHP应用程序的源代码编译为虚拟执行代码;虚拟执行器在执行所述虚拟执行代码的过程中进行漏洞检测依据存储器中存储的脏变量集合、脏函数集合保留函数规则库和清理函数规则库,虚拟执行器识别当前生成的脏变量;依据所述脏变量和所述存储器中的漏洞规则库,虚拟执行器检测当前需调用的PHP函数是否存在漏洞。采用本申请实例公开的方法或者装置,可以使PHP源代码的漏洞检测更完全和准确,也避免了PHP应用程序在实际执行时导致执行应用程序的计算机系统被入侵或者瘫痪等。
文档编号G06F11/36GK103164331SQ20111042145
公开日2013年6月19日 申请日期2011年12月15日 优先权日2011年12月15日
发明者姜晓东 申请人:阿里巴巴集团控股有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1