CN101901184B - 检查应用程序漏洞的方法、装置和系统 - Google Patents
检查应用程序漏洞的方法、装置和系统 Download PDFInfo
- Publication number
- CN101901184B CN101901184B CN200910143827A CN200910143827A CN101901184B CN 101901184 B CN101901184 B CN 101901184B CN 200910143827 A CN200910143827 A CN 200910143827A CN 200910143827 A CN200910143827 A CN 200910143827A CN 101901184 B CN101901184 B CN 101901184B
- Authority
- CN
- China
- Prior art keywords
- function
- dangerous
- mark
- input data
- application program
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Landscapes
- Storage Device Security (AREA)
Abstract
一种用于检查应用程序漏洞的方法,包括:扫描该应用程序以搜索至少一个该应用程序的调用函数,该调用函数调用该应用程序的一个函数;根据该被调函数的属性,确定该被调函数是否与一个危险函数库中的危险函数相匹配;若匹配,则基于该危险函数的漏洞模式,确定传入该被调函数的输入数据是否会导致一个安全漏洞;若该输入数据会导致安全漏洞,则将该调用函数及其相应的漏洞模式添加到该危险函数库中。
Description
技术领域
本发明涉及软件安全技术,具体涉及一种用于检查应用程序漏洞(vulnerability)的方法、装置和系统。
技术背景
软件的安全问题主要来源于外部的输入数据。攻击者可通过输入恶意的数据对软件系统进行攻击。由外部输入恶意数据导致的软件安全漏洞有:命令注入(Command Injection)、SQL注入(SQL Injection)、跨站脚本(Cross-SiteScripting)和路径操纵(Path Manipulation)等。
对外部的输入数据进行输入验证(validation),是保证软件安全的一种有效途径。目前,输入验证的主要方法,包括:静态的代码分析方法和动态的污染传播方法。
静态的代码分析方法,是通过对软件系统的源代码进行扫描,根据应用程序中的数据流、控制流和语义等信息与具体的软件安全规则库进行配对,找出该源代码中的潜在的安全漏洞。动态的污染传播方法,是通过在应用程序的数据入口点,模拟攻击者输入不正确的数据,找出运行时刻所存在的安全漏洞。
静态的代码分析方法,适于开发阶段。然而,在测试阶段,应用程序有可能变化巨大。并且,多数时候,得到完整的应用程序的源代码不是件易事。动态的污染传播方法,由于在运行时刻很难枚举全部应用程序的数据入口点,因而,模拟的测试数据只能达到有限的测试点。相比于静态的代码分析方法,动态的污染传播方法,漏报率较高。
需要一种有效的检查应用程序漏洞的方法和装置。
发明内容
本发明的一个目的是提供一种用于检查应用程序漏洞的方法和装置。利用该方法和装置,不需要应用程序的源代码,也不需要输入攻击性测试数据,即可提供一份有关应用程序潜在的安全漏洞的详细报告。
按照本发明的一种用于检查应用程序漏洞的方法,包括:对于该应用程序的一个函数,检查在该函数体内是否存在一个引爆点;若存在该引爆点,则对传入所述引爆点的输入数据进行标识,所述输入数据包括所述函数的输入参数和/或所述函数体内的变量;其中,若所述输入参数的类型是可污染的,则将该输入参数标识为带有污染标记;若对带有污染标记的变量和/或带有污染标记的输入参数的一个操作的返回类型是可污染的,且与该操作相关的变量是可污染的,则采用“位或”的逻辑操作,将该相关的变量标识为带有污染标记;判断传入该引爆点的输入数据是否带有污染标记;若该输入数据带有污染标记,则确定该引爆点存在安全漏洞;将该函数及其相应的漏洞模式添加到一个危险函数库中,该漏洞模式至少包括用于指示该函数的可污染参数的指示符。
按照本发明的一种用于检查应用程序漏洞的方法,包括:扫描该应用程序以搜索至少一个该应用程序的调用函数(calling function),该调用函数调用该应用程序的一个函数;根据该被调函数(called function)的属性,确定该被调函数是否与一个危险函数库中的危险函数相匹配;其中,所述危险函数库中存储有危险函数的属性和漏洞模式,所述漏洞模式至少包括用于指示所述危险函数的可污染参数的指示符(indicator);若匹配,则基于该危险函数的漏洞模式,确定传入该被调函数的输入数据是否会导致一个安全漏洞;其中,检测与所述指示符相对应的传入该被调函数的输入数据是否有污染标记,若该输入数据有污染标记,则确定所述输入数据会导致一个安全漏洞;若该输入数据会导致安全漏洞,则将该调用函数及其相应的漏洞模式添加到该危险函数库中。
按照本发明的一种用于检查应用程序漏洞的装置,包括:对于该应用程序的一个函数,检查在函数体内是否存在一个引爆点的单元;若存在该引爆点,则对传入所述引爆点的输入数据进行标识的单元,所述输入数据包括所述函数的输入参数和/或所述函数体内的变量;其中包括,若所述输入参数的类型是可污染的,则将该输入参数标识为带有污染标记的单元;若对带有污染标记的变量和/或带有污染标记的输入参数的一个操作的返回类型是可污染的,且与该操作相关的变量是可污染的,则采用“位或”的逻辑操作,将该相关的变量标识为带有污染标记的单元;判断传入该引爆点的输入数据是否带有污染标记的单元;若该输入数据带有污染标记,则确定该引爆点存在安全漏洞的单元;将该函数及其相应的漏洞模式添加到一个危险函数库中的单元,该漏洞模式至少包括用于指示该函数的可污染参数的指示符。
按照本发明的一种用于检查应用程序漏洞的装置,包括:扫描该应用程序以搜索至少一个该应用程序的调用函数的单元,该调用函数调用该应用程序的一个函数;根据该被调函数的属性,确定该被调函数是否与一个危险函数库中的危险函数相匹配的单元;其中,所述危险函数库中存储有危险函数的属性和漏洞模式,所述漏洞模式至少包括用于指示所述危险函数的可污染参数的指示符(indicator);若匹配,则基于该危险函数的漏洞模式,确定传入该被调函数的输入数据是否会导致一个安全漏洞的单元;其中包括,检测与所述指示符相对应的传入该被调函数的输入数据是否有污染标记的单元,若该输入数据有污染标记,则确定所述输入数据会导致一个安全漏洞的单元;若该输入数据会导致安全漏洞,则将该调用函数及其相应的漏洞模式添加到该危险函数库中的单元。
通过参考以下结合附图的说明以及权利要求书中的内容,并且随着对本发明的更全面的理解,本发明的其他目的及效果将变得更加清楚和易于理解。
附图说明
以下将参照附图,通过实施例详细地描述本发明,其中:
图1是按照本发明一个实施例的构建基础危险函数库的方法的流程图;
图2是按照本发明一个实施例的检查应用程序漏洞的方法的示意图;
图3是按照本发明另一个实施例的检查应用程序漏洞的方法的示意图。
在所有附图中,相同的标号表示相似或相应的特征或功能。
具体实施方式
附图1是按照本发明一个实施例的用于构建基础危险函数库的方法的流程图。在这个实施例中,该应用程序是将JAVA编程语言与web技术相结合的J2EE应用程序。
J2EE应用程序通常包括下列文件:JSP文件、JAR文件和JAVA类文件。JSP文件,通过预编译技术(例如:declarative预编译方法),可被编译为JAVA类文件。JAR文件的全称是JavaTM Archive(JAR)文件。该JAR文件,是将多个JAVA类文件压缩打包生成的。因而,将JAR文件解压缩即可得到JAVA类文件。一个JAVA类文件包含多个JAVA函数(在JAVA类中,也称为方法),这样,可在函数层面(level)的基础上,对于一个J2EE应用程序进行扫描,以查找潜在的安全漏洞。
在对J2EE应用程序扫描之前,可根据标准JAVA库函数(java libraryfunction)构建一个基础的危险函数库(database)。该危险函数库,并不限于标准JAVA库函数,其还可以包括第三方库函数(third party library function)和用户定制函数(user customized function)。
危险函数又称为引爆点,是根据传入的输入数据而执行特定任务的代码,例如:对数据库的SQL查询、HTML页面的输出和操作系统命令的执行等。恶意攻击者通过控制这些危险函数的输入,对软件系统进行攻击。
如附图1所示,首先,对于一个JAVA函数,判断该JAVA函数体内是否存在漏洞的引爆点(步骤S10)。
在这个例子中,方法stmt.executeQuery()是一个引爆点。由于传入该方法的输入数据包含了用户从外部通过表单域输入的内容,若不进行仔细的输入验证,当“query”被送到stmt.executeQuery()中执行时,可能引发非法操作数据库的安全问题。
若在JAVA函数体内存在引爆点,则判断传入该引爆点的输入数据是否带有污染标记(步骤S20)。将输入数据标识(mark)为带有污染标记(taint tag)的过程,将在下文中结合具体实施例进行说明。若该输入数据没有污染标记,则不会产生安全问题;而若该输入数据带有污染标记,则将导致该引爆点中存在一个安全漏洞(步骤S30)。若存在安全漏洞,则将该JAVA函数及其相应的漏洞模式(mode)添加到所述危险函数库中(步骤S40),在下文中,还会对此详细说明。
以下结合具体实施例描述将传入引爆点的输入数据标识为带有污染标记的过程。传入该引爆点的输入数据(data),可以是JAVA函数的输入参数(argument),亦可以是该JAVA函数体内的本地变量,还可以是输入参数和本地变量的结合。
1.输入参数
根据JAVA语言的特点,当输入参数的类型是long,int和double时,攻击者很难在输入参数中注入恶意内容。因此,在一个实施例中,对于long,int和double类型的输入参数,其污染状态被定义为不可污染的(untaintable),即:没有污染标记;而对于其他类型的输入参数,都被认为是不可信的污染的数据,其污染状态被定义为污染(tainted)的。进一步,在将该输入参数标识为有污染标记时,根据该输入参数在JAVA函数入口的位置(例如:第一个输入参数、第二个输入参数等),还可以使得该输入参数具有相应的标记值。
作为一个例子,表1是一张对应于输入参数在JAVA函数入口的位置的污染标记值的列表。
表1
此外,在JAVA语言中,由于所有的非静态函数都属于类实例(classinstance),因此,上述JAVA非静态函数的输入参数还可以包括类实例本身。通常,类实例是JAVA非静态函数的第一个输入参数;且作为JAVA非静态函数的隐藏输入参数,在JAVA代码中,类实例不显示在非静态函数的声明中。
2.本地变量
在JAVA函数体内的本地变量,初始污染状态被设定为未污染的(untainted)。当本地变量作为输入数据被传入引爆点时,其当前(current)污染状态取决于在该JAVA函数体内的污染传播。
在一个例子中,当在该JAVA函数体内,对一个有污染标记的输入参数执行一个操作时,有可能会导致污染传播。具体的,若该操作的返回类型是可污染的(即:返回类型不是long,int和double),则与该操作相关的变量,只要该变量的类型不属于不可污染的long,int和double,其污染状态都会受到污染传播而被更新为污染(tainted)的。与该操作相关的变量,包括作为操作结果的本地变量(将该操作的返回值赋值给该变量),还可包括作为操作输入(operation input)的本地变量。在将被污染的本地变量标识为有污染标记时,根据该输入参数在JAVA函数入口的位置,也可以使得该被更新为污染的本地变量具有相应的标记值(如上述表1所示)。
在另一个例子中,当在该JAVA函数体内,对一个有污染标记的输入参数和/或一个有污染标记的本地变量执行一个操作时,若该操作的返回类型是可污染的,则与该操作相关的变量,只要该变量的类型不属于不可污染的,其污染状态都会受到污染传播而被污染。与该操作相关的变量,包括作为操作结果的本地变量,也可包括作为操作输入的本地变量。进一步地,在将该操作中被污染的本地变量标识为有污染标记时,也可根据该输入参数在JAVA函数入口的位置和/或所述有污染标记的作为操作输入的本地变量的污染标记值,使得该被污染的与该操作相关的本地变量具有相应的标记值。
在一个实施例中,按照表1的示例,可以将输入参数的污染标记比特与本地变量的污染标记比特进行“位或(Bitwise or)”逻辑操作。通过“位或”逻辑操作,有污染标记的输入参数和有污染标记的本地变量,都会影响上述被污染的与操作相关的本地变量的标记值。
在一个操作中,按照本发明的一个实施例,若一个本地变量受到多个输入参数的污染传播被更新为污染的本地变量,例如:该变量受到JAVA函数的第二和第三个输入参数的污染传播,则按照表1的污染标记值的示例和“位或”逻辑操作,该被更新为污染的本地变量的污染标记值为6。
以下是几个将输入数据标识为带有污染标记并具有相应污染标记值的例子。
例1:String A=A.Append(String B)
在JAVA程序中,其将被编译为String A=Append(String A,String B)。在该Append操作中,A和B可以是一个JAVA函数的输入参数,亦可以是该JAVA函数体内的本地变量,还可以是输入参数和本地变量的组合。按照上述表1的示例,对A和B执行Append操作,该操作导致的污染传播可以被视为将A的污染标记比特与B的污染标记比特进行“位或”逻辑操作。
表2
从表2中所示的A和B的污染标记值可以看到:在执行Append操作前,A和B具有各自的污染标记值。由于A和B的类型都是String,因此,当执行Append操作时,会发生污染传播。在执行Append操作之前的A和B各自的污染标记值,通过“位或”逻辑操作,共同决定了在执行该Append操作后的A和B的污染标记值。
例2:long A=Func(String B,int C,class D)
在该Func操作中,B、C和D可以是一个JAVA函数的输入参数,亦可以是该JAVA函数体内的本地变量,还可以是输入参数和本地变量的组合。按照上述表1的示例,对B、C、D执行Func操作,该操作导致的污染传播可以被视为将A、B、C、D的污染标记比特进行“位或”逻辑操作。
表3
从表3中所示的A、B、C、D的污染标记值可以看到:由于A和C的类型分别为long和int,其污染状态类型是不可污染的,因此,经过Func操作,A和C仍旧没有污染标记;而B和D类型,不属于不可污染的long,int和double。当执行Func操作时,会发生污染传播。在执行Func操作之前的B和D各自的污染标记值,通过“位或”逻辑操作,共同决定了在执行该Func操作后的B和D的污染标记值。
上述结合具体实施例描述了将传入引爆点的输入数据(包括JAVA函数的输入参数和本地变量)标识为带有污染标记的过程。以下结合实施例,对上述步骤S40中的将有安全漏洞的JAVA函数及其相应的漏洞模式添加到所述危险函数库中的过程进行详细说明。
存储在危险函数库中的有安全漏洞的JAVA函数,包括函数属性和漏洞模式两个方面的内容。函数属性,可以包括JAVA类名、函数名(在JAVA类中,也称为方法名)和特征项目(signature)。其中的特征项目,可用于在类名和函数名相同的情况下,精确地确定有安全漏洞的JAVA函数在应用程序中的位置。漏洞模式,至少包括指示JAVA函数的可污染参数位置的指示符。该指示符的数值可以采用上述表1中的污染标记值,以表示该JAVA函数入口位置的第几个输入参数可能引发安全问题。该漏洞模式还可以包括漏洞类别。可根据引爆点执行结果所引发的安全问题类型,确定相应的漏洞类别,例如:命令注入、SQL注入、跨站脚本和路径操纵等。
表4是在危险函数库中的两个JAVA函数executeUpdate和executeQuery的例子。字段className是类名,字段methodName是函数名,字段vuInParamIndex是上述指示可污染参数位置的指示符,字段category是漏洞类别。字段signature,需要根据函数executeUpdate和executeQuery在应用程序中被调用时的具体位置而确定。按照上述表1中的示例,该指示符vuInParamIndex的值为2,表示函数executeUpdate或executeQuery的第二个输入参数,将会使得该函数存在安全漏洞。
表4
在上述步骤S40中,在将有安全漏洞的JAVA函数添加到危险函数库中时,可按照上述表4中危险函数executeUpdate和executeQuery的模式(pattern),将该JAVA函数的函数属性和漏洞模式,存储在该危险函数库中。
除了可以按照上述实施例,通过对标准JAVA库函数(例如executeUpdate与executeQuery)进行分析构建基础的危险函数库外,还可以对第三方库函数进行分析以选出危险函数。常用第三方库函数,例如:ORM(对象关系映射:Object Relational Mapping)的框架Hibernate 2。这些选出的危险函数可以单独,也可以与从上述JAVA标准库函数中确定的危险函数一起,构成基础的危险函数库。表5是基于第三方库函数构建的一个危险函数库的例子。
表5
另外,还可以对应用程序中用户定制函数进行分析并选出危险函数。这些选出的危险函数可以单独,也可以与从上述标准JAVA库函数和从第三方库函数中确定的危险函数一起,构成该基础的危险函数库。
根据上述实施例构建的基础危险函数库中存储的危险函数,对J2EE应用程序进行扫描,可以找出该应用程序中的潜在漏洞。附图2是按照本发明的一个实施例的检查该应用程序漏洞的方法。
如附图2所示,对J2EE应用程序进行扫描以搜索该应用程序的一个函数,该函数(亦称为调用函数:calling function)调用该应用程序的另一个函数(亦称为被调函数:called function)(步骤S100)。根据该被调函数的属性,例如:类名、函数名和特征项目,在根据上述实施例构建的危险函数库中查找,以确定该被调函数是否与危险函数库中的一个危险函数相匹配(步骤S110)。若该被调函数与一个危险函数相匹配,则基于该危险函数的漏洞模式,确定传入该被调函数的输入数据是否会导致一个安全漏洞(步骤S120)。
具体的,可根据该漏洞模式所包括的指示该危险函数的可污染参数的指示符,检测传入该被调函数的与该指示符相对应的输入数据是否有污染标记;若该输入数据有污染标记,则确定该输入数据会引发一个安全问题。传入该被调函数的输入数据,可以是该调用函数的输入参数,也可以是该调用函数体内的本地变量,还可以是输入参数与本地变量的结合。将传入该被调函数的输入数据标识为带有污染标记的过程,可采用与上述实施例中将传入引爆点的输入数据标识为带有污染标记相类似的方案。
若传入该被调函数的该输入数据会导致安全漏洞,则将该调用函数及其相应的漏洞模式添加到该危险函数库中(步骤S130)。添加的该调用函数,应当包括该调用函数的属性,例如:调用函数所在类的类名、该调用函数名和用于区分类名和函数名相同的调用函数的特征项目;漏洞模式,包括指示在该调用函数入口位置的可污染参数的指示符、漏洞类别和该可污染参数的攻击路径(以下结合表6的例子具体说明)。
表6:
在危险函数库中,如表4所示executeQuery的模式,vuInParamIndex=2。其意味着:传入危险函数executeQuery的第二个参数,会使得该危险函数存在安全漏洞。在危险函数executeQuery中,第一个参数是隐含的类实例,如上所述,其不显示在非静态函数的声明中。在表6所示实施例中,对于被调函数executeQuery,与该指示符vuInParamIndex的值相对应的输入数据是call3arg1。
传给被调函数executeQuery的输入数据call3arg1,是调用函数Func3的输入参数String call3arg1。由于输入参数call3arg1的类型是String,该类型是可污染的,因此,调用函数Func3的输入参数call3arg1被标识为有污染标记。当调用函数Func3的输入参数call3arg1作为输入数据送到被调函数executeQuery时,该带有污染标记的输入参数call3arg1,会引发被调函数executeQuery的安全问题。换言之,Func3的输入参数call3arg1会引发被调函数executeQuery的安全问题,因此,调用函数Func3将被确定为危险函数。
参照executeQuery的漏洞模式和表1所示的输入参数在函数入口的位置的污染标记值,调用函数Func3的漏洞模式可相应定义为:vuInParamIndex=2,漏洞类别为SQL_INJECTION,可污染参数call3arg1的进攻路径是:Func3→executeQuery。将调用函数Func3及其相应的漏洞模式添加到危险函数库中。
在比较复杂的应用程序中,经常出现多个函数层叠调用的情况,例如:Func1调用Func2,Func2调用Func3,Func3调用executeQuery,可以将直接调用函数executeQuery的Func3定义为第1级调用函数,Func2为第2级调用函数,Func1为第3级调用函数。
附图3是对比较复杂的J2EE应用程序扫描以找出应用程序中的潜在漏洞的一个实施例的流程图。在这个实施例中,Func3调用函数executeQuery。Func3、Func2和Func1分别是第1、2、3级的调用函数。如以下表7所示:
表7
在第一轮扫描时,直接调用函数executeQuery的第1级调用函数Func3被确定为危险函数(步骤S200)。确定Func3为危险函数的方法,可采用上述表6所示的实施例的方式。Func3的漏洞模式具体包括:vuInParamIndex=2,漏洞类别为SQL_INJECTION,可污染参数call3arg1的进攻路径是:Func3→executeQuery。
在第一轮扫描时,由于尚且没有与函数Func2和Func3相匹配的危险函数存储在危险函数库中,因此,分别调用函数Func2和Func3的函数Func1和Func2没有被确定为危险函数。
在将危险函数Func3(包括其属性和漏洞模式)添加到危险函数库中后,对该J2EE应用程序进行第二轮扫描。在第二轮扫描时,搜索到调用第1级调用函数Func3的第2级调用函数Func2(步骤S210)。根据该被调函数Func3的属性,在危险函数库中查找是否有一个危险函数与该被调函数Func3相匹配(步骤S220)。
在本实施例中,有危险函数与该被调函数Func3相匹配。根据该匹配的危险函数的漏洞模式,确定在第2级调用函数Func2体内,传入被调函数(即:第1级调用函数)Func3的输入数据是否会导致一个安全漏洞(步骤S230)。
在本实施例中,危险函数Func3的指示符vuInParamIndex=2。对于被调函数Func3,与该指示符的值对应的输入数据是call2arg3(被调函数Func3的第一个参数是隐含的类实例)。
传给被调函数Func3的输入数据call2arg3,是调用函数Func2的输入参数String call2arg3。输入参数call2arg3的类型是String,该输入参数被标识为带有污染标记。当调用函数Func2的输入参数call2arg3作为输入数据送到被调函数Func3时,该带有污染标记的输入参数call2arg3,会引发被调函数Func3的安全问题。因此,调用函数Func2将被确定为危险函数。
call2arg3是第2级调用函数Func2的第四输入参数(第一输入参数是隐含的类实例),参照上述确定Func3的漏洞模式的方法,该调用函数Func2的漏洞模式为:vuInParamIndex=8,漏洞类别为SQL_INJECTION,可污染参数call2arg3的进攻路径是:Func2→Func3→executeQuery。
将确定的危险函数Func2,包括其属性和漏洞模式,添加到危险函数库中(步骤S240)。再次执行与上述步骤S200至步骤S240类似的步骤,可将危险函数Func1添加到危险函数库中。
这里,对确定危险函数Func1的指示符vuInParamIndex的值的过程,特别解释一下。
在危险函数Func2的漏洞模式中,vuInParamIndex=8,即:传入危险函数Func2的第四个参数,会使得该函数存在安全漏洞。在第3级调用函数Func1体内,若传送给被调函数(即:第2级调用函数)Func2的第四输入参数call1arg1+call1arg2的输入数据有污染标记,则第3级调用函数Func1也将被确定为危险函数。
在这个实施例中,传送给被调函数Func2的第四输入参数call1arg1+call1arg2的输入数据是函数Func1的第二输入参数String call1arg1和第三输入参数String call1arg2(第一输入参数是隐含的类实例)。且输入参数call1arg1和call1arg2的类型是String,因此,他们被分别标识为带有污染标记。
当将带有污染标记的第3级调用函数Func1的输入参数call1arg1和call1arg2作为输入数据送到被调函数Func2时,会引发被调函数Func2的安全问题。因此,第3级调用函数Func1也是一个危险函数,应添加到危险函数库中。
call1arg1和call1arg2是第3级调用函数Func1的第二和第三输入参数,参照上述确定Func3和Func2的漏洞模式的方法,该调用函数Func1的漏洞模式相应定义为:vuInParamIndex=6,漏洞类别为SQL_INJECTION,可污染参数call1arg1和call1arg2的进攻路径是:Func1→Func2→Func3→executeQuery。
表8是危险函数库中的危险函数Func3、Func2和Func1的一个示例。
表8
对于每个危险函数的可污染参数的进攻路径,既可按照上述实施例中的方式,记录完整的进攻路径,也可以仅记录有关直接调用的函数的信息。在另一个实施例中,上述危险函数Func1的进攻路径可记录为Func1→Func2,危险函数Func2的进攻路径记录为Func2→Func3,危险函数Func3的进攻路径记录为Func3→executeQuery。
对J2EE应用程序重复上述的迭代式的扫描过程,若每轮扫描都有新的危险函数被找到并被添加到危险函数库中,则继续下一轮扫描,直到在该J2EE应用程序中没有找到新的危险函数为止。当然,对于不复杂的应用程序,也可以预定扫描的次数。例如:对应用程序执行十轮上述的扫描过程。
在按照上述实施例所生成的危险函数库中,记录了该应用程序中的存在安全漏洞的函数的详细信息。这些详细信息,既有危险函数在应用程序中的位置(函数属性),又包括了危险函数的可污染参数的位置、该可污染参数的进攻路径以及可能产生的安全问题。这些详细信息,可以作为一个有关该应用程序的潜在安全漏洞的报告,帮助程序员在应用程序中设置相应的输入验证,以避免可能出现的安全问题。
此外,每个函数都有具体的内在逻辑。对于被调函数或调用函数,最终传递到引爆点的输入数据,可能只是受到被调函数或调用函数的一个输入参数的污染而成为污染的输入数据;而且,在不同的输入参数之间,通常没有污染传播。因此,在另一实施例中,在构建上述基础危险函数库和/或经由迭代式的扫描过程而更新该危险函数库时,可以首先对每个被调函数进行清理(sanitize),例如:将被编译为LDC的常数字符串,始终标记为“未污染的”;或假定被调函数java.lang.String在执行检查和匹配操作时不会污染字符串。在对被调函数进行清理的基础上,还可对调用函数也进行清理,以降低误报(false positives),提高有关该应用程序的潜在安全漏洞的报告的精确性。
按照本发明的上述实施例的用于检查应用程序漏洞的方法,可以作为计算机可执行的指令而存储在一个存储介质中。当常规的计算机的处理器装载这些指令后,该计算机可以作为一个用于检查应用程序漏洞的装置,生成有关该应用程序的潜在安全漏洞的报告。此外,也可将用于检查应用程序漏洞的这些指令集成在一个芯片上,例如:FPGA,以使得该芯片可以作为一个独立的可用于检查应用程序漏洞的装置。
有益效果:
按照本发明的上述实施例的用于检查应用程序漏洞的方法和装置,通过构建一个关于应用程序的基础危险函数库,对应用程序的相互调用的函数进行迭代式的扫描,能够找到该应用程序中的存在安全漏洞的函数。利用该方法和装置,不需要应用程序的源代码,也不需要输入攻击性测试数据,即可提供一份有关应用程序潜在的安全漏洞的详细报告。
上述基础危险函数库,既可以按照本发明上述实施例的方式,从标准JAVA库函数、第三方库函数和用户定制函数中选择危险函数进行构建,亦可以直接采用第三方提供的具有类似本发明实施例的危险函数模式的预定的危险函数库。例如:第三方,可以单独提供一个基于ORM框架Hibernate2的危险函数库。应用程序漏洞扫描程序,根据该第三方提供的危险函数库的接口,检查被扫描的应用程序中是否有函数调用了该危险函数库中的危险函数,并通过上述实施例中的迭代式的扫描,将查找到的新的危险函数添加到新该危险函数库中。
按照本发明的上述实施例的用于检查应用程序漏洞的方法和装置,不限于J2EE应用程序。其可以应用到所有将JAVA编程语言与网络技术(有线网络和无线网络)结合的应用程序中。
另外,按照本发明的上述实施例的用于检查应用程序漏洞的方法和装置,不限于JAVA编程语言。其还可以应用到其他面向对象(Object Oriented)的语言,如.Net,C++等。甚至,其也可以应用于C/S结构(客户端-服务器模式)。在C/S结构中,例如C语言开发的应用程序,也可以通过构建基于C函数库的基本危险函数,然后通过迭代式扫描的方式找到存在危险漏洞的程序员所创建的调用函数。在C/S结构的实现过程中,只要根据该应用程序的语言特点进行相应的修改即可。例如:在描述危险函数的属性时,特征项目(Signature),需要适当地修改以区分不同的函数。
本领域技术人员应当理解,对上述本发明所公开的用于检查应用程序漏洞的方法和装置,还可以在不脱离本发明内容的基础上做出各种改进。因此,本发明的保护范围应当由所附的权利要求书的内容确定。
Claims (15)
1.一种用于检查应用程序漏洞(vulnerability)的方法,包括:
对于该应用程序的一个函数,检查在该函数体内是否存在一个引爆点;
若存在该引爆点,则对传入所述引爆点的输入数据进行标识,所述输入数据包括所述函数的输入参数和/或所述函数体内的变量;其中,若所述输入参数的类型是可污染的,则将该输入参数标识为带有污染标记;若对带有污染标记的变量和/或带有污染标记的输入参数的一个操作的返回类型是可污染的,且与该操作相关的变量是可污染的,则采用“位或”的逻辑操作,将该相关的变量标识为带有污染标记;
判断传入该引爆点的输入数据是否带有污染标记;
若该输入数据带有污染标记,则确定该引爆点存在安全漏洞;
将该函数及其相应的漏洞模式添加到一个危险函数库中,该漏洞模式至少包括用于指示该函数的可污染参数的指示符。
2.一种用于检查应用程序漏洞的方法,包括:
扫描该应用程序以搜索至少一个该应用程序的调用函数(callingfunction),该调用函数调用该应用程序的一个函数;
根据该被调函数(called function)的属性,确定该被调函数是否与一个危险函数库中的危险函数相匹配;其中,所述危险函数库中存储有危险函数的属性和漏洞模式,所述漏洞模式至少包括用于指示所述危险函数的可污染参数的指示符(indicator);
若匹配,则基于该危险函数的漏洞模式,确定传入该被调函数的输入数据是否会导致一个安全漏洞;其中,检测与所述指示符相对应的传入该被调函数的输入数据是否有污染标记,若该输入数据有污染标记,则确定所述输入数据会导致一个安全漏洞;
若该输入数据会导致安全漏洞,则将该调用函数及其相应的漏洞模式添加到该危险函数库中。
3.如权利要求2所述的方法,其中,所述调用函数是第1级调用函数(calling function),该方法还包括:
扫描该应用程序以搜索至少一个该应用程序的第n级调用函数,该第n级调用函数调用该应用程序的第n-1级调用函数,n是大于1的整数;
根据该第n-1级调用函数的属性,确定所调用的第n-1级调用函数是否与所述危险函数库中的一个危险函数相匹配;
若匹配,则基于该危险函数的漏洞模式,确定传入该第n-1级调用函数的输入数据是否会导致一个安全漏洞;
若该输入数据会导致安全漏洞,则将该第n级调用函数及其相应的漏洞模式添加到该危险函数库中。
4.如权利要求2或3所述的方法,其中,所述调用函数和被调函数中任意一个的属性至少包括函数名称和特征项目(signature)。
5.如权利要求2或3所述的方法,其中,所述漏洞模式还包括漏洞类别和/或所述可污染参数的攻击路径。
6.如权利要求2或3所述的方法,其中,所述输入数据包括所述调用函数的输入参数(input argument)和/或所述调用函数体内的变量。
7.如权利要求6所述的方法,其中,还包括对所述输入数据进行标识的步骤以用于检测与所述指示符相对应的输入数据是否有污染标记,所述标识的步骤包括:
若所述输入参数的类型是可污染的,则将输入参数标识为带有污染标记;
若对带有污染标记的变量和/或带有污染标记的输入参数的一个操作的返回类型是可污染的,且与该操作相关的变量是可污染的,则采用“位或”的逻辑操作,将该相关的变量标识为带有污染标记。
8.如权利要求2所述的方法,其中,所述危险函数库可以是按照权利要求1所述方法构建的,也可以是由第三方提供的一个危险函数库。
9.一种用于检查应用程序漏洞的装置,包括:
对于该应用程序的一个函数,检查在该函数体内是否存在一个引爆点的单元;
若存在该引爆点,则对传入所述引爆点的输入数据进行标识的单元,所述输入数据包括所述函数的输入参数和/或所述函数体内的变量;其中包括,若所述输入参数的类型是可污染的,则将该输入参数标识为带有污染标记的单元;若对带有污染标记的变量和/或带有污染标记的输入参数的一个操作的返回类型是可污染的,且与该操作相关的变量是可污染的,则采用“位或”的逻辑操作,将该相关的变量标识为带有污染标记的单元;
判断传入该引爆点的输入数据是否带有污染标记的单元;
若该输入数据带有污染标记,则确定该引爆点存在安全漏洞的单元;
将该函数及其相应的漏洞模式添加到一个危险函数库中的单元,该漏洞模式至少包括用于指示该函数的可污染参数的指示符。
10.一种用于检查应用程序漏洞的装置,包括:
扫描该应用程序以搜索至少一个该应用程序的调用函数(calling function)的单元,该调用函数调用该应用程序的一个函数;
根据该被调函数(called function)的属性,确定该被调函数是否与一个危险函数库中的危险函数相匹配的单元;其中,所述危险函数库中存储有危险函数的属性和漏洞模式,所述漏洞模式至少包括用于指示所述危险函数的可污染参数的指示符(indicator);
若匹配,则基于该危险函数的漏洞模式,确定传入该被调函数的输入数据是否会导致一个安全漏洞的单元;其中包括,检测与所述指示符相对应的传入该被调函数的输入数据是否有污染标记的单元,若该输入数据有污染标记,则确定所述输入数据会导致一个安全漏洞的单元;
若该输入数据会导致安全漏洞,则将该调用函数及其相应的漏洞模式添加到该危险函数库中的单元。
11.如权利要求10所述的装置,其中,所述调用函数是第1级调用函数(calling function),该装置还包括:
扫描该应用程序以搜索至少一个该应用程序的第n级调用函数的单元,该第n级调用函数调用该应用程序的第n-1级调用函数,n是大于1的整数;
根据该第n-1级调用函数的属性,确定所调用的第n-1级调用函数是否与所述危险函数库中的一个危险函数相匹配的单元;
若匹配,则基于该危险函数的漏洞模式,确定传入该第n-1级调用函数的输入数据是否会导致一个安全漏洞的单元;
若该输入数据会导致安全漏洞,则将该第n级调用函数及其相应的漏洞模式添加到该危险函数库中的单元。
12.如权利要求10或11所述的装置,其中,所述调用函数和被调函数中的任意一个的属性至少包括函数名称和特征项目(signature)。
13.如权利要求10或11所述的装置,其中,所述漏洞模式还包括漏洞类别和/或所述可污染参数的攻击路径。
14.如权利要求10或11所述的装置,其中,所述输入数据包括所述调用函数的输入参数(input argument)和/或所述调用函数体内的变量,所述装置还包括:
若所述输入参数的类型是可污染的,则将输入参数标识为带有污染标记的单元;
若对带有污染标记的变量和/或带有污染标记的输入参数的一个操作的返回类型是可污染的,且与该操作相关的变量是可污染的,则采用“位或”的逻辑操作,将该相关的变量标识为带有污染标记的单元。
15.如权利要求10所述的装置,其中,所述危险函数库可以是按照权利要求9所述装置构建的,也可以是由第三方提供的一个危险函数库。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200910143827A CN101901184B (zh) | 2009-05-31 | 2009-05-31 | 检查应用程序漏洞的方法、装置和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200910143827A CN101901184B (zh) | 2009-05-31 | 2009-05-31 | 检查应用程序漏洞的方法、装置和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101901184A CN101901184A (zh) | 2010-12-01 |
CN101901184B true CN101901184B (zh) | 2012-09-19 |
Family
ID=43226733
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN200910143827A Active CN101901184B (zh) | 2009-05-31 | 2009-05-31 | 检查应用程序漏洞的方法、装置和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101901184B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP2880580A4 (en) * | 2012-07-31 | 2016-01-20 | Hewlett Packard Development Co | ANALYSIS OF INFORMATION OF A VULNERABILITY VECTOR |
CN103577758B (zh) * | 2012-07-31 | 2017-05-31 | 西门子公司 | 程序的代码审核方法和装置 |
BR112015006653A2 (pt) * | 2012-09-28 | 2017-07-04 | Hewlett Packard Development Co | sistema de computação, meio de armazenamento legível por máquina não transitório e método |
CN106033394B (zh) * | 2015-03-13 | 2019-05-17 | 北京奇虎测腾科技有限公司 | 软件源代码的分析方法及装置 |
EP3458953B1 (en) * | 2016-05-15 | 2024-09-25 | Software Integrity Group, Inc. | Systems and methods for model-based analysis of software |
CN109558119B (zh) * | 2018-11-09 | 2022-12-27 | 杭州安恒信息技术股份有限公司 | 一种基于Java的Web框架遍历请求地址的方法 |
CN109522010B (zh) * | 2018-11-22 | 2022-02-18 | 网易(杭州)网络有限公司 | 初始化代码添加方法及装置、存储介质、电子设备 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1641601A (zh) * | 2004-01-04 | 2005-07-20 | 华为技术有限公司 | 一种软件的单元测试方法 |
CN101017458A (zh) * | 2007-03-02 | 2007-08-15 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
CN101241532A (zh) * | 2008-02-15 | 2008-08-13 | 北京邮电大学 | 面向源代码的基于不等式组求解的缓冲区溢出检测方法 |
-
2009
- 2009-05-31 CN CN200910143827A patent/CN101901184B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1641601A (zh) * | 2004-01-04 | 2005-07-20 | 华为技术有限公司 | 一种软件的单元测试方法 |
CN101017458A (zh) * | 2007-03-02 | 2007-08-15 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
CN101241532A (zh) * | 2008-02-15 | 2008-08-13 | 北京邮电大学 | 面向源代码的基于不等式组求解的缓冲区溢出检测方法 |
Non-Patent Citations (1)
Title |
---|
刘应华等.缓冲区溢出的建模分析.《计算机工程与应用》.2005,(第3期),88-90. * |
Also Published As
Publication number | Publication date |
---|---|
CN101901184A (zh) | 2010-12-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107832619B (zh) | Android平台下应用程序漏洞自动化挖掘系统及方法 | |
CN101901184B (zh) | 检查应用程序漏洞的方法、装置和系统 | |
CN107273751B (zh) | 基于多模式匹配的安全漏洞在线发现方法 | |
Canfora et al. | Leila: formal tool for identifying mobile malicious behaviour | |
Díaz et al. | Static analysis of source code security: Assessment of tools against SAMATE tests | |
Tian et al. | Software plagiarism detection with birthmarks based on dynamic key instruction sequences | |
Dahse et al. | Code reuse attacks in php: Automated pop chain generation | |
Caselden et al. | Hi-cfg: Construction by binary analysis and application to attack polymorphism | |
CN104537309A (zh) | 应用程序漏洞检测方法、装置及服务器 | |
Tang et al. | A novel hybrid method to analyze security vulnerabilities in android applications | |
CN103473506A (zh) | 用于识别恶意apk文件的方法和装置 | |
Livshits | Dynamic taint tracking in managed runtimes | |
Backes et al. | R-droid: Leveraging android app analysis with static slice optimization | |
CN105550594A (zh) | 安卓应用文件的安全性检测方法 | |
CN109271789B (zh) | 恶意进程检测方法、装置、电子设备及存储介质 | |
US20230252135A1 (en) | Behavioral threat detection definition and compilation | |
CN112527674B (zh) | Ai框架的安全评测方法、装置、设备及存储介质 | |
CN103559447A (zh) | 一种基于病毒样本特征的检测方法、检测装置及检测系统 | |
CN111859380A (zh) | Android App漏洞的零误报检测方法 | |
Ren et al. | Making smart contract development more secure and easier | |
Li et al. | Large-scale third-party library detection in android markets | |
Brito et al. | Study of javascript static analysis tools for vulnerability detection in node. js packages | |
Chen et al. | Automatic Mining of Security-Sensitive Functions from Source Code. | |
CN115391230A (zh) | 一种测试脚本生成、渗透测试方法、装置、设备及介质 | |
US20240193278A1 (en) | Vulnerability analysis of a computer driver |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |