CN102955914A - 一种源文件安全漏洞的检测方法及检测装置 - Google Patents
一种源文件安全漏洞的检测方法及检测装置 Download PDFInfo
- Publication number
- CN102955914A CN102955914A CN2011102404171A CN201110240417A CN102955914A CN 102955914 A CN102955914 A CN 102955914A CN 2011102404171 A CN2011102404171 A CN 2011102404171A CN 201110240417 A CN201110240417 A CN 201110240417A CN 102955914 A CN102955914 A CN 102955914A
- Authority
- CN
- China
- Prior art keywords
- variable
- risk point
- token
- risk
- source file
- 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.)
- Granted
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明提供了一种源文件安全漏洞的检测方法及检测装置,逐个对源文件进行扫描,对当前扫描到的源文件执行以下步骤:对源文件进行词法分析、语法分析;在所述语法分析过程中进行变量识别操作和风险点识别操作;其中,所述变量识别操作包括:识别变量并对识别出的变量进行存储;所述风险点识别操作包括:识别风险点,如果识别出风险点,则利用所述风险点的参数对存储的变量进行回溯,如果所述风险点的参数能回溯至可输入点,且在回溯的过程中未经过安全函数处理,则认为所述风险点是导致安全漏洞的潜在风险点。相较于现有技术,本发明所提供的检测方法无需建立抽象语法树,简化了处理流程,节约测试系统资源,提高代码扫描效率。
Description
【技术领域】
本发明涉及信息安全中的软件安全技术领域,尤其涉及一种源文件安全漏洞的检测方法及检测装置。
【背景技术】
现有的源文件安全漏洞的检测方法通常都是通过扫描分析源代码后建立其对应的抽象语法树(AST),并根据预先定义的可操纵点和风险点,在所建立的抽象语法树中搜索可操纵点到风险点之间的执行路径,找到可能导致安全漏洞的潜在风险。如果所述执行路径上的风险点能够被所述执行路径上的可操纵点控制,则将所述执行路径确定为可能导致安全漏洞的潜在风险执行路径。这种通过建立抽象语法树,而后再遍历抽象语法树进行回溯算法,最终找到一条用户可控路径的检测方式,较为复杂,对于每一个待扫描的源代码文件,都需要构建抽象语法树,因而需要耗费更多的测试系统资源,导致代码测试的效率低下。
【发明内容】
为了解决上述问题,本发明提供了一种源文件安全漏洞的检测方法及检测装置,无需建立抽象语法树,可节约测试系统资源,提高代码扫描效率。
具体技术方案如下:
相应地,本发明实施例提供的一种源文件安全漏洞的检测方法,逐个对源文件进行扫描,对当前扫描到的源文件执行以下步骤:
对源文件进行词法分析、语法分析;
在所述语法分析过程中进行变量识别操作和风险点识别操作;
其中,所述变量识别操作包括:识别变量并对识别出的变量进行存储;
所述风险点识别操作包括:识别风险点,如果识别出风险点,则利用所述风险点的参数对存储的变量进行回溯,如果所述风险点的参数能回溯至可输入点,且在回溯的过程中未经过安全函数处理,则认为所述风险点是导致安全漏洞的潜在风险点。
根据本发明之一优选实施例,所述词法分析是将源文件的字符序列转换成Token序列。
根据本发明之一优选实施例,在对源文件进行词法分析后还包括:
对所述Token序列进行预处理;
所述预处理包括:去除可忽略的Token以及Token的修正处理。
根据本发明之一优选实施例,所述识别变量具体为:分析所述Token序列中的各Token是否为变量。
根据本发明之一优选实施例,所述识别风险点是将所述Token序列中的各Token与预定义的风险函数列表进行匹配,如果能够匹配到,则识别出匹配的Token为风险点。
根据本发明之一优选实施例,所述对识别出的变量进行存储包括:将识别出的变量压入变量栈,所述对存储的变量进行回溯包括:在所述变量栈中进行变量回溯;或者,
所述对识别出的变量进行存储包括:将识别出的变量送入队列,所述对存储的变量进行回溯包括:在所述队列中进行变量回溯。
根据本发明之一优选实施例,如果在存储的变量中能够回溯到所述风险点的参数,则确定所述风险点的参数能回溯至可输入点。
根据本发明之一优选实施例,该方法还包括:生成并输出包含所述潜在风险点信息的结果报告。
相应地,本发明实施例提供的一种源文件安全漏洞的检测装置,包括:
主控制台模块,用于启动扫描任务,触发扫描分析模块逐个对源文件进行扫描;以及,
所述扫描分析模块包括词法分析子模块和语法分析子模块;
其中,所述词法分析子模块,用于受到所述主控制台模块的触发时,逐个对源文件进行扫描,并对当前扫描到的源文件进行词法分析;
所述语法分析子模块,用于在所述词法分析后对所述当前扫描到的源文件进行语法分析,并在语法分析过程中进行变量识别操作和风险点识别操作;
其中,所述变量识别操作包括:识别变量并对识别出的变量进行存储;
所述风险点识别操作包括:识别风险点,如果识别出风险点,则利用所述风险点的参数对存储的变量进行回溯,如果所述风险点的参数能回溯至可输入点,且在回溯的过程中未经过安全函数处理,则认为所述风险点是导致安全漏洞的潜在风险点。
根据本发明之一优选实施例,所述词法分析子模块进行词法分析是将当前扫描到的源文件的字符序列转换成Token序列。
根据本发明之一优选实施例,所述扫描分析模块还包括:预处理子模块,用于对所述词法分析子模块转换得到的所述Token序列进行预处理后提供给所述语法分析子模块;
所述预处理包括:去除可忽略的Token以及Token的修正处理。
根据本发明之一优选实施例,所述语法分析子模块进行识别变量具体为:分析所述Token序列中的各Token是否为变量。
根据本发明之一优选实施例,所述语法分析子模块进行识别风险点是将所述Token序列中的各Token与预定义的风险函数列表进行匹配,如果能够匹配到,则识别出匹配的Token为风险点。
根据本发明之一优选实施例,所述语法分析子模块在对识别出的变量进行存储时具体将识别出的变量压入变量栈,在对存储的变量进行回溯时具体在所述变量栈中进行变量回溯;或者,
所述语法分析子模块在对识别出的变量进行存储时具体将识别出的变量送入队列,在对存储的变量进行回溯时具体在所述队列中进行变量回溯。
根据本发明之一优选实施例,如果在存储的变量中能够回溯到所述风险点的参数,则所述语法分析子模块确定所述风险点的参数能回溯至可输入点。
根据本发明之一优选实施例,该检测装置还包括报告生成模块,生成并输出包含所述潜在风险点信息的结果报告。
由以上技术方案可以看出,本发明提供的一种源文件安全漏洞的检测方法及检测装置,在语法分析过程中完成变量存储、风险点的变量回溯、安全函数判断等处理,直到找到一个未经安全函数处理且来自用户输入的风险点。相较于现有技术,本发明所提供的检测方法将漏洞检测与语法分析相结合,无需建立抽象语法树,简化了处理流程,节约测试系统资源,提高代码扫描效率。
【附图说明】
图1是本发明实施例提供的源文件安全漏洞的检测方法流程图;
图2是本发明实施例提供的源文件安全漏洞的检测方法具体流程图;
图3是本发明实施例提供的源文件安全漏洞的检测装置的框图;
图4是本发明实施例提供的扫描分析模块的内部示意图。
【具体实施方式】
为了使本发明的目的、技术方案和优点更加清楚,下面结合附图和具体实施例对本发明进行详细描述。
如图1所示,为本发明的源文件安全漏洞的检测方法流程图,该方法逐个对源文件进行扫描,对当前扫描到的源文件执行以下步骤:
S101、对源文件进行词法分析。
所述词法分析是将源文件的字符序列转换成记号(Token)序列的扫描过程,以便进行下一步语法分析。其中Token表示源文件中信息单元的字符序列,与自然语言中的单词类似,是构成源文件的最小单位,包括基本字、标识符、常数、运算符、界符等类型。在扫描过程中,最主要的任务是进行格式匹配,通常采用的格式说明和识别方法主要有正则表达式和有穷自动机(DFA)等,在本发明中可以采用现有的词法分析方法,并不限制于采用何种方法,故不于此赘述。
S102、对当前扫描到的源文件进行语法分析。
所述语法分析是在所述词法分析的基础上,按照不同程序语言的语法规则,从Token序列中识别出各类语法成分,如“程序”,“语句”,“表达式”,“函数”等等,同时进行语法检查,用于判断源文件在结构上是否正确。
S103、在所述语法分析过程中进行变量识别操作和风险点识别操作。
所述变量识别操作包括:识别变量并对识别出的变量进行存储。
根据语法规则分析Token的类型,可以确定是变量、赋值语句、数值声明、类定义、函数定义等语句,识别出该些语句中的变量,并将所识别出的变量进行步骤S1031:变量存储。
优选的变量存储方式为:以堆栈的方式存储变量,即将变量压入变量栈(图1中以变量栈为例)。除此之外,还可以采用诸如队列等方式进行变量存储。
所述风险点识别操作包括:识别风险点,如果识别出风险点,则利用所述风险点的参数对存储的变量进行回溯,如果所述风险点的参数能回溯至可输入点,且在回溯的过程中未经过安全函数处理,则认为所述风险点是导致安全漏洞的潜在风险点。
根据语法规则,如果分析到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,$_POST,$_COOKIE,$_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,$_POST,$_COOKIE,$_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漏洞)的安全函数,规则定义如下:
其中,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,$_POST,$_COOKIE,$_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,$_POST,$_COOKIE,$_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漏洞)的安全函数,规则定义如下:
其中,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的实施例相同。
本发明提供的源文件安全漏洞检测方法及检测装置是自动化的代码安全检测工具,能够从代码级发现大多数安全漏洞及潜在安全问题,可降低手工测试的成本,将软件的安全问题解决在开发、编码的阶段,有效地发现安全漏洞。同时,在检测的过程中无需建立抽象语法树,可节约测试系统资源,提高扫描效率。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
Claims (16)
1.一种源文件安全漏洞的检测方法,其特征在于,逐个对源文件进行扫描,对当前扫描到的源文件执行以下步骤:
对源文件进行词法分析、语法分析;
在所述语法分析过程中进行变量识别操作和风险点识别操作;
其中,所述变量识别操作包括:识别变量并对识别出的变量进行存储;
所述风险点识别操作包括:识别风险点,如果识别出风险点,则利用所述风险点的参数对存储的变量进行回溯,如果所述风险点的参数能回溯至可输入点,且在回溯的过程中未经过安全函数处理,则认为所述风险点是导致安全漏洞的潜在风险点。
2.根据权利要求1所述的检测方法,其特征在于,所述词法分析是将源文件的字符序列转换成Token序列。
3.根据权利要求2所述的检测方法,其特征在于,在对源文件进行词法分析后还包括:
对所述Token序列进行预处理;
所述预处理包括:去除可忽略的Token以及Token的修正处理。
4.根据权利要求2所述的检测方法,其特征在于,所述识别变量具体为:分析所述Token序列中的各Token是否为变量。
5.根据权利要求2所述的检测方法,其特征在于,所述识别风险点是将所述Token序列中的各Token与预定义的风险函数列表进行匹配,如果能够匹配到,则识别出匹配的Token为风险点。
6.根据权利要求1所述的检测方法,其特征在于,所述对识别出的变量进行存储包括:将识别出的变量压入变量栈,所述对存储的变量进行回溯包括:在所述变量栈中进行变量回溯;或者,
所述对识别出的变量进行存储包括:将识别出的变量送入队列,所述对存储的变量进行回溯包括:在所述队列中进行变量回溯。
7.根据权利要求1或6所述的检测方法,其特征在于,如果在存储的变量中能够回溯到所述风险点的参数,则确定所述风险点的参数能回溯至可输入点。
8.根据权利要求1所述的检测方法,其特征在于,该方法还包括:生成并输出包含所述潜在风险点信息的结果报告。
9.一种源文件安全漏洞的检测装置,其特征在于,包括:
主控制台模块,用于启动扫描任务,触发扫描分析模块逐个对源文件进行扫描;以及,
所述扫描分析模块包括词法分析子模块和语法分析子模块;
其中,所述词法分析子模块,用于受到所述主控制台模块的触发时,逐个对源文件进行扫描,并对当前扫描到的源文件进行词法分析;
所述语法分析子模块,用于在所述词法分析后对所述当前扫描到的源文件进行语法分析,并在语法分析过程中进行变量识别操作和风险点识别操作;
其中,所述变量识别操作包括:识别变量并对识别出的变量进行存储;
所述风险点识别操作包括:识别风险点,如果识别出风险点,则利用所述风险点的参数对存储的变量进行回溯,如果所述风险点的参数能回溯至可输入点,且在回溯的过程中未经过安全函数处理,则认为所述风险点是导致安全漏洞的潜在风险点。
10.根据权利要求9所述的检测装置,其特征在于,所述词法分析子模块进行词法分析是将当前扫描到的源文件的字符序列转换成Token序列。
11.根据权利要求10所述的检测装置,其特征在于,所述扫描分析模块还包括:预处理子模块,用于对所述词法分析子模块转换得到的所述Token序列进行预处理后提供给所述语法分析子模块;
所述预处理包括:去除可忽略的Token以及Token的修正处理。
12.根据权利要求10所述的检测装置,其特征在于,所述语法分析子模块进行识别变量具体为:分析所述Token序列中的各Token是否为变量。
13.根据权利要求10所述的检测装置,其特征在于,所述语法分析子模块进行识别风险点是将所述Token序列中的各Token与预定义的风险函数列表进行匹配,如果能够匹配到,则识别出匹配的Token为风险点。
14.根据权利要求9所述的检测装置,其特征在于,所述语法分析子模块在对识别出的变量进行存储时具体将识别出的变量压入变量栈,在对存储的变量进行回溯时具体在所述变量栈中进行变量回溯;或者,
所述语法分析子模块在对识别出的变量进行存储时具体将识别出的变量送入队列,在对存储的变量进行回溯时具体在所述队列中进行变量回溯。
15.根据权利要求9或14所述的检测装置,其特征在于,如果在存储的变量中能够回溯到所述风险点的参数,则所述语法分析子模块确定所述风险点的参数能回溯至可输入点。
16.根据权利要求9所述的检测装置,其特征在于,该检测装置还包括报告生成模块,生成并输出包含所述潜在风险点信息的结果报告。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110240417.1A CN102955914B (zh) | 2011-08-19 | 2011-08-19 | 一种源文件安全漏洞的检测方法及检测装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110240417.1A CN102955914B (zh) | 2011-08-19 | 2011-08-19 | 一种源文件安全漏洞的检测方法及检测装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102955914A true CN102955914A (zh) | 2013-03-06 |
CN102955914B CN102955914B (zh) | 2015-11-25 |
Family
ID=47764705
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110240417.1A Active CN102955914B (zh) | 2011-08-19 | 2011-08-19 | 一种源文件安全漏洞的检测方法及检测装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102955914B (zh) |
Cited By (24)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2015007166A1 (en) * | 2013-07-15 | 2015-01-22 | Tencent Technology (Shenzhen) Company Limited | Method and apparatus for detecting security vulnerability for animation source file |
CN104462983A (zh) * | 2013-09-22 | 2015-03-25 | 深圳市腾讯计算机系统有限公司 | 一种php源代码处理方法及系统 |
CN104462981A (zh) * | 2013-09-12 | 2015-03-25 | 深圳市腾讯计算机系统有限公司 | 漏洞检测方法及装置 |
CN104519007A (zh) * | 2013-09-26 | 2015-04-15 | 深圳市腾讯计算机系统有限公司 | 一种漏洞检测的方法及服务器 |
CN104573522A (zh) * | 2013-10-21 | 2015-04-29 | 深圳市腾讯计算机系统有限公司 | 一种漏洞分析方法和装置 |
CN104933368A (zh) * | 2014-03-21 | 2015-09-23 | 腾讯科技(深圳)有限公司 | 一种网络安全漏洞的检测方法及装置 |
CN105279078A (zh) * | 2014-06-24 | 2016-01-27 | 腾讯科技(深圳)有限公司 | 安全漏洞检测方法和装置 |
CN105389195A (zh) * | 2015-10-27 | 2016-03-09 | 北京理工大学 | 一种基于代码替换和正则表达式的静态分析工具改进方法 |
US9426177B2 (en) | 2013-07-15 | 2016-08-23 | Tencent Technology (Shenzhen) Company Limited | Method and apparatus for detecting security vulnerability for animation source file |
CN106295346A (zh) * | 2015-05-20 | 2017-01-04 | 深圳市腾讯计算机系统有限公司 | 一种应用漏洞检测方法、装置及计算设备 |
CN107122666A (zh) * | 2016-12-05 | 2017-09-01 | 招商银行股份有限公司 | 金融应用的风险评估方法及装置 |
CN107341399A (zh) * | 2016-04-29 | 2017-11-10 | 阿里巴巴集团控股有限公司 | 评估代码文件安全性的方法及装置 |
CN107659555A (zh) * | 2016-08-30 | 2018-02-02 | 北京长亭科技有限公司 | 网络攻击的检测方法及装置、终端设备和计算机存储介质 |
WO2018086294A1 (zh) * | 2016-11-14 | 2018-05-17 | 平安科技(深圳)有限公司 | 应用软件安全漏洞检测方法、系统、设备及存储介质 |
CN108062474A (zh) * | 2016-11-08 | 2018-05-22 | 阿里巴巴集团控股有限公司 | 文件的检测方法及装置 |
CN108459954A (zh) * | 2017-02-22 | 2018-08-28 | 腾讯科技(深圳)有限公司 | 应用程序漏洞检测方法和装置 |
CN108563629A (zh) * | 2018-03-13 | 2018-09-21 | 北京仁和诚信科技有限公司 | 一种日志解析规则自动生成方法和装置 |
CN108848115A (zh) * | 2018-09-03 | 2018-11-20 | 杭州安恒信息技术股份有限公司 | 一种网站扫描的方法、装置、设备及计算机可读存储介质 |
WO2018232767A1 (zh) * | 2017-06-24 | 2018-12-27 | 拜椰特(上海)软件技术有限公司 | 一种词法解析工具 |
CN109660499A (zh) * | 2018-09-13 | 2019-04-19 | 阿里巴巴集团控股有限公司 | 攻击拦截方法和装置、计算设备及存储介质 |
CN111428245A (zh) * | 2020-03-30 | 2020-07-17 | 电子科技大学 | 面向自主芯片硬件逻辑漏洞的激活序列生成方法 |
CN111428244A (zh) * | 2020-03-25 | 2020-07-17 | 中国建设银行股份有限公司 | 源码测试方法及装置 |
CN114386045A (zh) * | 2021-12-24 | 2022-04-22 | 深圳开源互联网安全技术有限公司 | 一种Web应用程序漏洞检测方法、装置及存储介质 |
CN114579969A (zh) * | 2022-05-05 | 2022-06-03 | 北京邮电大学 | 漏洞检测方法、装置、电子设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101017458A (zh) * | 2007-03-02 | 2007-08-15 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
US20090178031A1 (en) * | 2008-01-09 | 2009-07-09 | Kan Zhao | Method and System for presenting and analyzing software source code through intermediate representation |
CN101515320A (zh) * | 2009-04-10 | 2009-08-26 | 中国科学院软件研究所 | 一种攻击时漏洞检测方法及其系统 |
CN101661543A (zh) * | 2008-08-28 | 2010-03-03 | 西门子(中国)有限公司 | 软件源代码安全漏洞的检测方法及检测装置 |
-
2011
- 2011-08-19 CN CN201110240417.1A patent/CN102955914B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101017458A (zh) * | 2007-03-02 | 2007-08-15 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
US20090178031A1 (en) * | 2008-01-09 | 2009-07-09 | Kan Zhao | Method and System for presenting and analyzing software source code through intermediate representation |
CN101661543A (zh) * | 2008-08-28 | 2010-03-03 | 西门子(中国)有限公司 | 软件源代码安全漏洞的检测方法及检测装置 |
CN101515320A (zh) * | 2009-04-10 | 2009-08-26 | 中国科学院软件研究所 | 一种攻击时漏洞检测方法及其系统 |
Cited By (35)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2015007166A1 (en) * | 2013-07-15 | 2015-01-22 | Tencent Technology (Shenzhen) Company Limited | Method and apparatus for detecting security vulnerability for animation source file |
US9426177B2 (en) | 2013-07-15 | 2016-08-23 | Tencent Technology (Shenzhen) Company Limited | Method and apparatus for detecting security vulnerability for animation source file |
CN104462981B (zh) * | 2013-09-12 | 2019-01-04 | 深圳市腾讯计算机系统有限公司 | 漏洞检测方法及装置 |
CN104462981A (zh) * | 2013-09-12 | 2015-03-25 | 深圳市腾讯计算机系统有限公司 | 漏洞检测方法及装置 |
CN104462983A (zh) * | 2013-09-22 | 2015-03-25 | 深圳市腾讯计算机系统有限公司 | 一种php源代码处理方法及系统 |
CN104519007A (zh) * | 2013-09-26 | 2015-04-15 | 深圳市腾讯计算机系统有限公司 | 一种漏洞检测的方法及服务器 |
CN104573522A (zh) * | 2013-10-21 | 2015-04-29 | 深圳市腾讯计算机系统有限公司 | 一种漏洞分析方法和装置 |
CN104573522B (zh) * | 2013-10-21 | 2018-12-11 | 深圳市腾讯计算机系统有限公司 | 一种漏洞分析方法和装置 |
CN104933368A (zh) * | 2014-03-21 | 2015-09-23 | 腾讯科技(深圳)有限公司 | 一种网络安全漏洞的检测方法及装置 |
CN104933368B (zh) * | 2014-03-21 | 2018-05-22 | 腾讯科技(深圳)有限公司 | 一种网络安全漏洞的检测方法及装置 |
CN105279078A (zh) * | 2014-06-24 | 2016-01-27 | 腾讯科技(深圳)有限公司 | 安全漏洞检测方法和装置 |
CN106295346A (zh) * | 2015-05-20 | 2017-01-04 | 深圳市腾讯计算机系统有限公司 | 一种应用漏洞检测方法、装置及计算设备 |
CN106295346B (zh) * | 2015-05-20 | 2022-08-30 | 深圳市腾讯计算机系统有限公司 | 一种应用漏洞检测方法、装置及计算设备 |
CN105389195B (zh) * | 2015-10-27 | 2018-08-10 | 北京理工大学 | 一种基于代码替换和正则表达式的静态分析工具改进方法 |
CN105389195A (zh) * | 2015-10-27 | 2016-03-09 | 北京理工大学 | 一种基于代码替换和正则表达式的静态分析工具改进方法 |
CN107341399A (zh) * | 2016-04-29 | 2017-11-10 | 阿里巴巴集团控股有限公司 | 评估代码文件安全性的方法及装置 |
CN107659555A (zh) * | 2016-08-30 | 2018-02-02 | 北京长亭科技有限公司 | 网络攻击的检测方法及装置、终端设备和计算机存储介质 |
CN108062474A (zh) * | 2016-11-08 | 2018-05-22 | 阿里巴巴集团控股有限公司 | 文件的检测方法及装置 |
CN108062474B (zh) * | 2016-11-08 | 2022-01-11 | 阿里巴巴集团控股有限公司 | 文件的检测方法及装置 |
WO2018086294A1 (zh) * | 2016-11-14 | 2018-05-17 | 平安科技(深圳)有限公司 | 应用软件安全漏洞检测方法、系统、设备及存储介质 |
CN107122666A (zh) * | 2016-12-05 | 2017-09-01 | 招商银行股份有限公司 | 金融应用的风险评估方法及装置 |
CN108459954A (zh) * | 2017-02-22 | 2018-08-28 | 腾讯科技(深圳)有限公司 | 应用程序漏洞检测方法和装置 |
CN108459954B (zh) * | 2017-02-22 | 2022-08-26 | 腾讯科技(深圳)有限公司 | 应用程序漏洞检测方法和装置 |
WO2018232767A1 (zh) * | 2017-06-24 | 2018-12-27 | 拜椰特(上海)软件技术有限公司 | 一种词法解析工具 |
CN108563629A (zh) * | 2018-03-13 | 2018-09-21 | 北京仁和诚信科技有限公司 | 一种日志解析规则自动生成方法和装置 |
CN108563629B (zh) * | 2018-03-13 | 2022-04-19 | 北京仁和诚信科技有限公司 | 一种日志解析规则自动生成方法和装置 |
CN108848115A (zh) * | 2018-09-03 | 2018-11-20 | 杭州安恒信息技术股份有限公司 | 一种网站扫描的方法、装置、设备及计算机可读存储介质 |
CN109660499B (zh) * | 2018-09-13 | 2021-07-27 | 创新先进技术有限公司 | 攻击拦截方法和装置、计算设备及存储介质 |
CN109660499A (zh) * | 2018-09-13 | 2019-04-19 | 阿里巴巴集团控股有限公司 | 攻击拦截方法和装置、计算设备及存储介质 |
CN111428244A (zh) * | 2020-03-25 | 2020-07-17 | 中国建设银行股份有限公司 | 源码测试方法及装置 |
CN111428245A (zh) * | 2020-03-30 | 2020-07-17 | 电子科技大学 | 面向自主芯片硬件逻辑漏洞的激活序列生成方法 |
CN111428245B (zh) * | 2020-03-30 | 2023-04-25 | 电子科技大学 | 面向自主芯片硬件逻辑漏洞的激活序列生成方法 |
CN114386045A (zh) * | 2021-12-24 | 2022-04-22 | 深圳开源互联网安全技术有限公司 | 一种Web应用程序漏洞检测方法、装置及存储介质 |
CN114579969B (zh) * | 2022-05-05 | 2022-08-23 | 北京邮电大学 | 漏洞检测方法、装置、电子设备及存储介质 |
CN114579969A (zh) * | 2022-05-05 | 2022-06-03 | 北京邮电大学 | 漏洞检测方法、装置、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN102955914B (zh) | 2015-11-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102955914B (zh) | 一种源文件安全漏洞的检测方法及检测装置 | |
CN106131071B (zh) | 一种Web异常检测方法和装置 | |
CN106961419B (zh) | WebShell检测方法、装置及系统 | |
US9032516B2 (en) | System and method for detecting malicious script | |
US8220048B2 (en) | Network intrusion detector with combined protocol analyses, normalization and matching | |
CN103455759B (zh) | 一种页面漏洞检测装置及检测方法 | |
CN100483434C (zh) | 病毒识别方法及装置 | |
CN109992969B (zh) | 一种恶意文件检测方法、装置及检测平台 | |
CN111835777B (zh) | 一种异常流量检测方法、装置、设备及介质 | |
CN113194058B (zh) | Web攻击检测方法、设备、网站应用层防火墙及介质 | |
CN106845227A (zh) | 一种基于ragel状态机的恶意脚本检测方法及系统 | |
CN109525567A (zh) | 一种针对网站实施参数注入攻击的检测方法与系统 | |
CN110472165B (zh) | Url提取方法、装置、设备及计算机可读存储介质 | |
CN107862039B (zh) | 网页数据获取方法、系统和数据匹配推送方法 | |
CN111488590A (zh) | 一种基于用户行为可信分析的sql注入检测方法 | |
CN111368303A (zh) | 一种PowerShell恶意脚本的检测方法及装置 | |
CN111753303A (zh) | 一种基于深度学习和强化学习的多粒度代码漏洞检测方法 | |
CN116366377A (zh) | 恶意文件检测方法、装置、设备及存储介质 | |
US9600644B2 (en) | Method, a computer program and apparatus for analyzing symbols in a computer | |
CN101895517A (zh) | 一种脚本语义提取方法和提取装置 | |
CN112817877B (zh) | 异常脚本检测方法、装置、计算机设备和存储介质 | |
CN113901468A (zh) | 一种脚本处理方法、装置、设备和存储介质 | |
CN107682302A (zh) | 跨站脚本攻击检测方法和装置 | |
CN114117419A (zh) | 一种模板注入攻击的检测方法、装置、设备、存储介质 | |
CN101515318B (zh) | 一种识别vbs网页木马的方法和装置 |
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 |