本公开的实施例涉及计算机技术领域,具体涉及用于检测漏洞的方法和装置。
背景技术:
信息社会对软件的依赖不断增加,随着软件数量快速增长,软件存在的信息安全问题日益彰显,成为信息安全和用户隐私方面的重要隐患。目前,不论在商业软件还是开源软件中,软件的漏洞随处可见。随着软件数量以及软件漏洞的增加,采用人工方式检查软件中的代码是否存在漏洞已经不再现实。因此,相关技术中,存在自动对软件中的代码进行漏洞检测的需求。
技术实现要素:
本公开的实施例提出了用于检测漏洞的方法和装置。
第一方面,本公开的实施例提供了一种用于检测漏洞的方法,该方法包括:包括:从目标代码中确定出与预先存储的危险函数集合中的危险函数相匹配的函数,作为待处理函数;确定待处理函数的输入变量的类型;根据所确定的类型,确定待处理函数是否存在漏洞。
在一些实施例中,从目标代码中确定出与预先存储的危险函数集合中的危险函数相匹配的函数,作为待处理函数,包括:对目标代码进行语法解析,得到目标代码的语法树(syntaxtree),其中,语法树包括至少一个子树,子树用于描述目标代码中的表达式;对于至少一个子树中的子树,响应于确定该子树所描述的表达式中包括函数,确定所包括的函数是否属于危险函数集合,响应于确定属于,将所包括的函数作为待处理函数。
在一些实施例中,确定待处理函数的输入变量的类型,包括:确定预先确定的不可控变量集合中是否存在与输入变量相匹配的不可控变量;响应于确定不存在,确定输入变量的类型为第二类型,其中,第二类型用于表征变量可控。
在一些实施例中,预先确定的不可控变量集合通过如下步骤确定:从根节点至子节点方向遍历语法树,得到至少一个子树所描述的至少一个表达式中的变量集合;确定变量集合中的变量的类型,将类型为第一类型的变量确定为不可控变量,存入不可控变量集合,其中,第一类型用于表征变量不可控。
在一些实施例中,根据所确定的类型,确定待处理函数是否存在漏洞,包括:响应于确定输入变量的类型为第二类型,确定待处理函数存在漏洞。
在一些实施例中,方法还包括:响应于确定待处理函数存在漏洞,发出预先设定的、对应于待处理函数的报警信息。
第二方面,本公开的实施例提供了一种用于检测漏洞的装置,该装置包括:函数确定单元,被配置成从目标代码中确定出与预先存储的危险函数集合中的危险函数相匹配的函数,作为待处理函数;类型确定单元,被配置成确定待处理函数的输入变量的类型;漏洞确定单元,被配置成根据所确定的类型,确定待处理函数是否存在漏洞。
在一些实施例中,函数确定单元,被进一步配置成:对目标代码进行语法解析,得到目标代码的语法树,其中,语法树包括至少一个子树,子树用于描述目标代码中的表达式;对于至少一个子树中的子树,响应于确定该子树所描述的表达式中包括函数,确定所包括的函数是否属于危险函数集合,响应于确定属于,将所包括的函数作为待处理函数。
在一些实施例中,类型确定单元,被进一步配置成:确定预先确定的不可控变量集合中是否存在与输入变量相匹配的不可控变量;响应于确定不存在,确定输入变量的类型为第二类型,其中,第二类型用于表征变量可控。
在一些实施例中,预先确定的不可控变量集合通过如下步骤确定:从根节点至子节点方向遍历语法树,得到至少一个子树所描述的至少一个表达式中的变量集合;确定变量集合中的变量的类型,将类型为第一类型的变量确定为不可控变量,存入不可控变量集合,其中,第一类型用于表征变量不可控。
在一些实施例中,漏洞确定单元,被进一步配置成:响应于确定输入变量的类型为第二类型,确定待处理函数存在漏洞。
在一些实施例中,装置还包括:报警发出单元,被配置成响应于确定待处理函数存在漏洞,发出预先设定的、对应于待处理函数的报警信息。
第三方面,本公开的实施例提供了一种电子设备,该电子设备包括:一个或多个处理器;存储装置,其上存储有一个或多个程序;当该一个或多个程序被该一个或多个处理器执行,使得该一个或多个处理器实现如第一方面中任一实现方式描述的方法。
第四方面,本公开的实施例提供了一种计算机可读介质,其上存储有计算机程序,该程序被处理器执行时实现如第一方面中任一实现方式描述的方法。
本公开的实施例提供的用于检测漏洞的方法和装置,可以从目标代码中确定出与预先存储的危险函数集合中的危险函数相匹配的函数,作为待处理函数。然后,确定待处理函数的输入变量的类型。最后,根据所确定的类型,确定待处理函数是否存在漏洞。本实施例的方法和装置,可以依据待处理函数的输入变量的类型,来确定待处理函数是否存在漏洞,丰富了检测代码中的漏洞的方法,提高了检测代码中的漏洞的灵活性。
附图说明
通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本公开的其它特征、目的和优点将会变得更明显:
图1是本公开的一个实施例可以应用于其中的示例性系统架构图;
图2是根据本公开的用于检测漏洞的方法的一个实施例的流程图;
图3是根据本公开的实施例的用于检测漏洞的方法的一个应用场景的示意图;
图4是根据本公开的用于检测漏洞的方法的又一个实施例的流程图;
图5是根据本公开的用于检测漏洞的装置的一个实施例的结构示意图;
图6是适于用来实现本公开的实施例的电子设备的结构示意图。
具体实施方式
下面结合附图和实施例对本公开作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释相关发明,而非对该发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与有关发明相关的部分。
需要说明的是,在不冲突的情况下,本公开中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本公开。
图1示出了可以应用本公开的实施例的用于检测漏洞的方法或用于检测漏洞的装置的示例性系统架构100。
如图1所示,系统架构100可以包括数据库服务器101,网络102和服务器103。网络102用以在数据库服务器101和服务器103之间提供通信链路的介质。网络102可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
数据库服务器101可以通过网络102与服务器103交互,以接收或发送消息等。数据库服务器101可以实现成提供各种数据存储服务的分布式服务器集群,也可以实现成单个服务器。例如,存储有危险函数集合的服务器。数据库服务器101可以将所存储的危险函数集合发送给服务器103。
服务器103可以通过网络102与数据库服务器101交互,以接收或发送消息等。服务器103可以是提供各种服务的服务器,例如,基于数据库服务器101中的危险函数集合对目标代码进行漏洞检测的服务器。服务器103可以基于数据库服务器101中的危险函数集合,从目标代码中确定出与危险函数集合中的危险函数相匹配的函数,作为待处理函数。然后,确定待处理函数的输入变量的类型。最后,根据所确定的类型,确定待处理函数是否存在漏洞。
需要说明的是,服务器可以是硬件,也可以是软件。当服务器为硬件时,可以实现成多个服务器组成的分布式服务器集群,也可以实现成单个服务器。当服务器为软件时,可以实现成多个软件或软件模块(例如用来提供分布式服务),也可以实现成单个软件或软件模块。在此不做具体限定。
需要说明的是,本公开的实施例所提供的用于检测漏洞的方法一般由服务器103执行,相应地,用于检测漏洞的装置一般设置于服务器103中。需要指出的是,服务器103的本地也可以直接存储危险函数集合。服务器103可以直接提取本地的危险函数集合。此时,示例性系统架构100可以不包括数据库服务器101和网络102。
应该理解,图1中的数据库服务器、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的数据库服务器、网络和服务器。
继续参考图2,示出了根据本公开的用于检测漏洞的方法的一个实施例的流程200。该用于检测漏洞的方法,包括以下步骤:
步骤201,从目标代码中确定出与预先存储的危险函数集合中的危险函数相匹配的函数,作为待处理函数。
在本实施例中,用于检测漏洞的方法的执行主体(例如图1所示的服务器103)可以从目标代码中确定出与危险函数集合中的危险函数相匹配的函数。其中,上述目标代码可以是各种计算机语言编写出来的源代码,例如python代码、java代码等。目标代码中可能包括一个或多个函数,且目标代码所包括的一个或多个函数中,可能存在具有漏洞的函数。
需要指出的是,函数是实现程序功能的最基本单位。每个程序都是由一个个最基本的函数构成的。函数包括函数头以及函数体,函数头是函数体之前的所有部分,它定义了函数的返回类型。函数体中包括定义函数功能的所有代码。当该函数被调用时,该函数内的代码就会被执行。函数体中可能包括危险函数。其中,危险函数,通常是指基于外部参数来运行时有可能被认为是软件漏洞的函数。需要指出的是,每种计算机语言基本都包括危险函数。由于,针对任一种计算机语言,其所可能包括的危险函数基本是固定的。因此,可以事先将对应于该计算机语言的所有可能的危险函数列举出来,存储为危险函数集合。
在本实施例中,执行主体可以通过如下方式,从目标代码中确定出与危险函数集合中的危险函数相匹配的函数:
首先,执行主体可以采用词法分析算法对目标代码进行词法分析,以得到目标代码中的至少一个字符组。其中,字符组与自然语言中的单词类似。字符组可以包括但不限于以下至少一种类型的字符:字、标识符、常数、运算符、界符。其中,界符通常是用于限定字符组的界限。一般地,界符都是成对的双界符,如,(),{},[]等。其中,上述词法分析算法可以是现有的词法分析算法。
然后,执行主体可以按照目标代码所使用的程序语言的语法规则,从所得到的至少一个字符组中识别出函数。之后,将所识别出的函数,与危险函数集合中的危险函数进行相似度计算。其中,可以采用预先设定的相似度计算公式,计算危险函数与所识别出的函数的相似度。作为示例,上述预先设定的相似度计算公式可以为余弦相似度计算公式。
最后,根据所得到的相似度,确定所识别出的函数是否与危险函数集合中的危险函数相匹配。具体地,对于危险函数集合中的任一危险函数,若该危险函数与识别出的函数的相似度大于预先设定的相似度阈值,则认为该危险函数与所识别出的函数相匹配。若该危险函数与识别出的函数的相似度不大于预先设定的相似度阈值,则认为该危险函数与所识别出的函数不匹配。另外,若危险函数集合中存在与所识别出的函数相匹配的危险函数,则认为所识别出的函数与危险函数集合中的危险函数相匹配。反之,若危险函数集合中不存在与所识别出的函数相匹配的危险函数,则认为所识别出的函数与危险函数集合中的危险函数不匹配。
需要指出的是,通常危险函数集合中,至多只会存在一个与所识别出的函数相匹配的危险函数。这里,若危险函数集合中存在与所识别出的函数相匹配的危险函数。此时,可以将该所识别出的函数作为待处理函数。
在本实施例的一些可选的实现方式中,执行主体还可以通过如下方式,从目标代码中确定出与危险函数集合中的危险函数相匹配的函数:
第一步,对目标代码进行语法解析,得到目标代码的语法树。其中,语法树包括至少一个子树,子树用于描述目标代码中的表达式。上述语法树是上述目标代码的抽象语法结构的树状表现形式。这里,执行主体可以采用多种方法对目标代码进行语法解析,以得到目标代码的语法树。作为示例,执行主体可以采用语法分析插件对目标代码进行解析,以得到目标代码的语法树。其中,上述语法分析插件可以为pmd(projectmanagerdesign)、checkstyle、findbugs等。这里,上述子树,通常是指上述目标代码中的语句在语法树中所对应的分支。在上述目标代码中具有多个语句时,语法树可以包括多个子树。其中,上述语句通常是构成程序的基本单位,是执行具体操作的指令。每条语句的末尾通常具有指定的语句结束符号。例如,上述语句结束符号可以为“;”。另外,语句中通常可以包括表达式。上述表达式通常是由数字、算符、数字分组符号(如,括号)、自由变量、约束变量等的组合。其中,约束变量在表达式中已被指定数值,而自由变量则可以在表达式之外另行指定数值。作为示例,表达式的一种形式可以为:newfile(b)。其中,newfile为一个函数,b为newfile函数的输入变量。
第二步,对于至少一个子树中的子树,响应于确定该子树所描述的表达式中包括函数,确定所包括的函数是否属于危险函数集合,响应于确定属于,将所包括的函数作为待处理函数。这里,首先,执行主体可以根据语法树的语法结构,查找子树中是否存在用于表征函数的节点。若查找到,则认为该子树所描述的表达式中包括函数。然后,执行主体可以将所查找到的节点中的函数与危险函数集合中的危险函数进行比较,若所查找到的函数属于危险函数集合,则将所查找到的函数作为待处理函数。其中,上述所查找到的函数属于危险函数集合,通常是指危险函数集合中,存在与所查找到的函数的名称相同的函数。
步骤202,确定待处理函数的输入变量的类型。
在本实施例中,执行主体可以通过如下方式确定待处理函数的输入变量的类型:首先,确定待处理函数的输入变量的总数目,例如,2个。然后,根据输入变量的总数目确定该待处理函数的输入变量的类型。例如,双输入类型。
在本实施例的一些可选的实现方式中,执行主体还可以通过如下方式确定待处理函数的输入变量的类型:
第一步,确定预先确定的不可控变量集合中是否存在与输入变量相匹配的不可控变量。这里,执行主体可以将待处理函数的输入变量与不可控变量集合中的不可控变量进行逐一比较。通常,若不可控变量集合中存在与输入变量相同的变量,则认为不可控变量集合中存在与输入变量相匹配的不可控变量。
其中,上述预先确定的不可控变量集合,可以是通过技术人员预先设定的方式得到。此时,上述预先确定的不可控变量集合中的不可控变量,可以是技术人员预先设定的变量。
可选地,若满足条件:从目标代码中确定出与预先存储的危险函数集合中的危险函数相匹配的函数,作为待处理函数,包括:对目标代码进行语法解析,得到目标代码的语法树。其中,语法树包括至少一个子树,子树用于描述目标代码中的表达式。对于至少一个子树中的子树,响应于确定该子树所描述的表达式中包括函数,确定所包括的函数是否属于危险函数集合,响应于确定属于,将所包括的函数作为待处理函数。
满足上述条件时,上述预先确定的不可控变量集合也可以通过如下步骤确定:首先,从根节点至子节点方向遍历上述语法树,得到至少一个子树所描述的至少一个表达式中的变量集合。这里,执行主体可以根据语法树的语法结构,从根节点至子节点方向遍历上述语法树,查找到子树中的用于表征变量的节点,将该节点中的变量存入变量集合。然后,确定变量集合中的变量的类型,将类型为第一类型的变量确定为不可控变量,存入不可控变量集合。其中,第一类型用于表征变量不可控。这里,由于每个变量在被定义的时候会被赋予一个变量类型。又由于同一计算机语言中,变量类型的种类是已知的。因此,执行主体可以预先将计算机语言中的、用于表征变量的值不可被修改的一种或多种变量类型确定为第一类型。以及,将该计算机语言中的、用于表征变量的值可以被修改的一种或多种变量类型确定为第二类型。这样,执行主体可以针对变量集合中的每个变量,判断该变量的变量类型是否为第一类型,若为第一类型,则将该变量确定为不可控变量,存入不可控变量集合。需要指出的是,变量不可控通常指的是该变量不可被修改。作为示例,若某一变量的变量类型为const,则可以认为该变量不可被修改。
需要指出的是,目标代码中的待处理函数通常可能有多个,一个待处理函数的输入变量也可能有多个。本实现方式中,只需从根节点至子节点方向遍历一次上述语法树,便可得到上述目标代码中的所有变量的、用于表征变量是否可控的类型。可以实现在对各待处理函数的各输入变量进行类型确定时,直接将输入变量与不可控变量集合进行比较,以确定该输入变量是否为可控变量。可以提高确定输入变量的类型的效率。
第二步,响应于确定不存在,确定输入变量的类型为第二类型。其中,第二类型用于表征变量可控。这里,通常,若不可控变量集合中不存在与输入变量相同的变量,则认为不可控变量集合中不存在与输入变量相匹配的不可控变量。此时,可以认为输入变量的类型为用于表征变量可控的第二类型。其中,变量可控通常指的是该变量可以被修改。
步骤203,根据所确定的类型,确定待处理函数是否存在漏洞。
在本实施例中,执行主体可以根据输入变量的类型,确定待处理函数是否存在漏洞。
可选地,响应于确定输入变量的类型为第二类型,确定待处理函数存在漏洞。这里,若输入变量的类型为第二类型,此时,可以认为待处理函数存在漏洞。需要指出的是,待处理函数中可以存在多个输入变量。若待处理函数中的任一输入变量的类型为第二类型,则可以认为该待处理函数存在漏洞。
可选地,响应于确定输入变量的类型为第一类型,确定待处理函数不存在漏洞。这里,若输入变量为第一类型,此时,可以认为待处理函数存在漏洞。需要指出的是,待处理函数中可以存在多个输入变量。若待处理函数中的所有输入变量的类型均为第一类型,则可以认为该待处理函数不存在漏洞。
继续参见图3,图3是根据本实施例的用于检测漏洞的方法的应用场景300的一个示意图。在图3的应用场景中,目标代码301可以为:
目标代码301中包括函数main和函数execcmd。其中,main函数的输入变量为vara,输出变量为execcmd(vara)。execcmd函数的输入变量为cmdstr,输出变量为dengrousexec1(cmdstr)。其中,dengrousexec1为一函数名。
所存储的危险函数集合为:{dengrousexec1,dengrousexec2,dengrousexec3}。其中,dengrousexec1,dengrousexec2,dengrousexec3均为危险函数。
这样,首先,服务器302可以从目标代码301中确定出与危险函数集合{dengrousexec1,dengrousexec2,dengrousexec3}中的危险函数dengrousexec1相匹配的函数,作为待处理函数。此时,待处理函数dengrousexec1的输入变量为vara。然后,服务器302可以确定dengrousexec1的输入变量vara的变量类型为string,即为字符串类型。由于字符串类型的变量值属于常量,字符串类型的变量的值在创建之后不可修改。也就是说字符串类型可以是用于表征变量不可控的类型。因此,服务器302可以确定,待处理函数dengrousexec1的输入变量不会被外界修改,不存在漏洞。
本公开的上述实施例提供的用于检测漏洞的方法,可以从目标代码301中确定出与预先存储的危险函数集合中的危险函数相匹配的函数,作为待处理函数。然后,确定待处理函数的输入变量的类型。最后,根据所确定的类型,确定待处理函数是否存在漏洞。本实施例的方法,可以依据待处理函数的输入变量的类型,来确定待处理函数是否存在漏洞,丰富了检测代码中的漏洞的方法,提高了检测代码中的漏洞的灵活性。
进一步参考图4,其示出了用于检测漏洞的方法的又一个实施例的流程400。该用于检测漏洞的方法的流程400,包括以下步骤:
步骤401,从目标代码中确定出与预先存储的危险函数集合中的危险函数相匹配的函数,作为待处理函数。
步骤402,确定待处理函数的输入变量的类型。
步骤403,根据所确定的类型,确定待处理函数是否存在漏洞。
步骤404,响应于确定待处理函数存在漏洞,发出预先设定的、对应于待处理函数的报警信息。
在本实施例中,执行主体可以在确定待处理函数存在漏洞时,及时发出对应于该待处理函数的报警信息。其中,针对每个待处理函数,预先设定的报警信息可以不同。作为示例,若待处理函数a存在漏洞,则报警信息可以是用于描述a存在漏洞的信息。若待处理函数b存在漏洞,则报警信息可以是用于描述b存在漏洞的信息。
在本实施例中,步骤401-403的具体操作与图2所示的实施例中步骤201-203的操作基本相同,在此不再赘述。
从图4中可以看出,与图2对应的实施例相比,本实施例中的用于检测漏洞的方法的流程400突出了在确定待处理函数存在漏洞后的报警信息发送步骤。由此,本实施例描述的方案可以在待处理函数存在漏洞时,自动报警。有助于进一步提高检测代码中的漏洞的灵活性。
进一步参考图5,作为对上述各图所示方法的实现,本公开提供了一种用于检测漏洞的装置的一个实施例,该装置实施例与图2所示的方法实施例相对应,该装置具体可以应用于各种电子设备中。
如图5所示,本实施例的用于检测漏洞的装置500包括:函数确定单元501,被配置成从目标代码中确定出与预先存储的危险函数集合中的危险函数相匹配的函数,作为待处理函数;类型确定单元502,被配置成确定待处理函数的输入变量的类型;漏洞确定单元503,被配置成根据所确定的类型,确定待处理函数是否存在漏洞。
在本实施例的一些可选的实现方式中,上述函数确定单元501可以被进一步配置成:首先,对目标代码进行语法解析,得到目标代码的语法树。其中,语法树包括至少一个子树,子树用于描述目标代码中的表达式。然后,对于至少一个子树中的子树,响应于确定该子树所描述的表达式中包括函数,确定所包括的函数是否属于危险函数集合,响应于确定属于,将所包括的函数作为待处理函数。
在本实施例的一些可选的实现方式中,上述类型确定单元502可以被进一步配置成:首先,确定预先确定的不可控变量集合中是否存在与输入变量相匹配的不可控变量。然后,响应于确定不存在,确定输入变量的类型为第二类型。其中,第二类型用于表征变量可控。
在本实施例的一些可选的实现方式中,预先确定的不可控变量集合通过如下步骤确定:首先,从根节点至子节点方向遍历语法树,得到至少一个子树所描述的至少一个表达式中的变量集合。然后,确定变量集合中的变量的类型,将类型为第一类型的变量确定为不可控变量,存入不可控变量集合。其中,第一类型用于表征变量不可控。
在本实施例的一些可选的实现方式中,上述漏洞确定单元503可以被进一步配置成:响应于确定输入变量的类型为第二类型,确定待处理函数存在漏洞。
在本实施例的一些可选的实现方式中,该装置还包括报警发出单元(图中未示出)。其中,报警发出单元可以被配置成响应于确定待处理函数存在漏洞,发出预先设定的、对应于待处理函数的报警信息。
本公开的上述实施例提供的装置,函数确定单元501从目标代码中确定出与预先存储的危险函数集合中的危险函数相匹配的函数,作为待处理函数。然后,类型确定单元502确定待处理函数的输入变量的类型。最后,漏洞确定单元503根据所确定的类型,确定待处理函数是否存在漏洞。本实施例的装置,可以依据待处理函数的输入变量的类型,来确定待处理函数是否存在漏洞,丰富了检测代码中的漏洞的方法,提高了检测代码中的漏洞的灵活性。
下面参考图6,其示出了适于用来实现本公开的实施例的电子设备(例如图1中的服务器103)600的结构示意图。图6示出的服务器仅仅是一个示例,不应对本公开的实施例的功能和使用范围带来任何限制。
如图6所示,电子设备600可以包括处理装置(例如中央处理单元(cpu)、图形处理器等)601,其可以根据存储在只读存储器(rom)602中的程序或者从存储装置608加载到随机访问存储器(ram)603中的程序而执行各种适当的动作和处理。在ram603中,还存储有电子设备600操作所需的各种程序和数据。处理装置601、rom602以及ram603通过总线604彼此相连。输入/输出(i/o)接口605也连接至总线604。
通常,以下装置可以连接至i/o接口605:包括例如触摸屏、触摸板、键盘、鼠标、摄像头、麦克风、加速度计、陀螺仪等的输入装置606;包括例如液晶显示器(lcd)、扬声器、振动器等的输出装置607;包括例如磁带、硬盘等的存储装置608;以及通信装置609。通信装置609可以允许电子设备600与其他设备进行无线或有线通信以交换数据。虽然图6示出了具有各种装置的电子设备600,但是应理解的是,并不要求实施或具备所有示出的装置。可以替代地实施或具备更多或更少的装置。图6中示出的每个方框可以代表一个装置,也可以根据需要代表多个装置。
特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信装置609从网络上被下载和安装,或者从存储装置608被安装,或者从rom602被安装。在该计算机程序被处理装置601执行时,执行本公开的实施例的方法中限定的上述功能。需要说明的是,本公开的实施例的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开的实施例中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开的实施例中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读信号介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:电线、光缆、rf(射频)等等,或者上述的任意合适的组合。
上述计算机可读介质可以是上述电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该电子设备执行时,使得该电子设备:从目标代码中确定出与预先存储的危险函数集合中的危险函数相匹配的函数,作为待处理函数;确定待处理函数的输入变量的类型;根据所确定的类型,确定待处理函数是否存在漏洞。
可以以一种或多种程序设计语言或其组合来编写用于执行本公开的实施例的操作的计算机程序代码,程序设计语言包括面向对象的程序设计语言—诸如java、smalltalk、c++,还包括常规的过程式程序设计语言—诸如“c”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(lan)或广域网(wan)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本公开的实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的单元也可以设置在处理器中,例如,可以描述为:一种处理器包括函数确定单元、类型确定单元和漏洞确定单元。其中,这些单元的名称在某种情况下并不构成对该单元本身的限定,例如,函数确定单元还可以被描述为“从目标代码中确定出与预先存储的危险函数集合中的危险函数相匹配的函数,作为待处理函数的单元”。
以上描述仅为本公开的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本公开中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离上述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本公开中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。