CN104850493A - 一种检测源代码漏洞的方法和装置 - Google Patents

一种检测源代码漏洞的方法和装置 Download PDF

Info

Publication number
CN104850493A
CN104850493A CN201510202537.0A CN201510202537A CN104850493A CN 104850493 A CN104850493 A CN 104850493A CN 201510202537 A CN201510202537 A CN 201510202537A CN 104850493 A CN104850493 A CN 104850493A
Authority
CN
China
Prior art keywords
function
node
pick
information
dependence
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.)
Pending
Application number
CN201510202537.0A
Other languages
English (en)
Inventor
过辰楷
李鸣雷
许静
周向荣
王丹
曾莹
白梦莹
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nankai University
Baidu Online Network Technology Beijing Co Ltd
Beijing Baidu Netcom Science and Technology Co Ltd
Original Assignee
Nankai University
Beijing Baidu Netcom Science and Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Nankai University, Beijing Baidu Netcom Science and Technology Co Ltd filed Critical Nankai University
Priority to CN201510202537.0A priority Critical patent/CN104850493A/zh
Publication of CN104850493A publication Critical patent/CN104850493A/zh
Pending legal-status Critical Current

Links

Landscapes

  • Data Exchanges In Wide-Area Networks (AREA)

Abstract

本发明的目的是提供一种检测源代码漏洞的方法和装置。根据本发明的方法包括:基于与所述源代码对应的抽象语法树,确定所述抽象语法树中的一个或多个敏感节点;基于所述抽象语法树,查找与所述初始节点对应的参数信息具有依赖关系的依赖节点,以将所述依赖节点作为所述初始节点的子节点;当所述依赖节点不对应用户输入信息时,将该依赖节点作为新的初始节点,并重复前述步骤。根据本发明的方案的优点在于:通过基于赋值操作等方式的分析,来建立基于数据的依赖关系的敏感路径信息,从而能够降低对于漏洞的误报率,并且能够提升所获得的敏感路径的完整度,提高漏洞检测的全面性。

Description

一种检测源代码漏洞的方法和装置
技术领域
本发明涉及计算机技术领域,尤其涉及一种检测源代码漏洞的方法和装置。
背景技术
互联网的发展给人们带来了方便而丰富的体验,然而随之而来的安全问题也越来越显著。Web网站的漏洞检测是预防安全问题的重要手段,其主要分为动态和静态分析两种方法,动态检测虽然具有准确率高、误报低的优点,然而由于其构造模拟攻击的局限,必然有着高漏报的风险。
静态分析是通过剖析代码而发现网页中所隐藏的安全漏洞,虽然不能保证所检测的漏洞的误报率,但是会大大降低漏报。虽然当前静态分析已作为一项有力的工具在网站的漏洞检测方面发挥作用,但是现有技术的静态分析方法仍然存在误报率高、无法处理过程间调用等问题。
现有技术中所采用的静态分析主要包括两种方式:一种是运用单纯的正则匹配的方法,匹配程序中的用户可控输入点或者危险函数点,从而得出漏洞所在位置;该方式由于无法追踪用户所传变量的路径,误报极高。另一种是先用编译的手段将代码进行词法、语法分析,继而匹配危险函数,再回溯程序中的敏感变量,一直到遇见用户可控输入点。而这种方式由于没有进行相关的数据依赖处理,导致该方法的回溯过程仅仅是对变量的简单识别,而没有对其是否是赋值、条件、循环或者函数调用进行具体的分析,导致较高的误报率。
发明内容
本发明的目的是提供一种检测源代码漏洞的方法和装置。
根据本发明的一个方面,提供了一种检测源代码漏洞的方法,其中, 所述方法包括以下步骤:
x基于与所述源代码对应的抽象语法树,确定所述抽象语法树中的一个或多个敏感节点,其中,所述敏感节点对应于所述源代码中的敏感函数的参数信息;
其中,将敏感节点作为初始节点,所述方法还包括以下步骤:
a基于所述抽象语法树,查找与所述初始节点对应的参数信息具有依赖关系的依赖节点,以将所述依赖节点作为所述初始节点的子节点;
b当所述依赖节点不对应用户输入信息时,将该依赖节点作为新的初始节点,并重复前述步骤a和b。
根据本发明的一个方面,提供了一种检测源代码漏洞的检测装置,其中,所述检测装置包括:
第一确定装置,用于基于与所述源代码对应的抽象语法树,确定所述抽象语法树中的一个或多个敏感节点,其中,所述敏感节点对应于所述源代码中的敏感函数的参数信息;
其中,将敏感节点作为初始节点,所述检测装置还包括:
查找装置,用于基于所述抽象语法树,查找与所述初始节点对应的参数信息具有依赖关系的依赖节点,并将所述依赖节点作为所述初始节点的子节点;
第一控制装置,用于当所述依赖节点不对应用户输入信息时,将所述子节点作为新的初始节点,并重复查找装置和第一控制装置的操作。
与现有技术相比,本发明具有以下优点:1)根据本发明的方法,通过基于赋值操作等方式的分析,来建立基于数据的依赖关系的敏感路径信息,从而能够降低对于漏洞的误报率,并且能够提升所获得的敏感路径的完整度,提高漏洞检测的全面性;2)通过对于分支、循环等语句的处理,能够尽可能全面地获得参数在各个语句中的依赖关系,进而记录更加完整的敏感路径信息;3)基于该种方案,通过追踪函数间、类之间的敏感变量传递调用,进一步提升了所获取的危险函数信息的完整性,从而降低了漏报率,使得漏洞检测更加全面准确。
附图说明
通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:
图1示意出了根据本发明的一种检测源代码漏洞的方法流程图;
图2示意出了根据本发明的一种用于检测源代码漏洞的检测装置的结构示意图;
附图中相同或相似的附图标记代表相同或相似的部件。
具体实施方式
下面结合附图对本发明作进一步详细描述。
图1示意出了根据本发明的一种用于检测源代码漏洞的方法流程图。根据本发明的方法包括步骤S1、步骤S2和步骤S3。
其中,根据本发明的方法通过包含于计算机设备中的检测装置来实现。优选地,所述源代码为网站源代码。
所述计算机设备包括一种能够按照事先设定或存储的指令,自动进行数值计算和/或信息处理的电子设备,其硬件包括但不限于微处理器、专用集成电路(ASIC)、可编程门阵列(FPGA)、数字处理器(DSP)、嵌入式设备等。
其中,所述计算机设备包括网络设备和用户设备。
所述网络设备包括但不限于单个网络服务器、多个网络服务器组成的服务器组或基于云计算(Cloud Computing)的由大量主机或网络服务器构成的云,其中,云计算是分布式计算的一种,由一群松散耦合的计算机集组成的一个超级虚拟计算机。
所述用户设备包括但不限于任何一种可与用户通过键盘、鼠标、遥控器、触摸板、或声控设备等方式进行人机交互的电子产品。例如,手提电脑、平板电脑、智能手机、PDA、掌上游戏机以及智能导航设备等。
其中,所述计算机设备可处于网络中,该计算机设备所处的网络包括但不限于互联网、广域网、城域网、局域网、VPN网络等。
需要说明的是,所述计算机设备以及网络仅为举例,其他现有的或今后可能出现的计算机设备以及网络如可适用于本发明,也应包含在本发明保护范围以内,并以引用方式包含于此。
在步骤S1中,检测装置基于与所述源代码对应的抽象语法树,确定所述抽象语法树中的一个或多个敏感节点。
其中,所述敏感节点对应于所述源代码中的敏感函数的参数信息。其中,所述敏感函数为包含于预定的危险函数列表中的函数;或者,与所述危险函数列表中的函数相似或相近的函数。
具体地,检测装置基于预定的危险函数列表,以及所述抽象语法树中的各个节点,来确定该抽象语法树中的各个节点是否为与所述危险函数列表中的危险函数对应的敏感函数的节点信息。
更优选地,检测装置基于该预定的危险函数列表的函数信息,与抽象语法树中的各个节点进行正则运算,以确定所述抽象语法树中各个节点是否为敏感函数的敏感节点,将所确定的敏感节点作为初始节点。
其中,本领域技术人员应能了解基于源代码建立抽象语法树的过程,此处不再赘述。
在步骤S2中,检测装置基于所述抽象语法树,查找与所述初始节点对应的参数信息具有依赖关系的依赖节点,以将所述依赖节点作为所述初始节点的子节点。
其中,当一个参数的需要依赖于另一个参数来确定时,说明该两个参数之间具有依赖关系。
例如,当参数A需要通过将参数B的计算结果后对A进行赋值得到,则可认为参数A与B之间具有依赖关系。
优选地,检测装置基于所述抽象语法树,查找用于对所述初始节点对应的参数信息进行赋值的赋值信息,以将所述赋值信息对应的节点作为依赖节点,并将该依赖节点作为所述初始节点的子节点。
接着,在步骤S3中,当所述依赖节点不对应用户输入信息时,检测装置将该依赖节点作为新的初始节点,并重复步骤S2和步骤S3的操作。
根据本发明的第一示例,检测装置在步骤S1中,通过正则匹配,确 定参数var_1为敏感函数的参数,进而确定参数var_1对应的节点node_var_1为敏感节点,则检测装置将该节点node_var_1作为初始节点,接着,在步骤S2中,检测装置沿着所述抽象语法树,将获得的用于对该参数var_1进行赋值的赋值信息参数var_2对应的节点node_var_2作为依赖节点,并将该依赖节点node_var_2作为初始节点node_var_1的子节点。
并且,检测装置判断该依赖节点node_var_2对应的参数信息var_2并非用户输入信息,则在步骤S3中,检测装置将该依赖节点node_var_2作为新的初始节点,并重新执行步骤S2,沿着抽象语法树,查找到用于对参数信息var_2进行赋值的参数var_3,并将var_3对应的节点node_var_3作为当前的初始节点node_var_2的子节点。接着,检测装置根据参数var_3是通过语句$_GET来获得的,从而判断var_3为用户输入信息,进而停止继续查找该依赖节点的子节点。
优选地,根据本发明的方法还包括步骤S4(图未示)。
在步骤S4中,当所述依赖节点对应于用户输入信息时,检测装置记录该依赖节点到其对应的敏感节点的敏感路径信息。
继续对前述第一示例进行说明,当依赖节点node_var_3对应于用户输入信息时,检测装置记录node_var_3至敏感节点node_var_1对应的敏感路径信息:node_var_1→node_var_2→node_var_3。
优选地,检测装置基于所记录的敏感路径信息,来提示所述源代码的漏洞信息。
继续对前述第一示例进行说明,检测装置根据记录的敏感路径信息:node_var_1→node_var_2→node_var_3,提示程序员:发现漏洞信息node_var_3,其对应的路径信息包括以敏感节点作为根节点的路径信息node_var_1→node_var_2→node_var_3。
更优选地,检测装置还可提示与该敏感路径信息对应的其他信息,例如,各个节点分别所属的函数名称等。
根据本发明的方法,通过基于赋值操作等方式的分析,来建立基于数据的依赖关系的敏感路径信息,从而能够降低对于漏洞的误报率,并 且能够提升所获得的敏感路径的完整度,提高漏洞检测的全面性。
根据本发明的一个优选方案,对于所述抽象语法树中与源代码的分支语句,检测装置分别基于该分支语句的每一分支执行步骤a至b。
其中,所述分支语句包括至少包括两个并行分支的语句,例如,if else条件语句,又例如,switch语句等。
根据本发明的第二示例,检测装置已经通过重复执行步骤S2和步骤S3,查找并记录到从敏感节点node_var_4到当前的初始节点node_var_5的这一路径信息node_var_4→node_var_5,接着,检测装置再次执行步骤S2,沿着抽象语法树查找到用于对参数var_4进行赋值的参数var_6,并将该参数var_6对应的节点node_var_6作为当前的初始节点node_var_5的子节点,并记录从node_var_6到敏感节点node_var_4的这一路径信息node_var_4→node_var_5→node_var_6。并且,检测装置确定var6为以下分支语句中的一个if语句的分支:
if(term a){var_5=var_6;}
else{var_5=var_7;}
则检测装置获取抽象语法树中,与if语句分支对应的else语句中的参数var_7对应的节点node_var_7,作为与当前初始节点node_var_5的另一子节点,并记录从node_var_7到敏感节点node_var_4的这一路径信息node_var_4→node_var_5→node_var_7。
接着,检测装置对于if语句分支,以节点node_var_6作为新的初始节点重复执行步骤S2和步骤S3,对于else语句分支,以节点node_var_7,作为新的初始节点,重复执行步骤S2和步骤S3。
根据本发明的又一个优选方案,对于所述抽象语法树中的循环语句,检测装置基于当前的初始节点,在当前循环条件下执行步骤S2至步骤S3。
根据本发明的第三示例,当前的初始节点为与参数var_8对应的节点node_var_8,接着,检测装置在步骤S2中,从抽象语法树中查找到与下述while循环的赋值语句中参数var_9对应的节点node_var_9,并将该节点node_var_9作为初始节点node_var_8的子节点,接着,检测装置 继续查找抽象语法树中其他语句对应的节点中与参数var_9具有依赖关系的参数,而无需通过控制while语句的循环变量a的改变进而重复获取该while语句中的参数var_9。
通过上述优选方案,通过对于分支、循环等语句的处理,检测装置能够尽可能全面地获得参数在各个语句中的依赖关系,进而记录更加完整的敏感路径信息。从而能够对网站的源代码进行更加全面的漏洞检测,并能降低误报率。
根据本发明的一个优选实施,根据本实施例的方法还包括步骤S5(图未示)、步骤S6(图未示)以及步骤S7(图未示)。
在步骤S5中,检测装置对于一敏感路径信息,获取与该路径信息对应的敏感函数。
具体地,检测装置基于所记录的敏感路径信息,获取与该敏感路径信息的根节点对应的敏感函数。
继续对前述第一示例进行说明,检测装置基于所记录的敏感路径信息node_var_1→node_var_2→node_var_3,获取与根节点node_var_1对应的参数var_1,并进而确定与该参数var_1对应的敏感函数func_1。
接着,在步骤S6中,检测装置基于预定安全规则来对所述敏感函数进行验证。
具体地,检测装置判断当前的安全规则所采用的验证语句是否足以验证所述敏感函数。
优选地,检测装置在建立抽象语法树时,保存与各个函数对应的安全验证代码,并当函数被确定为敏感函数时,将所保存的安全验证代码与当前的安全规则进行匹配,当所述安全验证代码能够与所述安全规则进行匹配时,确定所属敏感函数符合所述安全规则。
更优选地,检测装置基于敏感函数的代码信息进行分类,以确定其可能对应的漏洞类别,并基于当前的安全规则与漏洞类型的对应关系,来确定其对应的安全验证代码所需要匹配的安全规则,并当所述安全验证代码能够与所述安全规则进行匹配时,确定所述敏感函数符合所述安全规则。
例如,当基于敏感函数本身的代码,确定该敏感函数为命令注入类型的脚本,则检测装置从当前的安全规则中获得与命令注入类型脚本对应的安全规则包括如下两个函数:
escapeshellarg();以及,
safe_mode_exec_dir();
并且,检测装置基于所获得的与敏感函数对应的安全验证代码,与该两个函数进行匹配,当两者均匹配时,确定改敏感函数已经经过验证并符合安全规则。
我们理解,此处的漏洞类型与检测所采用的安全规则是本领域技术人员可根据情况来确定/获得的,因此不再赘述。
在步骤S7中,当所述敏感函数符合所述安全规则时,检测装置确定所述敏感路径信息非漏洞。
其中,当检测装置确定该敏感路径信息不为漏洞时,不再提示该漏洞。
根据本发明的方案,可以先对源代码的抽象语法树执行步骤S1至步骤S3,并重复多次执行步骤S2至步骤S3,以获得多个敏感路径信息后,再通过执行步骤S5至步骤S7,以分别确定每个敏感路径信息是否为漏洞,并仅提示为漏洞的敏感路径信息;或者,可以每次获得一个敏感路径信息后,即执行步骤S5至步骤S7,以确定所获得的敏感路径信息是否为漏洞,并仅提示为漏洞的敏感路径信息。
根据本发明的又一优选实施,将敏感函数作为初始函数,根据本实施例的方法还包括步骤S8(图未示)、步骤S9(图未示)以及步骤S10(图未示)。
在步骤S8中,检测装置基于源代码中的函数调用关系,确定调用所 述初始函数的一个或多个待选函数。
接着,检测装置对所述一个或多个待选函数,分别判断所述一个或多个待选函数中的各个待选函数的参数信息与所述初始函数的参数信息是否存在依赖关系。
具体地,检测装置可基于与所述源代码对应的抽象语法树,来确定各个参数信息之间是否具有依赖关系。
接着,在步骤S10中,当待选函数的参数信息与初始函数的参数信息存在依赖关系时,确定该待选函数为所述初始函数的依赖函数,则检测装置保存所述待选函数,并将该待选函数作为初始函数,重复执行步骤S8至步骤S10。
其中,当待选函数中的任一参数信息与所述初始函数中的任一参数信息之间具有依赖关系时,即认为该待选函数为所述初始函数的依赖函数。
例如,初始函数为func_2(var_11,var_12),而调用初始函数func_2的待选函数func_3的参数var_13基于var_11和var_12的计算结果来获得,则检测装置确定该待选函数func_3为初始函数func_2的依赖函数。则检测装置保存该待选函数func_3,并重复执行步骤S8至步骤S10来进一步获取该待选函数func_3的依赖函数。
优选地,检测装置可采用一个专门的数据结构来保存所述待选函数。例如,检测装置可维护一个temp数据结构,该结构用以存放依赖函数的所有内容,包括依赖函数的类名、对象名、函数名、参数、返回值等。更优选地,当依赖函数与初始函数为类之间的函数调用时,类名和对象名可以为空。
根据本实施例的优选方案,所述方法还包括步骤S11(图未示)。
在步骤S11中,检测装置基于所保存的待选函数更新危险函数列表。
具体地,检测装置基于预定的危险函数列表,与抽象语法树中的各个节点进行正则匹配并确定源代码中的初始敏感函数后,执行步骤S8至步骤S10,来确定并记录各个初始敏感函数的依赖函数,接着,基于所确定的依赖函数来更新所述危险函数列表,并采用更新后的危险函数 列表,再次执行步骤S1至步骤S3,来获取敏感路径信息。
基于该种方式,通过追踪函数间、类之间的敏感变量传递调用,进一步提升了所获取的危险函数信息的完整性,从而降低了漏报率,使得漏洞检测更加全面准确。
图2示意出了根据本发明的一种用于检测源代码漏洞的检测装置的结构示意图。根据本发明的检测装置包括第一确定装置1、查询装置2和第一控制装置3。
第一确定装置1基于与所述源代码对应的抽象语法树,确定所述抽象语法树中的一个或多个敏感节点。
其中,所述敏感节点对应于所述源代码中的敏感函数的参数信息。其中,所述敏感函数为包含于预定的危险函数列表中的函数;或者,与所述危险函数列表中的函数相似或相近的函数。
具体地,第一确定装置1基于预定的危险函数列表,以及所述抽象语法树中的各个节点,来确定该抽象语法树中的各个节点是否为与所述危险函数列表中的危险函数对应的敏感函数的节点信息。
更优选地,第一确定装置1基于该预定的危险函数列表的函数信息,与抽象语法树中的各个节点进行正则运算,以确定所述抽象语法树中各个节点是否为敏感函数的敏感节点,将所确定的敏感节点作为初始节点。
查询装置2基于所述抽象语法树,查找与所述初始节点对应的参数信息具有依赖关系的依赖节点,以将所述依赖节点作为所述初始节点的子节点。
其中,当一个参数的需要依赖于另一个参数来确定时,说明该两个参数之间具有依赖关系。
例如,当参数A需要通过将参数B的计算结果后对A进行赋值得到,则可认为参数A与B之间具有依赖关系。
优选地,查询装置2基于所述抽象语法树,查找用于对所述初始节点对应的参数信息进行赋值的赋值信息,以将所述赋值信息对应的节点作为依赖节点,并将该依赖节点作为所述初始节点的子节点。
接着,当所述依赖节点不对应用户输入信息时,第一控制装置3将该依赖节点作为新的初始节点,并重复查询装置2和第一控制装置3的操作。
根据本发明的第一示例,第一确定装置1通过正则匹配,确定参数var_1为敏感函数的参数,进而确定参数var_1对应的节点node_var_1为敏感节点,则第一确定装置1将该节点node_var_1作为初始节点,接着,查询装置2沿着所述抽象语法树,将获得的用于对该参数var_1进行的赋值的赋值信息参数var_2对应的节点node_var_2作为依赖节点,并将该依赖节点node_var_2作为初始节点node_var_1的子节点。
并且,第一控制装置3判断该依赖节点node_var_2对应的参数信息var_2并非用户输入信息,则第一控制装置3将该依赖节点node_var_2作为新的初始节点,并重新执行查询装置2的操作,沿着抽象语法树来查找到用于对参数信息var_2进行赋值的参数var_3,并将var_3对应的节点node_var_3作为当前的初始节点node_var_2的子节点。接着,第一控制装置3根据参数var_3为PHP中用于获取用户输入信息的$_GET语句,从而判断var_3为用户输入信息,进而停止继续查找该依赖节点的子节点。
优选地,根据本发明的检测装置还包括记录装置(图未示)。
当所述依赖节点对应于用户输入信息时,记录装置记录该依赖节点到其对应的敏感节点的敏感路径信息。
继续对前述第一示例进行说明,当依赖节点node_var_3对应于用户输入信息时,记录装置记录node_var_3至敏感节点node_var_1对应的敏感路径信息:node_var_1→node_var_2→node_var_3。
优选地,检测装置基于记录装置所记录的敏感路径信息,来提示所述源代码的漏洞信息。
继续对前述第一示例进行说明,检测装置根据记录装置所记录的敏感路径信息:node_var_1→node_var_2→node_var_3,提示程序员:发现漏洞信息node_var_3,其对应的路径信息包括以敏感节点作为根节点的路径信息node_var_1→node_var_2→node_var_3。
更优选地,检测装置还可提示与该敏感路径信息对应的其他信息,例如,各个节点分别所属的函数名称或者类名称等等。
根据本发明的方案,通过基于赋值操作等方式的分析,来建立基于数据的依赖关系的敏感路径信息,从而能够降低对于漏洞的误报率,并且能够提升所获得的敏感路径的完整度,提高漏洞检测的全面性。
根据本发明的一个优选方案,对于所述抽象语法树中与源代码的分支语句,检测装置分别基于该分支语句的每一分支由查找装置和第一控制装置的执行操作。
其中,所述分支语句包括至少包括两个并行分支的语句,例如,if else条件语句,又例如,switch语句等。
根据本发明的第二示例,检测装置已经通过重复执行查找装置2和第一控制装置3,查找并记录到从敏感节点node_var_4到当前的初始节点node_var_5的这一路径信息node_var_4→node_var_5,接着,查找装置2再次执行操作,沿着抽象语法树查找到用于对参数var_4进行赋值的参数var_6,并将该参数var_6对应的节点node_var_6作为当前的初始节点node_var_5的子节点,并由记录装置记录从node_var_6到敏感节点node_var_4的这一路径信息node_var_4→node_var_5→node_var_6。并且,检测装置确定var6为以下分支语句中的一个if语句的分支:
if(term a){var_5=var_6;}
else{var_5=var_7;}
则查找装置2获取抽象语法树中,与if语句分支对应的else语句中的参数var_7对应的节点node_var_7,作为与当前初始节点node_var_5的另一子节点,并由记录装置记录从node_var_7到敏感节点node_var_4的这一路径信息node_var_4→node_var_5→node_var_7。
接着,检测装置对于if语句分支,以节点node_var_6作为新的初始节点重复执行查找装置和第一控制装置的操作,对于else语句分支,以节点node_var_7,作为新的初始节点,重复执行查找装置和第一控制装置的操作。
根据本发明的又一个优选方案,对于所述抽象语法树中的循环语句, 检测装置基于当前的初始节点,在当前循环条件下执行查找装置和第一控制装置的操作。
根据本发明的第三示例,当前的初始节点为与参数var_8对应的节点node_var_8,接着,查找装置2和第一控制装置3从抽象语法树中查找到与下述while循环的赋值语句中参数var_9对应的节点node_var_9,并将该节点node_var_9作为初始节点node_var_8的子节点,接着,查找装置2继续查找抽象语法树中其他语句对应的节点中与参数var_9具有依赖关系的参数,而无需通过控制while语句的循环变量“a”的改变进而重复获取该while语句中的参数var_9。
通过上述优选方案,检测装置能够尽可能全面地获得参数在各个语句中的依赖关系,进而记录更加完整的敏感路径信息。从而能够对网站的源代码进行更加全面的漏洞检测,并能降低误报率。
根据本发明的一个优选实施,根据本实施例的检测装置还包括获取装置(图未示)、验证装置(图未示)以及第二确定装置(图未示)。
获取装置对于一敏感路径信息,获取与该路径信息对应的敏感函数。
具体地,获取装置基于所记录的敏感路径信息,获取与该敏感路径信息的根节点对应的敏感函数。
继续对前述第一示例进行说明,获取装置基于所记录的敏感路径信息node_var_1→node_var_2→node_var_3,获取与根节点node_var_1对应的参数var_1,并进而确定与该参数var_1对应的敏感函数func_1。
接着,验证装置基于预定安全规则来对所述敏感函数进行验证。
具体地,验证装置判断当前的安全规则所采用的验证语句是否足以验证所述敏感函数。
优选地,验证装置在建立抽象语法树时,保存与各个函数对应的安 全验证代码,并当函数被确定为敏感函数时,将所保存的安全验证代码与当前的安全规则进行匹配,当所述安全验证代码能够与所述安全规则进行匹配时,确定所属敏感函数符合所述安全规则。
更优选地,验证装置基于敏感函数的代码信息进行分类,以确定其可能对应的漏洞类别,并基于当前的安全规则与漏洞类型的对应关系,来确定其对应的安全验证代码所需要匹配的安全规则,并当所述安全验证代码能够与所述安全规则进行匹配时,确定所述敏感函数符合所述安全规则。
例如,当基于敏感函数本身的代码,确定该敏感函数为命令注入类型的脚本,则检测装置从当前的安全规则中获得与命令注入类型脚本对应的安全规则包括如下两个函数:
escapeshellarg();以及,
safe_mode_exec_dir();
并且,验证装置基于所获得的与敏感函数对应的安全验证代码,与该两个函数进行匹配,当两者均匹配时,确定该敏感函数已经经过验证并符合安全规则。
我们理解,此处的漏洞类型与检测所采用的安全规则是本领域技术人员可根据情况来确定/获得的,因此不再赘述。当所述敏感函数符合所述安全规则时,第二确定装置确定所述敏感路径信息非漏洞。
其中,当第二确定装置确定该敏感路径信息不为漏洞时,检测装置不再提示该漏洞。
根据本发明的方案,可以先由第一确定装置1对源代码的抽象语法树执行操作,并重复多次执行查找装置2和第一控制装置3的操作,以获得多个敏感路径信息后,再通过执行获取装置、验证装置以及第二确定装置的操作,以分别确定每个敏感路径信息是否为漏洞,并仅提示为漏洞的敏感路径信息;或者,可以每次获得一个敏感路径信息后,即执行获取装置、验证装置以及第二确定装置的操作,以确定所获得的敏感路径信息是否为漏洞,并仅提示为漏洞的敏感路径信息。
根据本发明的又一优选实施,将敏感函数作为初始函数,根据本实 施例的验证装置还包括第三确定装置(图未示)、判断装置(图未示)以及第二控制装置(图未示)。
第三确定装置基于源代码中的函数调用关系,确定调用所述初始函数的一个或多个待选函数。
接着,判断装置对所述一个或多个待选函数,分别判断所述一个或多个待选函数中的各个待选函数的参数信息与所述初始函数的参数信息是否存在依赖关系。
具体地,判断装置可基于与所述源代码对应的抽象语法树,来确定各个参数信息之间是否具有依赖关系。
其中,当待选函数中的任一参数信息与所述初始函数中的任一参数信息之间具有依赖关系时,判断装置即认为该待选函数为所述初始函数的依赖函数。
接着,当待选函数的参数信息与初始函数的参数信息存在依赖关系时,第二控制装置确定该待选函数为所述初始函数的依赖函数,则第二控制装置保存所述待选函数,并将该待选函数作为初始函数,重复执行第三确定装置、判断装置以及第二控制装置的操作。
例如,初始函数为func_2(var_11,var_12),而调用初始函数func_2的待选函数func_3的参数var_13基于var_11和var_12的计算结果来获得,则判断装置确定该待选函数func_3为初始函数func_2的依赖函数。则第二控制装置保存该待选函数func_3,并重复执行步骤S8至步骤S10来进一步获取该待选函数func_3的依赖函数。
优选地,第二控制装置可采用一个专门的数据结构来保存所述待选函数。例如,第二控制装置可维护一个temp数据结构,该结构用以存放依赖函数的所有内容,包括依赖函数的类名、对象名、函数名、参数、返回值等。更优选地,当依赖函数与初始函数为类之间的函数调用时,类名和对象名可以为空。
根据本实施例的优选方案,所述检测装置还包括更新装置(图未示)。
更新装置基于所保存的待选函数更新危险函数列表。
具体地,更新装置基于预定的危险函数列表,与抽象语法树中的各 个节点进行正则匹配并确定源代码中的初始敏感函数后,执行第三确定装置、判断装置以及第二控制装置的操作,来确定并记录各个初始敏感函数的依赖函数,接着,更新装置基于所确定的依赖函数来更新所述危险函数列表,并且,采用更新后的危险函数列表,再次执行第一确定装置1、查找装置2以及第一控制装置3的操作,来获取敏感路径信息。
基于该种方案,通过追踪函数间、类之间的敏感变量传递调用,进一步提升了所获取的危险函数信息的完整性,从而降低了漏报率,使得漏洞检测更加全面准确。
其中,根据本发明的方法通过包含于计算机设备中的装置来实现。所述计算机设备包括一种能够按照事先设定或存储的指令,自动进行数值计算和/或信息处理的电子设备,其硬件包括但不限于微处理器、专用集成电路(ASIC)、可编程门阵列(FPGA)、数字处理器(DSP)、嵌入式设备等。所述计算机设备包括网络设备和/或用户设备。其中,所述网络设备包括但不限于单个网络服务器、多个网络服务器组成的服务器组或基于云计算(Cloud Computing)的由大量主机或网络服务器构成的云,其中,云计算是分布式计算的一种,由一群松散耦合的计算机集组成的一个超级虚拟计算机。所述用户设备包括但不限于任何一种可与用户通过键盘、鼠标、遥控器、触摸板、或声控设备等方式进行人机交互的电子产品,例如,个人计算机、平板电脑、智能手机、PDA、游戏机、或IPTV等。其中,所述用户设备及网络设备所处的网络包括但不限于互联网、广域网、城域网、局域网、VPN网络等。
需要说明的是,所述用户设备、网络设备以及网络仅为举例,其他现有的或今后可能出现的用户设备、网络设备以及网络如可适用于本发明,也应包含在本发明保护范围以内,并以引用方式包含于此。
本发明的软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,本发明的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,RAM存储器,磁或光驱动器或软磁盘及类似设备。另外,本发明的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个功能或步骤的电路。
另外,本发明的一部分可被应用为计算机程序产品,例如计算机程序指令,当其被计算机执行时,通过该计算机的操作,可以调用或提供根据本发明的方法和/或技术方案。而调用本发明的方法的程序指令,可能被存储在固定的或可移动的记录介质中,和/或通过广播或其他信号承载媒体中的数据流而被传输,和/或被存储在根据所述程序指令运行的计算机设备的工作存储器中。在此,根据本发明的一个实施例包括一个装置,该装置包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发该装置运行基于前述根据本发明的多个实施例的方法和/或技术方案。
对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。系统权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。

Claims (18)

1.一种检测源代码漏洞的方法,其中,所述方法包括以下步骤:
x基于与所述源代码对应的抽象语法树,确定所述抽象语法树中的一个或多个敏感节点,以将敏感节点作为初始节点,其中,所述敏感节点对应于所述源代码中的敏感函数的参数信息;
其中,所述方法还包括以下步骤:
a基于所述抽象语法树,查找与所述初始节点对应的参数信息具有依赖关系的依赖节点,以将所述依赖节点作为所述初始节点的子节点;
b当所述依赖节点不对应用户输入信息时,将该依赖节点作为新的初始节点,并重复前述步骤a和b。
2.根据权利要求1所述的方法,其中,所述步骤a进一步包括以下步骤:
-基于所述抽象语法树,查找用于对所述初始节点对应的参数信息进行赋值的赋值信息,以将所述赋值信息对应的节点作为依赖节点。
3.根据权利要求1或2所述的方法,其中,所述方法还包括以下步骤:
-所述依赖节点对应于用户输入信息时,记录该依赖节点到其对应的敏感节点的敏感路径信息。
4.根据权利要求1至3中任一项所述的方法,其中,对于所述抽象语法树中的分支语句,所述方法进一步包括:
-对分支语句的每一分支,分别执行步骤a至b。
5.根据权利要求1至4中任一项所述的方法,其中,对于所述抽象语法树中的循环语句,所述方法还包括:
-基于当前的初始节点,在当前循环条件下执行步骤a至b。
6.根据权利要求1至5中任一项所述的方法,其中,所述步骤x进一步包括以下步骤:
-基于预定的危险函数列表,与抽象语法树中的各个节点进行正则运算,以确定所述抽象语法树中各个节点是否为敏感节点。
7.根据权利要求3至5中任一项所述的方法,其中,所述方法还包括以下步骤:
-对于一敏感路径信息,获取与该路径信息对应的敏感函数;
-基于预定安全规则来对所述敏感函数进行验证;
-当所述敏感函数符合所述安全规则时,确定所述敏感路径信息非漏洞。
8.根据权利要求1至7中任一项所述的方法,其中,将敏感函数作为初始函数,所述方法还包括以下步骤:
m基于源代码中的函数调用关系,确定调用所述初始函数的一个或多个待选函数;
n对所述一个或多个待选函数,分别判断所述一个或多个待选函数中的各个待选函数的参数信息与所述初始函数的参数信息是否存在依赖关系;
o当待选函数的参数信息与初始函数的参数信息存在依赖关系时,保存所述待选函数,并将该待选函数作为初始函数,重复执行步骤m至o。
9.根据权利要求8所述的方法,其中,所述方法还包括以下步骤:
-基于所保存的待选函数更新危险函数列表。
10.一种检测源代码漏洞的检测装置,其中,所述检测装置包括:
第一确定装置,用于基于与所述源代码对应的抽象语法树,确定所述抽象语法树中的一个或多个敏感节点,以将敏感节点作为初始节点,其中,所述敏感节点对应于所述源代码中的敏感函数的参数信息;
其中,所述检测装置还包括:
查找装置,用于基于所述抽象语法树,查找与所述初始节点对应的参数信息具有依赖关系的依赖节点,并将所述依赖节点作为所述初始节点的子节点;
第一控制装置,用于当所述依赖节点不对应用户输入信息时,将所述子节点作为新的初始节点,并重复查找装置和第一控制装置的操作。
11.根据权利要求10所述的检测装置,其中,所述查找装置进一步 用于:
-基于所述抽象语法树,查找用于对所述初始节点对应的参数信息进行赋值的赋值信息,以将所述赋值信息对应的节点作为依赖节点。
12.根据权利要求10或11所述的检测装置,其中,所述检测装置还包括:
记录装置,用于所述依赖节点对应于用户输入信息时,记录该依赖节点到其对应的敏感节点的敏感路径信息。
13.根据权利要求10至12中任一项所述的检测装置,其中,对于所述抽象语法树中的分支语句,所述检测装置进一步用于:
-对分支语句的每一分支,分别执行查找装置和第一控制装置的操作。
14.根据权利要求10至13中任一项所述的检测装置,其中,对于所述抽象语法树中的循环语句,所述检测装置还包括:
-基于当前的初始节点,在当前循环条件下执行查找装置和第一控制装置的操作。
15.根据权利要求10至14中任一项所述的检测装置,其中,所述第一确定装置进一步包括用于:
-基于预定的危险函数列表,与抽象语法树中的各个节点进行正则运算,以确定所述抽象语法树中各个节点是否为敏感节点。
16.根据权利要求12至15中任一项所述的检测装置,其中,所述检测装置还包括:
获取装置,用于对于一敏感路径信息,获取与该路径信息对应的敏感函数;
验证装置,用于基于预定安全规则来对所述敏感函数进行验证;
第二确定装置,用于当所述敏感函数符合所述安全规则时,确定所述敏感路径信息非漏洞。
17.根据权利要求10至16中任一项所述的检测装置,其中,将敏感函数作为初始函数,所述检测装置还包括:
第三确定装置,用于基于源代码中的函数调用关系,确定调用所述 初始函数的一个或多个待选函数;
判断装置,用于对所述一个或多个待选函数,分别判断所述一个或多个待选函数中的各个待选函数的参数信息与所述初始函数的参数信息是否存在依赖关系;
第二控制装置,用于当待选函数的参数信息与初始函数的参数信息存在依赖关系时,确定改待选函数为所述初始函数的依赖函数,保存所述待选函数,并将该待选函数作为初始函数,重复执行第三确定装置、判断装置以及第二控制装置的操作。
18.根据权利要求17所述的检测装置,其中,所述检测装置还包括:
更新装置,用于基于所保存的待选函数更新危险函数列表。
CN201510202537.0A 2015-04-24 2015-04-24 一种检测源代码漏洞的方法和装置 Pending CN104850493A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201510202537.0A CN104850493A (zh) 2015-04-24 2015-04-24 一种检测源代码漏洞的方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510202537.0A CN104850493A (zh) 2015-04-24 2015-04-24 一种检测源代码漏洞的方法和装置

Publications (1)

Publication Number Publication Date
CN104850493A true CN104850493A (zh) 2015-08-19

Family

ID=53850146

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510202537.0A Pending CN104850493A (zh) 2015-04-24 2015-04-24 一种检测源代码漏洞的方法和装置

Country Status (1)

Country Link
CN (1) CN104850493A (zh)

Cited By (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106548264A (zh) * 2015-09-22 2017-03-29 阿里巴巴集团控股有限公司 一种数据分析方法和装置
CN106610999A (zh) * 2015-10-26 2017-05-03 北大方正集团有限公司 查询处理方法和装置
CN107169360A (zh) * 2017-06-14 2017-09-15 广东电力发展股份有限公司沙角A电厂 一种源代码安全漏洞的检测方法及系统
CN108153659A (zh) * 2016-12-02 2018-06-12 腾讯科技(深圳)有限公司 程序漏洞检测方法及相关装置
CN108256335A (zh) * 2018-02-08 2018-07-06 北京百度网讯科技有限公司 用于检测漏洞的方法和装置
CN109117633A (zh) * 2018-08-13 2019-01-01 百度在线网络技术(北京)有限公司 静态源码扫描方法、装置、计算机设备及存储介质
CN109214191A (zh) * 2018-09-18 2019-01-15 北京理工大学 一种利用深度学习预测软件安全漏洞的方法
CN109977205A (zh) * 2019-03-08 2019-07-05 中南大学 一种计算机自主学习源代码的方法
CN111125714A (zh) * 2019-12-18 2020-05-08 支付宝(杭州)信息技术有限公司 一种安全检测方法、装置及电子设备
CN112131122A (zh) * 2020-09-27 2020-12-25 北京软安科技有限公司 一种源代码缺陷检测工具误报评估方法及装置
CN112131573A (zh) * 2020-09-14 2020-12-25 深信服科技股份有限公司 安全漏洞的检测方法、装置及存储介质
CN112162777A (zh) * 2020-09-27 2021-01-01 北京软安科技有限公司 一种源代码特征提取方法及装置
CN112199913A (zh) * 2020-10-15 2021-01-08 湖南泛联新安信息科技有限公司 一种基于Coq的超大规模集成电路RTL漏洞形式化分析方法
CN112445500A (zh) * 2020-11-30 2021-03-05 北京达佳互联信息技术有限公司 应用程序处理方法、应用程序运行方法及相关设备

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7849509B2 (en) * 2005-10-07 2010-12-07 Microsoft Corporation Detection of security vulnerabilities in computer programs
CN103268281A (zh) * 2013-05-07 2013-08-28 北京天广汇通科技有限公司 一种源代码漏洞检测方法及其系统
CN103455759A (zh) * 2012-06-05 2013-12-18 深圳市腾讯计算机系统有限公司 一种页面漏洞检测装置及检测方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7849509B2 (en) * 2005-10-07 2010-12-07 Microsoft Corporation Detection of security vulnerabilities in computer programs
CN103455759A (zh) * 2012-06-05 2013-12-18 深圳市腾讯计算机系统有限公司 一种页面漏洞检测装置及检测方法
CN103268281A (zh) * 2013-05-07 2013-08-28 北京天广汇通科技有限公司 一种源代码漏洞检测方法及其系统

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
过辰楷: "基于逆推污点分析技术的SQL注入漏洞检测系统设计与实现", 《万方学位论文》 *

Cited By (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106548264A (zh) * 2015-09-22 2017-03-29 阿里巴巴集团控股有限公司 一种数据分析方法和装置
WO2017050148A1 (zh) * 2015-09-22 2017-03-30 阿里巴巴集团控股有限公司 一种数据分析方法和装置
CN106610999A (zh) * 2015-10-26 2017-05-03 北大方正集团有限公司 查询处理方法和装置
CN108153659A (zh) * 2016-12-02 2018-06-12 腾讯科技(深圳)有限公司 程序漏洞检测方法及相关装置
CN107169360A (zh) * 2017-06-14 2017-09-15 广东电力发展股份有限公司沙角A电厂 一种源代码安全漏洞的检测方法及系统
CN108256335B (zh) * 2018-02-08 2019-06-18 北京百度网讯科技有限公司 用于检测漏洞的方法和装置
CN108256335A (zh) * 2018-02-08 2018-07-06 北京百度网讯科技有限公司 用于检测漏洞的方法和装置
CN109117633A (zh) * 2018-08-13 2019-01-01 百度在线网络技术(北京)有限公司 静态源码扫描方法、装置、计算机设备及存储介质
CN109214191A (zh) * 2018-09-18 2019-01-15 北京理工大学 一种利用深度学习预测软件安全漏洞的方法
CN109977205A (zh) * 2019-03-08 2019-07-05 中南大学 一种计算机自主学习源代码的方法
CN109977205B (zh) * 2019-03-08 2021-06-22 中南大学 一种计算机自主学习源代码的方法
CN111125714A (zh) * 2019-12-18 2020-05-08 支付宝(杭州)信息技术有限公司 一种安全检测方法、装置及电子设备
CN112131573A (zh) * 2020-09-14 2020-12-25 深信服科技股份有限公司 安全漏洞的检测方法、装置及存储介质
CN112162777A (zh) * 2020-09-27 2021-01-01 北京软安科技有限公司 一种源代码特征提取方法及装置
CN112131122A (zh) * 2020-09-27 2020-12-25 北京软安科技有限公司 一种源代码缺陷检测工具误报评估方法及装置
CN112131122B (zh) * 2020-09-27 2022-09-30 北京智联安行科技有限公司 一种源代码缺陷检测工具误报评估方法及装置
CN112199913A (zh) * 2020-10-15 2021-01-08 湖南泛联新安信息科技有限公司 一种基于Coq的超大规模集成电路RTL漏洞形式化分析方法
CN112199913B (zh) * 2020-10-15 2023-12-12 湖南泛联新安信息科技有限公司 一种基于Coq的超大规模集成电路RTL漏洞形式化分析方法
CN112445500A (zh) * 2020-11-30 2021-03-05 北京达佳互联信息技术有限公司 应用程序处理方法、应用程序运行方法及相关设备

Similar Documents

Publication Publication Date Title
CN104850493A (zh) 一种检测源代码漏洞的方法和装置
KR101981028B1 (ko) 바이너리 기반 보안 취약점 탐색 시스템, 그 방법 및 프로그램
KR101904911B1 (ko) 하이브리드 퍼징 기반 보안 취약점 자동 탐색 방법 및 그 장치
Eschweiler et al. Discovre: Efficient cross-architecture identification of bugs in binary code.
Li et al. Libd: Scalable and precise third-party library detection in android markets
Feng et al. Extracting conditional formulas for cross-platform bug search
Zhang et al. Program logic based software plagiarism detection
Wang et al. In-memory fuzzing for binary code similarity analysis
CN104598824B (zh) 一种恶意程序检测方法及其装置
KR101751388B1 (ko) 오픈소스 취약점 분석 대상 검색 및 수집을 위한 빅데이터 분석 기반 웹 크롤링 시스템 및 그 방법
Kamtuo et al. Machine Learning for SQL injection prevention on server-side scripting
BR102015017215A2 (pt) método implementado em computador para classificação de aplicativos móveis, e, programa de computador codificado em um meio de armazenamento não-trasitório
CN104331663A (zh) web shell的检测方法以及web服务器
CN110765459A (zh) 一种恶意脚本检测方法、装置和存储介质
Yan et al. Multiple-entry testing of android applications by constructing activity launching contexts
KR102013582B1 (ko) 혼합 모드 프로그램의 소스 코드 오류 위치 검출 장치 및 방법
Guan et al. Semantics-based repackaging detection for mobile apps
CN104199969A (zh) 网页数据分析方法及装置
CN103577514A (zh) 用于自动数据探索的方法和装置
CN115277127A (zh) 基于系统溯源图搜索匹配攻击模式的攻击检测方法及装置
KR20190037895A (ko) 바이너리 파일에 기초하여 오픈소스 소프트웨어 패키지를 식별하는 방법 및 시스템
KR101696694B1 (ko) 역추적을 이용한 소스 코드 취약점 분석 방법 및 장치
CN104216946A (zh) 一种用于确定重打包应用程序的方法和装置
CN113890821A (zh) 一种日志关联的方法、装置及电子设备
Karande et al. BCD: Decomposing binary code into components using graph-based clustering

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
EXSB Decision made by sipo to initiate substantive examination
SE01 Entry into force of request for substantive examination
RJ01 Rejection of invention patent application after publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20150819