一种源文件安全漏洞的检测方法及检测装置的制作方法

文档序号:6431166阅读:92来源:国知局
专利名称:一种源文件安全漏洞的检测方法及检测装置的制作方法
—种源文件安全漏洞的检测方法及检测装置
技术领域
本发明涉及信息安全中的软件安全技术领域,尤其涉及一种源文件安全漏洞的检测方法及检测装置。
背景技术
现有的源文件安全漏洞的检测方法通常都是通过扫描分析源代码后建立其对应的抽象语法树(AST),并根据预先定义的可操纵点和风险点,在所建立的抽象语法树中搜索可操纵点到风险点之间的执行路径,找到可能导致安全漏洞的潜在风险。如果所述执行路径上的风险点能够被所述执行路径上的可操纵点控制,则将所述执行路径确定为可能导致安全漏洞的潜在风险执行路径。这种通过建立抽象语法树,而后再遍历抽象语法树进行回溯算法,最终找到一条用户可控路径的检测方式,较为复杂,对于每一个待扫描的源代码文件,都需要构建抽象语法树,因而需要耗费更多的测试系统资源,导致代码测试的效率低·下。

发明内容为了解决上述问题,本发明提供了一种源文件安全漏洞的检测方法及检测装置,无需建立抽象语法树,可节约测试系统资源,提高代码扫描效率。具体技术方案如下相应地,本发明实施例提供的一种源文件安全漏洞的检测方法,逐个对源文件进行扫描,对当前扫描到的源文件执行以下步骤对源文件进行词法分析、语法分析;在所述语法分析过程中进行变量识别操作和风险点识别操作;其中,所述变量识别操作包括识别变量并对识别出的变量进行存储;所述风险点识别操作包括识别风险点,如果识别出风险点,则利用所述风险点的参数对存储的变量进行回溯,如果所述风险点的参数能回溯至可输入点,且在回溯的过程中未经过安全函数处理,则认为所述风险点是导致安全漏洞的潜在风险点。根据本发明之一优选实施例,所述词法分析是将源文件的字符序列转换成Token序列。根据本发明之一优选实施例,在对源文件进行词法分析后还包括对所述Token序列进行预处理;所述预处理包括去除可忽略的Token以及Token的修正处理。根据本发明之一优选实施例,所述识别变量具体为分析所述Token序列中的各Token是否为变量。根据本发明之一优选实施例,所述识别风险点是将所述Token序列中的各Token与预定义的风险函数列表进行匹配,如果能够匹配到,则识别出匹配的Token为风险点。根据本发明之一优选实施例,所述对识别出的变量进行存储包括将识别出的变量压入变量栈,所述对存储的变量进行回溯包括在所述变量栈中进行变量回溯;或者,所述对识别出的变量进行存储包括将识别出的变量送入队列,所述对存储的变量进行回溯包括在所述队列中进行变量回溯。
根据本发明之一优选实施例,如果在存储的变量中能够回溯到所述风险点的参数,则确定所述风险点的参数能回溯至可输入点。根据本发明之一优选实施例,该方法还包括生成并输出包含所述潜在风险点信息的结果报告。相应地,本发明实施例提供的一种源文件安全漏洞的检测装置,包括主控制台模块,用于启动扫描任务,触发扫描分析模块逐个对源文件进行扫描;以及,所述扫描分析模块包括词法分析子模块和语法分析子模块;其中,所述词法分析子模块,用于受到所述主控制台模块的触发时,逐个对源文件进行扫描,并对当前扫描到的源文件进行词法分析;所述语法分析子模块,用于在所述词法分析后对所述当前扫描到的源文件进行语法分析,并在语法分析过程中进行变量识别操作和风险点识别操作;其中,所述变量识别操作包括识别变量并对识别出的变量进行存储;所述风险点识别操作包括识别风险点,如果识别出风险点,则利用所述风险点的参数对存储的变量进行回溯,如果所述风险点的参数能回溯至可输入点,且在回溯的过程中未经过安全函数处理,则认为所述风险点是导致安全漏洞的潜在风险点。根据本发明之一优选实施例,所述词法分析子模块进行词法分析是将当前扫描到的源文件的字符序列转换成Token序列。根据本发明之一优选实施例,所述扫描分析模块还包括预处理子模块,用于对所述词法分析子模块转换得到的所述Token序列进行预处理后提供给所述语法分析子模块;所述预处理包括去除可忽略的Token以及Token的修正处理。根据本发明之一优选实施例,所述语法分析子模块进行识别变量具体为分析所述Token序列中的各Token是否为变量。根据本发明之一优选实施例,所述语法分析子模块进行识别风险点是将所述Token序列中的各Token与预定义的风险函数列表进行匹配,如果能够匹配到,则识别出匹配的Token为风险点。根据本发明之一优选实施例,所述语法分析子模块在对识别出的变量进行存储时具体将识别出的变量压入变量栈,在对存储的变量进行回溯时具体在所述变量栈中进行变量回溯;或者,所述语法分析子模块在对识别出的变量进行存储时具体将识别出的变量送入队列,在对存储的变量进行回溯时具体在所述队列中进行变量回溯。根据本发明之一优选实施例,如果在存储的变量中能够回溯到所述风险点的参数,则所述语法分析子模块确定所述风险点的参数能回溯至可输入点。根据本发明之一优选实施例,该检测装置还包括报告生成模块,生成并输出包含所述潜在风险点信息的结果报告。由以上技术方案可以看出,本发明提供的一种源文件安全漏洞的检测方法及检测装置,在语法分析过程中完成变量存储、风险点的变量回溯、安全函数判断等处理,直到找到一个未经安全函数处理且来自用户输入的风险点。相较于现有技术,本发明所提供的检测方法将漏洞检测与语法分析相结合,无需建立抽象语法树,简化了处理流程,节约测试系统资源,提高代码扫描效率。

图I是本发明实施例提供的源文件安全漏洞的检测方法流程图;图2是本发明实施例提供的源文件安全漏洞的检测方法具体流程图;图3是本发明实施例提供的源文件安全漏洞的检测装置的框图;
图4是本发明实施例提供的扫描分析模块的内部示意图。
具体实施方式为了使本发明的目的、技术方案和优点更加清楚,下面结合附图和具体实施例对本发明进行详细描述。如图I所示,为本发明的源文件安全漏洞的检测方法流程图,该方法逐个对源文件进行扫描,对当前扫描到的源文件执行以下步骤SlOl、对源文件进行词法分析。所述词法分析是将源文件的字符序列转换成记号(Token)序列的扫描过程,以便进行下一步语法分析。其中Token表示源文件中信息单元的字符序列,与自然语言中的单词类似,是构成源文件的最小单位,包括基本字、标识符、常数、运算符、界符等类型。在扫描过程中,最主要的任务是进行格式匹配,通常采用的格式说明和识别方法主要有正则表达式和有穷自动机(DFA)等,在本发明中可以采用现有的词法分析方法,并不限制于采用何种方法,故不于此赘述。S102、对当前扫描到的源文件进行语法分析。所述语法分析是在所述词法分析的基础上,按照不同程序语言的语法规则,从Token序列中识别出各类语法成分,如“程序”,“语句”,“表达式”,“函数”等等,同时进行语法检查,用于判断源文件在结构上是否正确。S103、在所述语法分析过程中进行变量识别操作和风险点识别操作。所述变量识别操作包括识别变量并对识别出的变量进行存储。根据语法规则分析Token的类型,可以确定是变量、赋值语句、数值声明、类定义、函数定义等语句,识别出该些语句中的变量,并将所识别出的变量进行步骤S1031 :变量存储。优选的变量存储方式为以堆栈的方式存储变量,即将变量压入变量栈(图I中以变量栈为例)。除此之外,还可以采用诸如队列等方式进行变量存储。所述风险点识别操作包括识别风险点,如果识别出风险点,则利用所述风险点的参数对存储的变量进行回溯,如果所述风险点的参数能回溯至可输入点,且在回溯的过程中未经过安全函数处理,则认为所述风险点是导致安全漏洞的潜在风险点。根据语法规则,如果分析到Token的类型是函数类型,则进行风险点的识别,将Token与预定义的风险函数列表进行匹配,如果能够匹配,则识别出匹配的Token是风险点。当识别出为风险点,则进入步骤S1032 :变量回溯,在存储的变量中如果能找到所述风险点的参数,判断存储的变量是否来自用户输入(用户可输入点),如果存储的变量是用户可输入点,则确定所述风险点能回溯至可输入点。进入步骤S1033 :安全函数判断,判断在变量回溯过程中风险点的参数是否经过安全函数的处理,如果未经过安全函数处理,则认为所述风险点是导致安全漏洞的潜在风险点。需要说明的是,不同风险点可能具有不同的安全函数,因此,可以预先存储各风险点对应的安全函数,判断在变量回溯过程中风险点的函数是否经过对应安全函数的处理。S104、生成结果生成并输出包含潜在风险点信息的结果报告。该生成并输出结果报告的步骤可以实时执行,即每识别出一个潜在风险点就生成并输出一个结果报告,也可以在当前源文件扫描结束后执行,也可以在所有源文件的扫描结束后执行。下面举一个对源文件进行安全漏洞检测的实例,如图2所示,对本发明的流程进一步详细说明
·
S201、用户配置在进行源文件安全漏洞检测之前,先进行用户配置。所述用户配置的内容,包括源文件路径、风险函数列表的配置、风险点对应的安全函数配置、以及辅助配置项,如结果报告的保存路径设置等。S202、开始扫描在设定好用户配置信息后,启动扫描程序,对源文件进行逐个遍历扫描。S203、对当前扫描到的源文件进行逐行分析。S204、词法分析将当前扫描到的源文件的字符序列转换成Token序列,以便进行下一步分析。为了提高Token分析的效率,通常在词法分析后会对Token序列进行预处理,包括去除可忽略的Token以及Token的修正处理,如大小写转换等。根据预先配置的一个忽略Token列表,将能够与该列表匹配的Token从词法分析的结果中删除。S205、Token分析对Token序列根据语法规则进行语法分析,分析每个Token的类型,确定是变量、赋值语句、数值声明、类定义或函数定义等类型。S206、分类处理根据不同类型的Token,分为不同的处理方式。在此过程中,主要进行变量识别和风险点识别。如果识别为变量则进行步骤S207,如果识别为风险点则进行步骤S208,如果识别为其他类型的Token,则进行步骤S209,进行跳过处理到步骤S213。根据语法规则分析Token的类型,可以确定是变量、赋值语句、数值声明、类定义、函数定义等语句,识别出该些语句中的变量。如果分析到Token的类型是函数类型,则将Token与预定义的风险函数列表进行匹配,如果能够匹配,则识别为风险点。所述预定义的风险函数列表,是从不同的安全角度,考察漏洞在哪些函数里发生。比如从Web安全来说,所述风险函数列表包括但不限于跨站脚本攻击、结构化查询语言(SQL)注入攻击、代码执行漏洞、文件包含漏洞、信息泄露漏洞、文件篡改漏洞、命令执行漏洞、可扩展标记语言路径(XPath)注入的函数。例如,在PHP语言中,对于跨站脚本漏洞(XSS漏洞)主要有以下几个函数‘echo’,‘print’,‘printf’,‘vprintf’,‘header’等,按规则定义在$PVF_XSS中。对于不同语言的源文件,漏洞会有所差别,所述预定义的风险函数列表可根据所用语言的漏洞原理进行调整。S207、变量压栈对识别到的变量,进行变量压栈。根据语法规则分析得到的Token类型,如果识别为变量,则将所识别到的变量压入变量栈。为了节约存储空间,可以仅将来自用户输入的变量压入变量栈。判断变量是否来自用户输 入,是通过用户可输入点的规则定义来判断,所述规则定义中包括来自用户输入的变量。例如,一个变量出现在赋值语句的左边,右边是通过$_GET获取的,则这个变量是来自用户输入的。所述来自用户输入的变量包括1)用户直接输入的变量,如在PHP语言中通过$_GET, $_P0ST, $_C00KIE, $_REQUEST等获取的变量是用户直接输入的变量;2)来自文件的变量,如在PHP语言中通过bzread, dio_read, fgets, file等获取的变量是间接来自用户输入的变量;3)来自数据库中的变量,如在PHP语言中通过mysql_fetch_array, mysql_fetch_field, pg_fetch_all, pg_fetch_array等获取的变量是间接来自用户输入的变量。在此过程中,也可以将所有变量压入堆栈,通过在回溯的过程中再判断风险点的参数是否来自用户输入,即步骤S210,判断的方法同上所述。完成变量压栈后进入步骤S213。S208、变量回溯对识别到的风险点,利用风险点的参数进行变量回溯。经过风险点识别后,对识别到的风险点的参数在所述的变量栈中进行回溯。在变量回溯过程中进行步骤S210和步骤S211的判断。S210、判断回溯的风险点的参数是否来自于用户输入。从安全的角度来说,用户的输入都是不可信的,当用户输入的内容在程序文件中被执行时,就可能引起安全漏洞。用户输入可能会导致缓冲区溢出、跨站点脚本攻击、结构化查询语言SQL插入代码攻击等等安全问题,因此认为用户输入不可信。因而,在进行安全检测时,必须检查每一个参数是否来自用户输入。如在PHP语言中有一系统执行启动命令'system',如果该命令的参数是来自于用户输入,就意味着这个不可信输入参数可以执行系统命令,可能导致严重的系统漏洞。对于变量栈中的变量均是来自用户输入,如果在所述的变量栈中能找到回溯的风险点的参数,则认为该参数是来自用户可输入点,所述风险点能回溯至可输入点,则进入步骤S211。如果在所述的变量栈中找不到回溯的风险点的参数,则认为所述风险点不能回溯至可输入点,进入步骤S213。如果变量栈中的变量包括所有变量,在变量回溯的过程中需要判断风险点的参数是否来自用户输入。判断变量是否来自用户输入(用户可控变量),是通过用户可输入点的规则定义来判断,所述规则定义中包括来自用户输入的变量。例如,一个变量出现在赋值语句的左边,右边是通过$_GET获取的,则这个变量是来自用户输入的,是用户可控变量。所述来自用户可控输入的变量包括1)直接来自用户直接输入的变量,如在PHP语言中通过$_GET, $_P0ST, $_C00KIE, $_REQUEST等获取的变量是直接来自用户直接输入的变量;2)来自文件的变量,如在PHP语言中通过bzread, dio_read, fgets, file等获取的变量是间接来自用户输入的变量;3)来自数据库中的变量,如在PHP语言中通过mySql_fetCh_array,mysql_fetch_field,pg_fetch_all,pg_fetch_array等获取的变量是间接来自用户输入的变量。S211、判断在回溯的过程中风险点的参数是否经过安全函数处理。在对变量回溯的过程中,如果风险点的参数作为已定义安全函数的参数,那么就判断该风险点的参数是经过安全函数处理的变量,则进入步骤S213。否则是未经过安全函数处理的变量,进入步骤S212。比如,对PHP中的跨站脚本漏洞(XSS漏洞)的安全函数,规则定义如下
$PVF—SECURING—XSS = array(
'htmlentities',
'htmlspecialchars'
);其中,htmlentities和htmlspecialchars都是会对变量进行安全转义的函数,如果经过这两个函数处理了,那么基本就不存在XSS漏洞了。所述安全函数的规则定义也可以在风险函数列表的规则定义中定义,不同的风险函数对应不同的安全函数。S212、判定为潜在风险点,保存回溯路径,将整个回溯过程记录到输出变量中。S213、判断当前扫描的源文件是否遍历完,如果是,则进入步骤S214,如果否,则进入步骤S203,进行下一行的扫描。S214、生成扫描结果。将潜在风险点及其回溯路径作为输出变量生成结果报表,输出测试报告并保存到预设的路径。值得一提的是,由于在将识别出的变量进行存储时,除了采用本实施例所述的压入变量栈的方式外,还可以采用队列的方式进行存储。因而,对应于队列的存储方式,在回溯变量时是在队列中进行回溯,其过程与上述实施例类似,故不在此赘述。所述源文件还可以是包括C、C++、C#和JAVA等开发语言编译的程序文件,本发明不予以限制。对上述程序语言的源文件的识别与PHP语言类似,在进行漏洞规则的定义、Token分析以及变量语句的识别分别按照其各自的规则定义,其余步骤则与PHP的实施例相同。如图3所示,为本发明提供的源文件安全漏洞的检测装置的框图,该装置包括主控制台模块301和扫描分析模块302,其中主控制台模块301,用于启动扫描任务,触发扫描分析模块302逐个对源文件进行扫描。主控制台模块301是用户与扫描分析模块302的交互接口,用于启动扫描任务,将用户配置参数传递给扫描分析模块302,其中用户配置的内容,包括源文件路径、风险函数列表的配置、风险点对应的安全函数配置、以及辅助配置项,如结果报告的保存路径设置等。在设定好用户配置信息后,启动扫描程序,触发扫描分析模块302对源文件逐个进行扫描。扫描分析模块302,用于受到主控制台模块301的触发时,对源文件逐个进行扫描,并对当前扫描到的源文件进行词法分析、语法分析。如图4所示,为扫描分析模块的内部不意图,其中,扫描分析模块302包括词法分析子模块401和语法分析子模块402。所述词法分析子模块401,用于受到所述主控制台模块的触发时,逐个对源文件进行扫描,并对当前扫描到的源文件进行词法分析。所述词法分析是将源文件的字符序列转换成记号(Token)序列的扫描过程,以便进行下一步语法分析。其中Token表示源文件中信息单元的字符序列,与自然语言中的单词类似,是构成源文件的最小单位,包括基本字、标识符、常数、运算符、界符等类型。所述语法分析子模块402,用于在所述词法分析后对所述当前扫描到的源文件进行语法分析,并在语法分析过程中进行变量识别操作和风险点识别操作。其中,所述变量识别操作包括识别变量并对识别出的变量进行存储。 根据语法规则分析Token的类型,可以确定是变量、赋值语句、数值声明、类定义、函数定义等语句,识别出该些语句中的变量,并将所识别出的变量进行变量存储。优选的变量存储方式为以堆栈的方式存储变量,即将变量压入变量栈(以下以变量栈为例)。除此之外,还可以采用诸如队列等方式进行变量存储。所述风险点识别操作包括识别风险点,如果识别出风险点,则利用所述风险点的参数对存储的变量进行回溯,如果所述风险点的参数能回溯至可输入点,且在回溯的过程中未经过安全函数处理,则认为所述风险点是导致安全漏洞的潜在风险点。根据语法规则,如果分析到Token的类型是函数定义,则进行风险点的识别,将所述Token序列与预定义的风险函数列表进行匹配,如果能够匹配,则识别出匹配的Token是风险点。当识别出为风险点,则进行变量回溯,在存储的变量中如果能找到所述风险点的参数,判断存储的变量是否来自用户输入(用户可输入点),如果存储的变量是用户可输入点,则确定所述风险点能回溯至可输入点。进行安全函数判断,判断在变量回溯过程中风险点的参数是否经过安全函数的处理,如果未经过安全函数处理,则认为所述风险点是导致安全漏洞的潜在风险点。需要说明的是,不同风险点可能具有不同的安全函数,因此,可以预先存储各风险点对应的安全函数,判断在变量回溯过程中风险点的函数是否经过对应安全函数的处理。本发明的检测装置还包括报告生成模块303,生成并输出包含潜在风险点信息的结果报告304。该报告生成模块303可以实时生成并输出结果报告304,即每识别出一个潜在风险点就生成并输出一个结果报告304,也可以在当前源文件扫描结束后执行,也可以在所有源文件的扫描结束后执行。下面举一个利用本发明检测装置对源文件进行安全漏洞检测的实例,结合图2、图3和图4所示,对本发明的操作步骤进一步详细说明S201、用户配置在进行源文件安全漏洞检测之前,先通过主控制台模块301进行
用户配置。所述用户配置的内容,包括源文件路径、风险函数列表的配置、风险点对应的安全函数配置、以及辅助配置项,如结果报告的保存路径设置等。S202、开始扫描在设定好用户配置信息后,主控制台模块301启动扫描程序,触发扫描分析模块302对源文件进行逐个遍历扫描。
S203、扫描分析模块302对当前扫描到的文件进行逐行分析。其中,扫描分析模块302包括词法分析子模块401和语法分析子模块402。S204、词法分析词法分析子模块401将当前扫描到的源文件的字符序列转换成Token序列。为了提高Token分析的效率,通常扫描分析模块302还包括预处理子模块403,如图4所示,用于对词法分析子模块401转换得到的Token序列进行预处理后提供给语法分析子模块402,所述预处理包括去除可忽略的Token以及Token的修正处理,如大小写转换等。根据预先配置的一个忽略Token列表,将能够与该列表匹配的Token从词法分析的结果中删除。经过预处理子模块403处理后,语法分析子模块402进行步骤S205-S213的语法分析。S205、Token分析对Token序列根据语法规则进行语法分析,分析每个Token的·类型,确定是变量、赋值语句、数值声明、类定义或函数定义等类型。S206、分类处理根据不同类型的Token,可分为不同的处理方式。在此过程中,主要进行变量识别和风险点识别。如果识别为变量则进行步骤S207,如果识别为风险点则进行步骤S208,如果识别为其他类型的Token,则进行步骤S209,进行跳过处理到步骤S213。根据语法规则分析Token的类型,可以确定是变量、赋值语句、数值声明、类定义、函数定义等语句,识别出该些语句中的变量。如果分析到Token的类型是函数类型,则将Token与预定义的风险函数列表进行匹配,如果能够匹配,则识别为风险点。所述预定义的风险函数列表,是从不同的安全角度,考察漏洞在哪些函数里发生。比如从Web安全来说,所述风险函数列表包括但不限于跨站脚本攻击、结构化查询语言SQL注入攻击、代码执行漏洞、文件包含漏洞、信息泄露漏洞、文件篡改漏洞、命令执行漏洞、可扩展标记语言路径XPath注入的函数。例如,在PHP语言中,对于跨站脚本漏洞(XSS漏洞)主要有以下几个函数‘echo’,‘print’,‘printf’,‘vprintf’,‘header’等,按规则定义在$PVF_XSS中。对于不同语言的源文件,漏洞会有所差别,所述预定义的风险函数列表可根据所用语言的漏洞原理进行调整。S207、变量压栈对识别到的变量,进行变量压栈。根据语法规则分析得到的Token类型,如果识别为变量,则将所识别到的变量压入变量栈。为了节约存储空间,可以仅将来自用户输入的变量压入变量栈。判断变量是否来自用户输入,是通过用户可输入点的规则定义来判断,所述规则定义中包括来自用户输入的变量。例如,一个变量出现在赋值语句的左边,右边是通过$_GET获取的,则这个变量是来自用户输入的。所述来自用户输入的变量包括1)用户直接输入的变量,如在PHP语言中通过$_GET,$_P0ST, $_C00KIE, $_REQUEST等获取的变量是用户直接输入的变量;2)来自文件的变量,如在PHP语言中通过bzread, dio_read, fgets, file等获取的变量是间接来自用户输入的变量;3)来自数据库中的变量,如在PHP语言中通过mysql_fetch_array,mysql_fetch_f ield, p g_f e t ch_a 11, p g_f e t ch_arr ay 等获取的变量是间接来自用户输入的变量。在此过程中,也可以将所有变量压入堆栈,通过在回溯的过程中再判断风险点的参数是否来自用户输入,即步骤S210,判断的方法同上所述。完成变量压栈后进入步骤S213。
S208、变量回溯对识别到的风险点,利用风险点的参数进行变量回溯。经过风险点识别后,对识别到的风险点的参数在所述的变量栈中进行回溯。在变量回溯过程中进行步骤S210和步骤S211的判断。S210、判断回溯的风险点的参数是否来自于用户输入。从安全的角度来说,用户的输入都是不可信的,当用户输入的内容在程序文件中被执行时,就可能引起安全漏洞。用户输入可能会导致缓冲区溢出、跨站点脚本攻击、结构化查询语言SQL插入代码攻击等等安全问题,因此认为用户输入不可信。因而,在进行安全检测时,必须检查每一个参数是否来自用户输入。如在PHP语言中有一系统执行启动命令'system',如果该命令的参数是来自于用户输入,就意味着这个不可信输入参数可以执行系统命令,可能导致严重的系统漏洞。对于变量栈中的变量均是来自用户输入,如果在所述的变量栈中能找到回溯的风险点的参数,则认为该参数是来自用户可输入点,所述风险点能回溯至可输入点,则进入步骤S211。如果在所述的变量栈中找不到回溯的风险点的参数,则认为所述风险点不能回溯至可输入点,进入步骤S213。如果变量栈中的变量包括所有变量,在变量回溯的过程中需要判断风险点的参数是否来自用户输入。判断变量是否来自用户输入(用户可控变量),是通过用户可输入点的规则定义来判断,所述规则定义中包括来自用户输入的变量。例如,一个变量出现在赋值语句的左边,右边是通过$_GET获取的,则这个变量是来自用户输入的,是用户可控变量。所述来自用户输入的可控变量包括1)直接来自用户直接输入的变量,如在PHP语言中通过$_GET, $_P0ST, $_C00KIE, $_REQUEST等获取的变量是直接来自用户直接输入的变量;2)来自文件的变量,如在PHP语言中通过bzread, dio_read, fgets, file等获取的变量是间接来自用户输入的变量;3)来自数据库中的变量,如在PHP语言中通过mySql_fetCh_array,mysql_fetch field,pg_fetch_all,pg_fetch_array等获取的变量是间接来自用户输入的变量。S211、判断在回溯的过程中风险点的参数是否经过安全函数处理。在对变量回溯的过程中,如果风险点的参数作为已定义安全函数的参数,那么就判断该风险点的参数是经过安全函数处理的变量,则进入步骤S213。否则是未经过安全函数处理的变量,进入步骤S212。比如,对PHP中的跨站脚本漏洞(XSS漏洞)的安全函数,规则定义如下
$PVF—SECURING—XSS = array(
'htmlentities',
'htmlspecialchars'
);其中,htmlentities和htmlspecialchars都是会对变量进行安全转义的函数,如果经过这两个函数处理了,那么基本就不存在XSS漏洞了。所述安全函数的规则定义也可以在风险函数列表的规则定义中定义,不同的风险函数对应不同的安全函数。S212、判定为潜在风险点,保存回溯路径,将整个回溯过程记录到输出变量中。S213、判断当前扫描的源文件是否遍历完,如果是,则进入步骤S214,如果否,则进入步骤S203,进行下一行的扫描。S214、生成扫描结果。报告生成模块303,生成并输出包含潜在风险点信息的结果报告304。 值得一提的是,参见图4,由于语法分析子模块402在将识别出的变量进行存储时,除了采用本实施例所述的压入变量栈的方式外,还可以采用队列的方式进行存储。因而,对应于队列的存储方式,在回溯变量时是在队列中进行回溯,其过程与上述实施例类似,故不在此赘述。参见图3,主控制台模块301用于与用户交互,可控制多个扫描分析模块302同时进行检测,将用户配置分别传递给各个扫描分析模块302。扫描分析模块302可采用插件模式进行扩展,所得到的扫描结果均传递至报告生成模块303,得到结果报告304。所述源文件还可以是包括C、C++、C#和JAVA等开发语言编译的程序文件,本发明不予以限制。对上述程序语言的源文件的识别与PHP语言类似,在进行漏洞规则的定义、Token分析以及变量语句的识别分别按照其各自的规则定义,其余步骤则与PHP的实施例相同。本发明提供的源文件安全漏洞检测方法及检测装置是自动化的代码安全检测工具,能够从代码级发现大多数安全漏洞及潜在安全问题,可降低手工测试的成本,将软件的安全问题解决在开发、编码的阶段,有效地发现安全漏洞。同时,在检测的过程中无需建立抽象语法树,可节约测试系统资源,提高扫描效率。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
权利要求
1.一种源文件安全漏洞的检测方法,其特征在于,逐个对源文件进行扫描,对当前扫描到的源文件执行以下步骤 对源文件进行词法分析、语法分析; 在所述语法分析过程中进行变量识别操作和风险点识别操作; 其中,所述变量识别操作包括识别变量并对识别出的变量进行存储; 所述风险点识别操作包括识别风险点,如果识别出风险点,则利用所述风险点的参数对存储的变量进行回溯,如果所述风险点的参数能回溯至可输入点,且在回溯的过程中未经过安全函数处理,则认为所述风险点是导致安全漏洞的潜在风险点。
2.根据权利要求I所述的检测方法,其特征在于,所述词法分析是将源文件的字符序列转换成Token序列。
3.根据权利要求2所述的检测方法,其特征在于,在对源文件进行词法分析后还包括 对所述Token序列进行预处理; 所述预处理包括去除可忽略的Token以及Token的修正处理。
4.根据权利要求2所述的检测方法,其特征在于,所述识别变量具体为分析所述Token序列中的各Token是否为变量。
5.根据权利要求2所述的检测方法,其特征在于,所述识别风险点是将所述Token序列中的各Token与预定义的风险函数列表进行匹配,如果能够匹配到,则识别出匹配的Token为风险点。
6.根据权利要求I所述的检测方法,其特征在于,所述对识别出的变量进行存储包括将识别出的变量压入变量栈,所述对存储的变量进行回溯包括在所述变量栈中进行变量回溯;或者, 所述对识别出的变量进行存储包括将识别出的变量送入队列,所述对存储的变量进行回溯包括在所述队列中进行变量回溯。
7.根据权利要求I或6所述的检测方法,其特征在于,如果在存储的变量中能够回溯到所述风险点的参数,则确定所述风险点的参数能回溯至可输入点。
8.根据权利要求I所述的检测方法,其特征在于,该方法还包括生成并输出包含所述潜在风险点信息的结果报告。
9.一种源文件安全漏洞的检测装置,其特征在于,包括 主控制台模块,用于启动扫描任务,触发扫描分析模块逐个对源文件进行扫描;以及, 所述扫描分析模块包括词法分析子模块和语法分析子模块; 其中,所述词法分析子模块,用于受到所述主控制台模块的触发时,逐个对源文件进行扫描,并对当前扫描到的源文件进行词法分析; 所述语法分析子模块,用于在所述词法分析后对所述当前扫描到的源文件进行语法分析,并在语法分析过程中进行变量识别操作和风险点识别操作; 其中,所述变量识别操作包括识别变量并对识别出的变量进行存储; 所述风险点识别操作包括识别风险点,如果识别出风险点,则利用所述风险点的参数对存储的变量进行回溯,如果所述风险点的参数能回溯至可输入点,且在回溯的过程中未经过安全函数处理,则认为所述风险点是导致安全漏洞的潜在风险点。
10.根据权利要求9所述的检测装置,其特征在于,所述词法分析子模块进行词法分析是将当前扫描到的源文件的字符序列转换成Token序列。
11.根据权利要求10所述的检测装置,其特征在于,所述扫描分析模块还包括预处理子模块,用于对所述词法分析子模块转换得到的所述Token序列进行预处理后提供给所述语法分析子模块; 所述预处理包括去除可忽略的Token以及Token的修正处理。
12.根据权利要求10所述的检测装置,其特征在于,所述语法分析子模块进行识别变量具体为分析所述Token序列中的各Token是否为变量。
13.根据权利要求10所述的检测装置,其特征在于,所述语法分析子模块进行识别风险点是将所述Token序列中的各Token与预定义的风险函数列表进行匹配,如果能够匹配至IJ,则识别出匹配的Token为风险点。
14.根据权利要求9所述的检测装置,其特征在于,所述语法分析子模块在对识别出的变量进行存储时具体将识别出的变量压入变量栈,在对存储的变量进行回溯时具体在所述变量栈中进行变量回溯;或者, 所述语法分析子模块在对识别出的变量进行存储时具体将识别出的变量送入队列,在对存储的变量进行回溯时具体在所述队列中进行变量回溯。
15.根据权利要求9或14所述的检测装置,其特征在于,如果在存储的变量中能够回溯到所述风险点的参数,则所述语法分析子模块确定所述风险点的参数能回溯至可输入点。
16.根据权利要求9所述的检测装置,其特征在于,该检测装置还包括报告生成模块,生成并输出包含所述潜在风险点信息的结果报告。
全文摘要
本发明提供了一种源文件安全漏洞的检测方法及检测装置,逐个对源文件进行扫描,对当前扫描到的源文件执行以下步骤对源文件进行词法分析、语法分析;在所述语法分析过程中进行变量识别操作和风险点识别操作;其中,所述变量识别操作包括识别变量并对识别出的变量进行存储;所述风险点识别操作包括识别风险点,如果识别出风险点,则利用所述风险点的参数对存储的变量进行回溯,如果所述风险点的参数能回溯至可输入点,且在回溯的过程中未经过安全函数处理,则认为所述风险点是导致安全漏洞的潜在风险点。相较于现有技术,本发明所提供的检测方法无需建立抽象语法树,简化了处理流程,节约测试系统资源,提高代码扫描效率。
文档编号G06F21/57GK102955914SQ20111024041
公开日2013年3月6日 申请日期2011年8月19日 优先权日2011年8月19日
发明者计东 申请人:百度在线网络技术(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1