软件源代码安全漏洞的检测方法及检测装置的制作方法

文档序号:6466499阅读:257来源:国知局

专利名称::软件源代码安全漏洞的检测方法及检测装置的制作方法
技术领域
:本发明涉及软件安全
技术领域
,特别涉及一种软件源代码安全漏洞的检测方法以及检测装置。
背景技术
:目前,软件被越来越多的用于处理各种敏感信息和高价值信息,例如商业信息、财政信息等,这使得软件日益成为企图获取这些信息的攻击者的攻击目标。攻击者企图挖掘软件中的安全漏洞,以干扰软件运行,实现对软件的恶意操作。其中,源代码编写阶段引入的安全漏洞是最常见的安全漏洞。因此,开发一种有效的安全漏洞检测方法,以检测存在于源代码中的潜在安全漏洞是很有必要的。目前,可以采用自动代码安全审计技术从软件源代码中检测出安全漏洞。自动代码安全审计是一种基于软件源代码分析的安全漏洞检测技术,它是静态检测,属于白盒(whitebox)测试技术。自动代码安全审计是在不运行软件的情况下,对软件的源代码进行静态分析,从而获取软件结构。然后再根据分析结果找出软件中的安全漏洞。但是,其缺点在于,静态的源代码分析仅仅适用于检测与语法相关的安全漏洞,例如缓冲溢出、竞争条件等,但是对于分析诸如命令注入和数据库注入等与语义相关的安全漏洞,就显得无能为力。从以上所述可见,目前的安全漏洞检测方法虽然能够检测到存在于软件中的一些安全漏洞,但是由于其检测方式局限,检测不够全面,不能有效的检测出存在于软件源代码中的各种安全漏洞。
发明内容为了解决以上问题,本发明一方面提供一种软件源代码安全漏洞的检测方法,另一方面提供一种软件源代码安全漏洞的检测装置,以便能够有效地检测出存在于软件源代码中的安全漏洞。本发明所提供的软件源代码安全漏洞的检测方法,包括-象语法树AST;根据预先定义的可操纵点和风险点,确定所建立的AST的各节点中的可操纵点和风险点;搜索所述AST中的可操纵点到风险点之间的执行路径,如果所述执行路径上的风险点能够被所述执行路径上的可操纵点控制,则将所述执行路径确定为可能导致安全漏洞的潜在风险执行路径。.根据本发明的方法,其中,所述可操纵点为输入类函数;所述风险点为执行类函数和/或赋值语句。根据本发明的方法,其中,进一步预先定义可操纵点中的可操纵参数和风险点中的风险参数。根据本发明的方法,其中,确定所述执行路径上的风险点能够被所述执行路径上的可操纵点控制的方式为如果所述执行路径上的风险点中的风险参数被所述执行路径上的可操纵点中的可操纵参数污染,则确定所述执行路径上的风险点能够被所述执行路径上的可操纵点控制。根据本发明的方法,其中,确定所述执行路径上的风险点中的风险参数被所述执行路径上的可操纵点中的可操纵参数污染的方式为将所述执行路径上的可操纵点中的可操纵参数作为初始潜在可操纵变量PEV;确定所述执行路径上被所述初始PEV污染的中间PEV;判断所述执行路径上的风险点中的风险参数是否是所述初始PEV或中间PEV,如果是,则判定所述执行路径上的风险点中的风险参数被所述执行路径上的可操纵点中的可操纵参数污染。根据本发明的方法,其中,获取所述执行路径上被所述初始PEV污染的中间PEV的方式为数据流分析方式。根据本发明的方法,其中,获取所述执行路径上被所述初始PEV污染的中间PEV的方式进一步包括控制流分析方式。根据本发明的方法,其中,该方法进一步包括根据所确定的潜在风险执行路径生成测试报告。根据本发明的方法,其中,所述根据所确定的潜在风险执行路径生成测试报告包括如果所述潜在风险执行路径能够直接用测试输入和测试条件表示,则根据所述测试输入和测试条件生成测试脚本,否则,生成记载所述潜在风险执行路径的测试报告。根据本发明的方法,其中,所述待检测软件的源代码为高级编程语言源代码,或者为将可执行程序代码进行反编译而得到的汇编语言源代码。本发明所提供的软件源代码安全漏洞的检测装置,包括源代码处理单元和路径分析单元;其中,所述源代码处理单元,用于建立待检测软件的源代码对应的AST,根据预先定义的可操纵点和风险点,确定所建立的AST的各节点中的可操纵点和风险点;所述路径分析单元,用于在所述源代码处理单元确定的AST的各节点中,确定可操纵点到风险点之间的执行路径,如果所述执行路径上的风险点能够被所述执行路径上的可操纵点控制,则将所述执行路径确定为可能导致安全漏洞的潜在风险执行路径。根据本发明的装置,其中,所述源代码处理单元包括配置模块、分析模块,节点类型定位模块和AST记录模块;所述配置模块,用于记录预先定义的可操纵点和风险点;所述分析模块,用于对待检测软件的源代码进行词法、语法和语义分析,建立AST;所述节点类型定位模块,用于根据所述配置模块中记录的预先定义的可操纵点和风险点,确定所述分析模块建立的AST的各节点中的可操纵点和风险点,并将所述AST以及所确定的可操纵点和风险点记录在AST记录模块中;所述AST记录模块,用于记录所述AST以及所确定的可操纵点和风险点,并提供给所述路径分析单元。根据本发明的装置,其中,所述源代码处理单元进一步包括反编译模块,用于将可执行程序代码反编译为汇编语言源代码,并发送给所述分析模块。根据本发明的装置,其中,所述路径分析单元包括执行路径定位模块和漏洞定位模块;所述执行路径定位模块,用于在所述AST中搜索可操纵点到风险点之间的执行路径,并将搜索到执行路径通知给所述漏洞定位模块;所述漏洞定位模块,用于在接收到所述执行路径定位模块的通知后,确定所述执行路径上的风险点是否能够被所述执行路径上的可操纵点控制,如果是,则将所述执行路径确定为潜在风险执行路径。根据本发明的装置,其中,该装置进一步包括安全测试用例生成单元,用于根据所述路径分析单元确定的潜在风险执行路径生成测试报告。从上述方案可以看出,本发明检测安全漏洞的基础是对源代码进行分析从而建立AST,由于建立AST的过程不仅限于静态的词法和语法分析,还包括语义分析,因此相对于自动代码安全审计技术来说,本发明对源代码的分析过程更为全面。其次,本发明对建立的AST进行路径分析,找到能够由可操纵点控制风险点的执行路径。由于利用这些执行路径,攻击者能够通过向可操纵点输入精心设计的数据而控制风险点,从而导致软件执行出现错误甚至陷入瘫痪。因此,本发明找到的能够由可操纵点控制风险点的执行路径就是安全漏洞。可见,本发明通过在全面的源代码分析而建立的AST中进行路径搜索从而得到各种安全漏洞,使得本发明可以更为有效的将软件源代码中的各种安全漏洞査找出来,并作为完善软件的依据,从而有效的避免了风险点被恶意操纵,增强了软件源代码的安全性。下面将通过参照附图详细描述本发明的示例性实施例,使本领域的普通技术人员更清楚本发明的上述及其他特征和优点,附图中图1为本发明实施例中软件安全漏洞检测方法的流程图;图2为本发明另一实施例中软件安全漏洞检测方法的流程图;图3为本发明实施例中一种AST的结构示意图;图4为本发明实施例中软件安全漏洞检测装置的结构示意图;图5为图4中源代码处理单元1的结构示意图;图6为图4中路径分析单元2的结构示意图。具体实施例方式为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明进一步详细说明。在实际中,攻击者通过输入精心设计的特定数据,使得软件按照某种路径执行,最终导致缓冲溢出、代码注入等安全问题。这些威胁软件安全的执行路径称为潜在风险执行路径(PVEP,PotentialvulnerableExecutionPath),是攻击者挖掘的对象。因此本发明通过搜索软件源代码中的潜在风险执行路径达到检测安全漏洞的目的。基于以上考虑,本发明提供了一种软件安全漏洞的检测方案,该方案通过分析软件源代码建立抽象语法树(AST,AbstractSyntaxTree),根据预先定义的可操纵点(EP,ExploitablePoints)和风险点(VP,VulnerablePoints),确定所建立的AST的各节点中的EP和VP;然后通过对所述AST进行路径分析,确定EP到VP之间的执行路径,如果所述执行路径上的VP能够被所述执行路径上的EP控制,则将查找到的执行路径确定为可能导致安全漏洞的PVEP。其中,EP是指软件源代码中的输入点。通过EP,可以从软件外部向软件输入命令或数据,以控制软件运行状态,进而完成各种预定任务。然而,如果EP被攻击者利用,攻击者可以通过EP输入特定命令或数据,实现对软件的恶意操作。EP通常是以函数形式存在于软件源代码中的。以C语言源代码为例,可以将动态链接库(DLL)、系统调用接口(SCI)、应用程序编程接口(API)以及库函数等提供的输入类函数定义为EP。输入类函数包括用户输入函数(如scanf())、系统环境输入函数(如getenv())和网络输入函数(如read())等。在实际应用中,EP也可以是用户自定义的函数。VP是指软件源代码中的执行点。通过VP,可以进行多种处理以执行各种预订任务。然而,如果这些执行点被攻击者通过EP间接操纵,将可以导致软件运行错误、崩溃等不良后果。VP通常包括函数和赋值语句。仍以C语言源代码为例,可以将DLL、SCI、API以及库函数等提供的执行类函数和赋值语句定义为VP。执行类函数包括访问变量执行函数(如execlp())、操作系统(OS,OperatingSystem)命令执行函数(如system())、数据库命令执行函数(如嵌入式的数据库査询命令EXECSQL)等;赋值语句例如包括字符串拷贝函数strcpy()。以上所述的访问变量执行函数可能导致代码注入漏洞,OS命令执行函数可能导致代码注入漏洞,数据库命令执行函数可能导致数据库注入漏洞,赋值语句可能导致缓冲溢出漏洞。此外,当对资源(文件、网络等)所执行的访问次序异常,造成对同一资源的竞争时,可以导致竞争条件漏洞,其后果是程序无法正常运行。在实际应用中,VP也可以为用户自定义函数。由以上所述可见,本发明通过建立AST并对AST进行路径分析从而确定PEVP。由于建立AST的过程不仅限于静态的词法和语法分析,还包括语义分析,因此在建立的AST的基础上进行路径分析所找到的PEVP可以系统、全面地反映软件源代码中的各种安全漏洞,实现了安全漏洞的有效检测。其中,以上分析源代码并建立AST的过程可以采用编译器中的前端编译器完成。编译器的功能是读取程序源代码并翻译为目标语言。现有的编译器包括前端编译器和后端编译器,前端编译器对源代码进行词法、语法和语义分析,建立AST,同时还将源代码转换为编译器的内部表述(IR,Intermediate),即编译器能够识别的语言。后端编译器分析并优化内部表述,最后生成目标代码。本发明应用前端编译器对源代码进行词法、语法和语义分析,生成AST。图1为本发明一个实施例中软件安全漏洞检测方法的流程图。该实施例采用GNUC编译器(GCC,GNUCCompiler)中的前端编译器CC1作为分析并建立AST的模块。Linux系统下的GCC是GNU推出的功能强大、性能优越的多平台编译器。其中,GNU为"GNU'sNotUnix"的首字母缩写语。如图1所示,该方法包括以下步骤步骤101:读取待检测软件的源代码和预先定义的EP和VP。本步骤中,可以将预先定义的EP和VP分别记录在EP配置文件和VP配置文件中。EP配置文件和VP配置文件也可以为同一个文件。其中,EP配置文件由多行组成,每行描述一个EP。EP配置文件的格式可以为函数名可操纵参数。这里,可操纵参数为函数的某个或某些输入参数。由于一个函数可能具有多个输入参数,并不是每个参数都可能被攻击者直接利用,因此可以根据需要具体定义EP中的哪个输入参数为可操纵参数。以C语言中的字符串输入函数gets()为例EP配置文件中记录了gets:l,表示函数gets()为一个EP;gets()中只有一个输入参数,其第一个也是唯一一个输入参数为可操纵参数。其中,gets()的输入参数为输入的字符串变量。以C语言源代码为例,可以定义为EP的函数包括但不限于从文件中读数据函数fread()、从文件句柄指示的文件中读数据函数read()、从文件句柄指示的文件的指定偏移量处读数据函数pread()、从文件中读字符串函数fgets()、从标准输入设备中输入字符串函数gets()、从文件中读宽字字符串函数fgetws()、从系统环境中取主机名函数gethostname()、从系统环境中取域名函数getdomainname()、从标准输入设备中输入数据函数scanf()、从字符串中读数据函数sscanf()和从文件中读数据函数fscanf(),等等。其中,VP配置文件由多行组成,每行描述一个VP。VP配置文件的格式可以为函数名风险参数。这里,风险参数为函数的某个或某些输入参数。由于一个函数可能具有多个输入参数,并不是每个参数都会被攻击者间接操纵并导致安全漏洞,因此可以根据需要具体定义VP中的哪个输入参数为风险参数。当风险参数被操纵时,其所在函数将导致安全漏洞。以C语言中的命令执行函数之一system()为例VP配置文件中记录了system:l,表示函数system()为一个VP,其第一个输入参数为风险参数。当函数system()的第一个参数被污染(tainted),或者说被操纵时,函数system()可以被攻击者通过某个EP控制,从而造成代码注入的安全漏洞。其中,systemO的第一个参数为被执行的命令名。以C语言源代码为例,可以定义为VP的函数包括但不限于执行shell命令函数system()、执行指定的程序函数execve()、执行指定路径下的程序函数execl()、执行指定的程序文件函数exedp()、执行指定路径下的程序函数execle()、执行指定路径下的程序函数execv()、执行指定的程序文件函数execvp()和创建一个进程执行命令函数popen(),等等。步骤102:对读取的源代码进行词法、语法和语义分析,建立AST,并根据预先定义的EP和VP,确定建立的AST中的EP和VP。本步骤中,通过对读取的源代码进行词法、语法和语义分析以建立AST的过程是现有技术。其中,词法分析是将整个源代码分解成多个词元(tokens),每个词元是一个单独的语言原子单元(atomicunit),例如程序语句中的关键字(keyword)、标识符(identifier)、符号名(symbolname),词法分析是生成AST的第一步。语法分析是通过分析各个词元的顺序来识别程序的语法结构。语法分析阶段开始建立分析树,即AST。AST是一种釆用形式化(formal)文法规则描述的树结构,并采用这种树结构表示词元顺序。语义分析是在AST中添加语义信息,并执行语义检查。AST是在语法和语义分析的交替进行过程中建立起来的。AST中的节点反映了源代码中的程序语句。每个节点都可以有子节点,每个子节点又可以有自己的子节点。每个节点都具有至少一个属性,例如该节点所记录的程序语句的位置(Location)、类型(Type)、有效范围(Scope)等。在建立好AST之后,或在建立AST的过程中,逐一判断AST上各节点是否为预先定义的EP或VP,如果AST上的某节点与预先定义的EP相同,则将该节点记录为EP,如果AST上的某节点与预先定义的VP相同,则将该节点记录为VP。本步骤在记录EP和VP时,可以采用将AST中的EP和VP记录在表格中的方式,也可以采用为AST的各节点增加EP属性和W属性的方式。例如,当某节点为EP时,则将其EP/VP属性值置为预设值,例如置l;当某节点为VP时,则将其EP/VP属性值置为预设值,例如置0。当然,还可以将EP属性和VP属性采用一个两位的比特序列表示,该比特序列中的两位比特分别表示EP属性和VP属性。步骤103:査找AST中EP到VP之间的执行路径,如果所述执行路径上的VP能够被所述执行路径上的EP控制,则确定所述执行路径为PVEP。本步骤中,将AST中的各EP依次作为当前EP,并针对当前EP进行如下处理al、将当前EP中定义为可操纵参数的输入变量作为初始PEV(PotentialExploitableVariable,潜在可操纵变量);其中,初始PEV可能为一个或多于一个变量;bl、从当前EP开始,按预设搜索算法在AST中进行路径搜索,逐一确定当前搜索节点是否为VP以及当前搜索节点中出现的中间PEV;如果当前搜索节点是VP,则确定该VP的风险参数是否为其所在执行路径上的初始PEV或中间PEV;如果该VP的风险参数是其所在执行路径上的初始PEV或中间PEV,则确定该VP与当前EP之间的执行路径为一条PVEP。上述al与M步骤针对AST中的各EP重复进行,直至针对所述各EP的路径搜索全部完成。在所述步骤bl中,进行路径搜索时采用的搜索算法通常为深度优先搜索(deep-firstsearching)法则,其搜索方式是从树的根节点开始,优先向纵深搜索,直至到达树的最后一级节点,在搜索中如果遇到树的分叉,则可以根据预先设置的原则先搜索左分支,或先搜索右分支。以先搜索左分支为例,,再搜索左支子节点的左支子节点,直到到达树的最后一级节点,然后,返回该最后一级节点的父节点,判断该父节点是否有右支子节点,如果有,则继续搜索该右支子节点,再搜索该右支子节点的左支子节点,直到到达树的最后一级节点;否则,返回再上一级节点;如此类推,直到遍历了由该根节点出发的所有路径,至此,针对该根节点的路径搜索结束。在所述步骤bl中,针对路径搜索过程中的每一个当前搜索节点,都进行该节点是否为W的判断,如果是,则确定找到一条当前EP到该VP之间的执行路径。所述步骤bl中,当前搜索节点中出现的中间PEV可以通过数据流分析(dataflowanalysis)确定。此外,为了增加PEV分析的有效性,还可以在数据流分析的基础上辅以控制流分析(controlflowanalysis)。数据流分析和控制流分析可以在搜索到每一个节点时进行。其中,数据流分析是指对于变量的定义和使用进行分析。例如,当一个变量为PEV,可以理解为该变量会被污染,将该PEV拷贝或赋值给另一个变量时,则另一个变量也会被污染,成为另一个PEV,这个分析过程就是数据流分析。而当程序在将一个变量拷贝或赋值给另一个变量之前,进行了合法性检査,例如判断第一个变量的长度是否超过合法的长度,变量的取值中是否包括非法字符(例如"/"),如果判断为是,则不执行拷贝或赋值操作,或在进行相应处理后再进行拷贝或赋值操作,那么,即使有拷贝或赋值语句,第二个变量也不会被污染。这种判断程序中是否有合法性检查语句的分析过程就属于控制流分析的一种分析方式。步骤104:根据检测到的PVEP,生成测试用例,并上报给测试人员。在实际中,如果一条PVEP的执行过程比较简单,可以直接采用测试输入和测试条件表示时,将测试输入和测试条件作为测试脚本内容并上报。其中,测试输入为用户、测试环境或网络输入的参数值;测试条件是令该PVEP上的VP能够被EP控制的条件信息。当PVEP的执行过程比较复杂,因而测试PVEP的测试输入和测试条件不能简单地确定,而需要人工设置时,可以将PVEP的路径描述记载在测试报告中并输出给测试人员,由测试人员根据测试报告进行后续测试。PVEP的路径描述可以为该条执行路径上的各节点所记录的程序语句的行号,描述方式可以是表格方式,也可以是堆栈方式。下面,举实例对PVEP的执行过程比较简单,可以生成测试脚本的情况进行描述。首先,举一个采用测试输入作为测试脚本的实例1。实例1中,VP中的风险参数是EP中的可操纵参数,实例1中待检测软件程序的C语言源代码如下voidmain()charstr[100];scanf("%s,,,str);system(str);CC1读取该待检测软件的源代码后,生成AST。其中,节点scanf()为EP,其输入参数str为可操纵参数,即变量str为初始PEV;system()为VP,其输入参数str为风险参数。由于变量str为初始PEV,因此从scanf("%s",str)到system(str)之间的执行路径为PVEP。通过对该PVEP的分析可以发现,此PVEP直接由用户输入str,未做任何检查就当作操作系统命令执行,将会导致代码注入漏洞。因此,可以令stF"cat/etc/password",那么当沿该PVEP执行时,会显示保存在/etc路径下的password文件,即系统用户名文件。由于当黑客攻击系统时,首先需要获取系统中合法用户的名单,然后黑客才可能破解这些用户的口令,所以保存合法用户名单的用户名文件是敏感信息,因此本实例将str="cat/etc/password"作为测试脚本的内容。该str二"cat/etc/password"为测试输入。根据PVEP的检测结果,测试人员可以对软件源代码进行完善,例如可以在system(str)函数调用之前增加判断语句,判断str的值是否为安全值,例如规定str不能是被禁止访问的路径名cat/etc/password;如果str值安全,则执行system(str);否则,不执行system(str)。然后重新采用上述测试脚本,对修改后的软件源代码进行测试,如果不再显示系统的用户名文件,则证明原有的安全漏洞被成功弥补。可见,生成测试脚本可以实现自动的软件测试,减轻测试人员的负担,提高测试和效率。再举一个采用测试输入作为测试脚本的实例2。实例2中,VP中的风险参数并不是EP中的可操纵参数,但是VP中的风险参数受到EP中的可操纵参数的污染,实例3的C语言源代码为如下形式voidmain()charstr[100],*A;scanf("%s",str);A=str;system(A);其中,scanf()为EP,其输入参数str为可操纵参数,即变量str为初始PEV;system()为VP,其输入参数A为风险参数。由于A被str赋值,则A是中间PEV,因此,从scanf("。/。s",str)到system(str)之间的执行路径为PVEP。可见,当用户为str赋值"cat/etc/password"时,将显示保存在/etc路径下的password文件。因此,步骤105生成的测试脚本为str="cat/etc/password",该str="cat/etc/password"为测试输入。再举一个采用测试输入和测试条件作为测试脚本的实例3。实例3中,C语言源代码为如下形式-voidmainOcharstr[,;intX;scanf("%d%s",&X,str);if(X>0)thensystem(str);elsereturn^在实例3中,只有X大于零时,才会执行到system(str),那么,本实例中生成的测试脚本可以为str="cat/etc/password",X=l。其中,str="cat/etc/password"为测试输入,X=l为测试条件。至此,本流程结束。以下结合图2对图1示出的实施例进行详细描述。如图2所示,该方法包括步骤201:打开EP配置文件和VP配置文件,读取文件中的EP和VP。步骤202:读取并分析源代码,建立AST;识别AST中所有出现的EP和VP,并标记在AST中。本步骤中分析源代码并建立AST的操作是已知技术手段,可以采用GCC中的前端编译器CC1完成,这里就不再详述。但是,所述识别AST中所有出现的EP和VP,并标记在AST中的步骤是现有CC1不能完成的,需要对CC1进行修改,添加用于识别EP和VP的功能。本步骤中,将识别出的EP和VP标记在AST的具体方式为在建立AST过程中,根据EP配置文件査找AST上的节点是否为EP,在EP的节点描述中将EP属性赋值为1,将VP属性赋值为0,表示该节点只为EP;根据VP配置文件查找AST上的节点是否为VP,在VP的节点描述中将VP属性赋值为l,将EP属性赋值为O,表示该节点为只是VP。如果一个节点同时为EP和VP,则在该节点的节点描述中将EP属性和VP属性同时赋值为1。当然,也可以采用将AST上的EP和VP记录于表格的方式实现EP和VP的记录。本实施例中,CC1在分析源代码之前,必须读取源代码并转换为编译器能够识别的语言。通常,当源代码为采用诸如C/C++,PASCAL,JAVA等高级程序语言编写的程序代码时,CC1可以直接读取,并完成转换。但是,在实际中难于获取程序的源代码时,本实施例中的CC1可以将可执行程序(ExecutableSoftware)反编译成汇编语言,此时CC1可以读取汇编语言编写的程序代码,并完成转换。无论是高级语言还是汇编语言都是具有数据结构的编程语言,编译器能够识别这些编程语言并转换为内部表述,是利用用户输入的配置文件实现的。每种语言都具有各自的配置文件,配置文件中记载了语言的数据结构,是编译器进行转换的依据。这些数据结构是按词法分析器(LEX)和语法分析器(YACC)的定义来描述的,这样LEX就可以解析该语言的词法,而YACC则可以解析该语言的语法。步骤203:选择AST中的一个被标记为EP的节点作为当前EP。步骤204:记录当前EP的位置信息;将当前EP的可操纵参数确定为初始PEV,并记录在本轮路径搜索的PEV检查列表中,然后从当前EP开始进行搜索,将搜索到的下一个节点作为当前搜索节点。本步骤中,将当前EP所描述的程序语句在源代码中的行号入栈,以记录当前EP的位置信息。每次从一个EP开始新一轮的路径搜索时,都建立新的PEV检查列表。步骤205:记录当前搜索节点的位置信息,确定当前搜索节点中出现的中间PEV,并记录在本轮路径搜索的PEV检查列表中。本步骤中,将当前搜索节点所描述的程序语句在源代码中的行号入栈,并采用前述步骤103中描述的PEV确定方式确定当前搜索节点中出现的中间PEV。需要说明的是,在记录PEV时,还可以进一步考虑PEV的作用域,PEV的作用域是指PEV将会污染的节点的集合。PEV的作用域可以直接采用PEV所在节点的作用域。其中,前端编译器CC1获取节点作用域为已知技术手段,其基本的工作方式如下首先,获取一个节点的有效范围(Scope)属性值,如果Scope的属性值为GLOBAL,则该节点为全局节点,从该节点获取的PEV为全局变量,该PEV的作用域为AST中的所有节点。如果Scope的值为LOCAL,则该节点为局部节点,从该节点获取的PEV为局部变量,那么,该PEV的作用域就为AST中与其所在节点具有相同父节点的所有同级(兄弟)节点;如果其中存在一个同级节点所描述的程序语句为一函数,则该PEV的作用域不包括该同级节点的子节点;而对于其他情况,如一个同级节点所描述的程序语句为表达式等,则该PEV的作用域包括该同级节点的子节点。因此本步骤205在记录PEV时,可以先判断PEV检査列表中的已有PEV的作用域是否包括当前搜索节点,并将作用域不包括当前搜索节点的PEV从PEV检查列表中删除。可以理解,由于被删除的PEV不会污染本轮路径搜索中的后续搜索节点中的变量,因而在后续确定PEV的操作中不需再考虑这些被删除的PEV。下面举一个例子对PEV的作用域及其在记录PEV时的作用进行描述。图3为一种AST的结构示意图。如图3所示,图中的圆形表示节点,圆形中的N为节点(Node)的英文縮写,圆形中的数字为节点编号,两个圆形中间的直线表示两个节点之间的连接关系。各节点及其连接关系构成了AST。在图3示出的该AST中,Nl为根节点且为EP,N2为Nl的左支子节点,N5为Nl的右支子节点,N3和N4为N2的子节点,N6为N5的子节点。在分析N3时,确定了PEV2,由于N3的有效范围为与其具有相同父节点的同级子节点,即N2的子节点N4,那么当分析N4时,由于PEV2的作用域包括N4,因此如果N4中的变量被PEV2污染,则该变量为N4中出现的中间PEV。'但是,当N2及其子节点分析完了,需要分析N5的时候,由于PEV2的作用域不包括N5,此时,可以从PEV检查列表中删除PEV2,然后再根据PEV检查列表中的PEV确定N5中是否出现中间PEV。步骤206:判断当前搜索节点是否为VP,如果是,则执行步骤207;否则,执行步骤209。本步骤中,判断当前搜索节点的VP属性是否为1,如果是,则判定当前处理节点为VP,执行步骤207。步骤207:判断所述VP的风险参数是否为PEV检查列表中的PEV,如果是,则执行步骤208,否则,执行步骤209。本实施例中,在对当前搜索节点进行分析时,先将当前搜索节点中出现的中间PEV记录在PEV检查列表中,再判断当前搜索节点是否为VP,如果是,然后判断该VP的风险参数是否为PEV检査列表中的PEV。在实施中,也可以先判断当前搜索节点是否为VP,如果是,再判断该VP中的风险参数是否受到PEV检查列表中的PEV的污染,如果是,则将VP中受到污染的风险参数添加到PEV检查列表中,并执行步骤208。步骤208:将当前EP到所述VP之间的路径确定为PVEP,根据PVEP生成测试用例上报给测试人员。可见,确定AST中的PVEP有两个条件,其一是当前搜索节点为一个VP,其二是该节点的风险参数为PEV。步骤209:判断当前搜索节点是否为本轮路径搜索中的最后一个节点,如果是,则执行步骤210;否则,执行步骤212。步骤210:判断是否遍历了AST上的所有EP,如果是,则结束本流程;否则,执行步骤211。步骤211:选择AST中下一个被标记为EP的节点,作为当前EP,返回执行步骤204。步骤212:将本轮路径搜索中的下一个节点作为当前搜索节点,返回执行步骤205。步骤212中,下一个节点根据预定的搜索算法确定。至此,本流程结束。为了实现上述实施例描述的软件安全漏洞检测方法,本发明实施例还提供了一种软件安全漏洞的检测装置。图4为本发明实施例中软件安全漏洞检测装置的结构示意图。如图4所示,该装置包括源代码处理单元l、路径分析单元2和安全测试用例生成单元3。以下分别对各组成模块进行详细描述。首先,源代码处理单元l,用于建立待检测软件的源代码对应的AST,根据预先定义的EP和VP,确定所建立的AST的各节点中的EP和VP。图5为图4中源代码处理单元1的结构示意图。如图5所示,该源代码处理单元l可以具体包括配置模块ll、分析模块12,节点类型定位模块13和AST记录模块14。其中,配置模块ll,用于记录预先定义的EP和VP。具体地,可以存储EP配置文件和VP配置文件,配置文件的具体格式前面已经具体描述。分析模块12,用于对待检测软件的源代码进行词法、语法和语义分析,建立AST。节点类型定位模块13,用于根据配置模块11中记录的预先定义的EP和VP,确定分析模块12建立的AST的各节点中的EP和VP,并将所述AST以及所确定的EP和VP记录在AST记录模块14中。AST记录模块14,用于记录AST以及该AST上的EP和VP,并提供给路径分析单元2。具体地,可以保存AST和该AST中的EP和VP的表格,或者保存具有EP和VP标记的AST。源代码处理单元1还可以进一步包括反编译单元15,用于将可执行程序代码反编译为汇编语言编写的源代码,发送给分析模块12。如果源代码为高级编程语言编写的程序代码,则可以直接由分析模块12读取。所述检测装置中的路径分析单元2,用于在源代码处理单元1确定的AST的各节点中,确定EP到VP之间的执行路径,如果所述执行路径上的VP能够被所述执行路径上的EP控制,则将所述执行路径确定为可能导致安全漏洞的PVEP。图6示出了图4中路径分析单元2的结构示意图。如图6所示,该路径分析单元2中可以具体包括执行路径定位模块21和漏洞定位模块22。其中,执行路径定位模块21,用于采用预设搜索算法遍历AST中的各节点,搜索各EP到VP之间的执行路径,将搜索到执行路径通知给漏洞定位模块22。其中,预设搜索算法如前所述可以为深度优先搜索算法。漏洞定位模块22,用于在接收到执行路径定位模块21的上述通知后,确定所述执行路径上的VP是否能够被所述执行路径上的EP控制,如果是,则将所述执行路径确定为PVEP。在预先定义的EP和VP中包括了可操纵参数和风险参数时,执行路径定位模块21还用于在搜索执行路径时,以各EP中的可操纵参数为初始PEV,确定所述执行路径上被所述初始PEV污染的中间PEV,并将所确定的初始PEV和中间PEV发送给漏洞定位模块22。其中,确定中间PEV的方式如前所述可以采用数据流分析方式,或者釆用数据流分析与控制流分析相结合的方式。相应的,漏洞定位模块22则具体用于在接收到执行路径定位模块21的上述通知、初始PEV和中间PEV后,确定所述执行路径上的VP中的风险参数是否为所述初始PEV或中间PEV,如果是,则将所述执行路径确定为PVEP。具体地,该漏洞定位模块22可以包括判断子模块61和定位子模块62。其中,判断子模块61,用于接收执行路径定位模块21发来的所述通知、初始PEV和中间PEV,确定执行路径定位模块21搜索到的执行路径上的VP中的风险参数是否为所述初始PEV或中间PEV,将判断结果发送给定位子模块62。定位子模块62,用于在接收到的所述判断结果为是时,将执行路径定位模块21搜索到的执行路径确定为PVEP。所述检测装置中的安全测试用例生成单元3,用于根据接收自执行路径分析单元2的PVEP生成测试用例。具体地,该安全测试用例生成单元3可以判断所接收的EPVP是否可以采用测试输入和测试条件表示,如果是,则根据测试输入和测试条件生成测试脚本,并上报给测试人员;否则,则将EPVP的路径记载在测试报告中上报给测试人员。由以上所述可见,本发明检测安全漏洞的基础是对源代码进行分析,而且分析并不局限于静态的词法和语法分析,还包括语义分析,以及能够模拟软件执行过程的执行路径分析,因此能够有效的检测到各种潜在风险执行路径,从而有效地检测出存在于软件源代码中的安全漏洞。以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换以及改进等,均应包含在本发明的保护范围之内。权利要求1、一种软件源代码安全漏洞的检测方法,其特征在于,该方法包括建立待检测软件的源代码对应的抽象语法树AST;根据预先定义的可操纵点和风险点,确定所建立的AST的各节点中的可操纵点和风险点;搜索所述AST中的可操纵点到风险点之间的执行路径,如果所述执行路径上的风险点能够被所述执行路径上的可操纵点控制,则将所述执行路径确定为可能导致安全漏洞的潜在风险执行路径。2、根据权利要求1所述的方法,其特征在于,所述可操纵点为输入类函数;所述风险点为执行类函数和/或赋值语句。3、根据权利要求2所述的方法,其特征在于,进一步预先定义可操纵点中的可操纵参数和风险点中的风险参数。4、根据权利要求3所述的方法,其特征在于,确定所述执行路径上的风险点能够被所述执行路径上的可操纵点控制的方式为如果所述执行路径上的风险点中的风险参数被所述执行路径上的可操纵点中的可操纵参数污染,则确定所述执行路径上的风险点能够被所述执行路径上的可操纵点控制。5、根据权利要求4所述的方法,其特征在于,确定所述执行路径上的风险点中的风险参数被所述执行路径上的可操纵点中的可操纵参数污染的方式为将所述执行路径上的可操纵点中的可操纵参数作为初始潜在可操纵变量PEV;确定所述执行路径上被所述初始PEV污染的中间PEV;判断所述执行路径上的风险点中的风险参数是否是所述初始PEV或中间PEV,如果是,则判定所述执行路径上的风险点中的风险参数被所述执行路径上的可操纵点中的可操纵参数污染。6、根据权利要求5所述的方法,其特征在于,获取所述执行路径上被所述初始PEV污染的中间PEV的方式为数据流分析方式。7、根据权利要求6所述的方法,其特征在于,获取所述执行路径上被所述初始PEV污染的中间PEV的方式进一步包括控制流分析方式。8、根据权利要求1所述的方法,其特征在于,该方法进一步包括根据所确定的潜在风险执行路径生成测试报告。9、根据权利要求8所述的方法,其特征在于,所述根据所确定的潜在风险执行路径生成测试报告包括如果所述潜在风险执行路径能够直接用测试输入和测试条件表示,则根据所述测试输入和测试条件生成测试脚本,否则,生成记载所述潜在风险执行路径的测试报告。10、根据上述任一权利要求所述的方法,其特征在于,所述待检测软件的源代码为高级编程语言源代码,或者为将可执行程序代码进行反编译而得到的汇编语言源代码。11、一种软件源代码安全漏洞的检测装置,其特征在于,该装置包括源代码处理单元(1)和路径分析单元(2);所述源代码处理单元(1),用于建立待检测软件的源代码对应的AST,根据预先定义的可操纵点和风险点,确定所建立的AST的各节点中的可操纵点和风险点;所述路径分析单元(2),用于在所述源代码处理单元(1)确定的AST的各节点中,确定可操纵点到风险点之间的执行路径,如果所述执行路径上的风险点能够被所述执行路径上的可操纵点控制,则将所述执行路径确定为可能导致安全漏洞的潜在风险执行路径。12、根据权利要求11所述的检测装置,其特征在于,所述源代码处理单元(1)包括配置模块(11)、分析模块(12),节点类型定位模块(13)和AST记录模块(14);所述配置模块(11),用于记录预先定义的可操纵点和风险点;所述分析模块(12),用于对待检测软件的源代码进行词法、语法和语义分析,建立AST;所述节点类型定位模块(13),用于根据所述配置模块(11)中记录的预先定义的可操纵点和风险点,确定所述分析模块(12)建立的AST的各节点中的可操纵点和风险点,并将所述AST以及所确定的可操纵点和风险点记录在AST记录模块(14)中;所述AST记录模块(14),用于记录所述AST以及所确定的可操纵点和风险点,并提供给所述路径分析单元(2)。13、根据权利要求12所述的检测装置,其特征在于,所述源代码处理单元(1)进一步包括反编译模块(15),用于将可执行程序代码反编译为汇编语言源代码,并发送给所述分析模块(12)。14、根据权利要求11所述的检测装置,其特征在于,所述路径分析单元(2)包括执行路径定位模块(21)和漏洞定位模块(22);所述执行路径定位模块(21),用于在所述AST中搜索可操纵点到风险点之间的执行路径,并将搜索到执行路径通知给所述漏洞定位模块(22);所述漏洞定位模块(22),用于在接收到所述执行路径定位模块(21)的通知后,确定所述执行路径上的风险点是否能够被所述执行路径上的可操纵点控制,如果是,则将所述执行路径确定为潜在风险执行路径。15、根据权利要求11所述的检测装置,其特征在于,该装置进一步包括安全测试用例生成单元(3),用于根据所述路径分析单元(2)确定的潜在风险执行路径生成测试报告。全文摘要本发明公开了一种软件源代码安全漏洞的检测方法,该方法包括建立待检测软件的源代码对应的抽象语法树AST;根据预先定义的可操纵点和风险点,确定所建立的AST的各节点中的可操纵点和风险点;搜索所述AST中的可操纵点到风险点之间的执行路径,如果所述执行路径上的风险点能够被所述执行路径上的可操纵点控制,则将所述执行路径确定为可能导致安全漏洞的潜在风险执行路径。本发明还公开了一种软件安全漏洞的检测装置。使用本发明能够有效地检测出存在于软件源代码中的安全漏洞。文档编号G06F21/00GK101661543SQ20081014695公开日2010年3月3日申请日期2008年8月28日优先权日2008年8月28日发明者文唐申请人:西门子(中国)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1