CN107038115B - 应用软件安全漏洞检测方法和系统 - Google Patents
应用软件安全漏洞检测方法和系统 Download PDFInfo
- Publication number
- CN107038115B CN107038115B CN201611036441.2A CN201611036441A CN107038115B CN 107038115 B CN107038115 B CN 107038115B CN 201611036441 A CN201611036441 A CN 201611036441A CN 107038115 B CN107038115 B CN 107038115B
- Authority
- CN
- China
- Prior art keywords
- point
- invocation
- application software
- external input
- sensitive
- 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.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种应用软件安全漏洞检测方法,该方法包括:将应用软件编译为预设的中间语言代码文本;根据所述代码文本,获取所述应用软件的数据关联结构;根据所述应用软件中敏感调用点的变量参数及所述数据关联结构,回溯查找所述敏感调用点对应的外部输入点;若成功查找到所述敏感调用点对应的外部输入点,则确定所述外部输入点为所述应用软件的安全漏洞。本发明还公开了一种应用软件安全漏洞检测系统。本发明大大提升了应用软件安全漏洞检测的效率。
Description
技术领域
本发明涉及信息安全技术领域,尤其涉及一种应用软件安全漏洞检测方法和系统。
背景技术
现有应用软件漏洞静态检测方案通常是基于Android smali(安卓编译器)或者java(计算机编程语言)源码的规则扫描,通过采用预定义的正则或字符串特征的匹配检查方式,判断应用软件的代码模式是否存在问题。
由于这种静态扫描未关联程序上下文数据,仅根据既定的规则检测,容易存在大量安全隐患的误报;并且,Android smali代码的语言粒度较细,一个语义需要多条语句表示,在进行应用软件的安全漏洞检测时,工作量大,浪费资源;而java高级语言代码的粒度偏粗,单一语句可能包含隐藏的语义,在进行应用软件的安全漏洞检测时,检测的粒度也相应较粗,存在安全隐患漏报。
可见,现有的应用软件安全漏洞检测方式受代码语言影响,检测效率较低。
发明内容
本发明的主要目的在于提供一种应用软件安全漏洞检测方法和系统,旨在解决应用软件代码语言影响安全漏洞检测效率的技术问题。
为实现上述目的,本发明提供一种应用软件安全漏洞检测方法,所述应用软件安全漏洞检测方法包括以下步骤:
将应用软件编译为预设的中间语言代码文本;
根据所述代码文本,获取所述应用软件的数据关联结构;
根据所述应用软件中敏感调用点的变量参数及所述数据关联结构,回溯查找所述敏感调用点对应的外部输入点;
若成功查找到所述敏感调用点对应的外部输入点,则确定所述外部输入点为所述应用软件的安全漏洞。
优选地,所述根据所述应用软件中敏感调用点的变量参数及所述数据关联结构,回溯查找所述敏感调用点对应的外部输入点的步骤包括:
根据所述变量参数及所述数据关联结构,回溯查找输出所述变量参数的前驱调用点;
若所述前驱调用点是基于函数调用输出的返回值,则再次回溯查找返回所述前驱调用点实参的前驱调用点,确定源节点;
若所述源节点为外部输入点,则确定所述外部输入点为所述敏感调用点对应的外部输入点;
若所述源节点为常量赋值,则停止回溯,确定未找到所述敏感调用点对应的外部输入点。
优选地,所述根据所述应用软件中敏感调用点的变量参数及所述数据关联结构,回溯查找所述敏感调用点对应的外部输入点的步骤,还包括:
若找到多个输出所述变量参数且执行顺序先于所述敏感调用点的调用点,则确定所述多个调用点中执行顺序最接所述近敏感调用点的为所述前驱调用点。
优选地,所述根据所述应用软件中敏感调用点的变量参数及所述数据关联结构,回溯查找所述敏感调用点对应的外部输入点的步骤,还包括:
若所述前驱调用点将所述变量参数作为赋值输出,则根据所述数据关联结构获取所述变量参数对应的右值;
若所述右值为外部输入点输入的变量,则确定所述外部输入点为所述敏感调用点对应的外部输入点;
若所述右值为常量赋值,则停止回溯,确定未找到所述敏感调用点对应的外部输入点。
优选地,所述确定所述外部输入点为所述应用软件的安全漏洞的步骤之后,还包括:
确定回溯找到所述外部输入点的路径为危险路径。
此外,为实现上述目的,本发明还提供一种应用软件安全漏洞检测系统,所述应用软件安全漏洞检测系统包括:
编译模块,用于将应用软件编译为预设的中间语言代码文本;
关联模块,用于根据所述代码文本,获取所述应用软件的数据关联结构;
回溯模块,用于根据所述应用软件中敏感调用点的变量参数及所述数据关联结构,回溯查找所述敏感调用点对应的外部输入点;
确定模块,用于若成功查找到所述敏感调用点对应的外部输入点,则确定所述外部输入点为所述应用软件的安全漏洞。
优选地,所述回溯模块还用于,
根据所述变量参数及所述数据关联结构,回溯查找输出所述变量参数的前驱调用点;若所述前驱调用点是基于函数调用输出的返回值,则再次回溯查找返回所述前驱调用点实参的前驱调用点,确定源节点;若所述源节点为外部输入点,则确定所述外部输入点为所述敏感调用点对应的外部输入点;若所述源节点为常量赋值,则停止回溯,确定未找到所述敏感调用点对应的外部输入点。
优选地,所述回溯模块还用于,
若找到多个输出所述变量参数且执行顺序先于所述敏感调用点的调用点,则确定所述多个调用点中执行顺序最接所述近敏感调用点的为所述前驱调用点。
优选地,所述回溯模块还用于,
若所述前驱调用点将所述变量参数作为赋值输出,则根据所述数据关联结构获取所述变量参数对应的右值;若所述右值为外部输入点输入的变量,则确定所述外部输入点为所述敏感调用点对应的外部输入点;若所述右值为常量赋值,则停止回溯,确定未找到所述敏感调用点对应的外部输入点。
优选地,所述确定模块还用于,
确定回溯找到所述外部输入点的路径为危险路径。
本发明实施例提出的一种应用软件安全漏洞检测方法和系统,通过将待检测应用软件编译为预设的中间语言代码文本,转换后的应用软件代码一条语句包含一条语义,不会产生歧义,适合做安全漏洞检测;然后,根据应用软件的中间语言代码文本,获取应用软件的数据关联结构,从而得到应用软件中各调用点的函数及参数具体信息,以供进行数据回溯;然后,根据应用软件中敏感调用点的变量参数及数据关联结构,回溯查找敏感调用点对应的外部输入点;若成功查找到敏感调用点对应的外部输入点,则确定此找到的外部输入点为应用软件的安全漏洞,会给应用软件带来风险。本发用针对基于Android smali(安卓编译器)或者java(计算机编程语言)的规则匹配检测方法存在的误报问题,采用中间语言的应用软件程序代码进行数据流分析,既可避免单一程序代码特征的粗糙检查,又能够通过数据关联结构,关联应用软件上下文的数据传递进行数据回溯、漏洞检测,避免了漏洞的误报和漏报;另一方面,本发明基于折中的中间语言的分析规避了smali和java语言的缺点,降低了安全漏洞检测的工作量,使得漏洞检测的结果更准确。由此,本发明解决了现有的应用软件代码语言给安全漏洞检测带来的各项困扰,大大提升了应用软件安全漏洞检测的效率。
附图说明
图1为本发明应用软件安全漏洞检测方法第一实施例的流程示意图;
图2为图1中根据所述应用软件中敏感调用点的变量参数及所述数据关联结构,回溯查找所述敏感调用点对应的外部输入点的步骤的细化流程示意图;
图3为图1中根据所述应用软件中敏感调用点的变量参数及所述数据关联结构,回溯查找所述敏感调用点对应的外部输入点的步骤的细化流程示意图;
图4为本发明应用软件安全漏洞检测方法第二实施例的流程示意图;
图5为本发明应用软件安全漏洞检测方法第三实施例的流程示意图;
图6为本发明应用软件安全漏洞检测系统第一实施例、第二实施例、第三实施例的功能模块示意图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
参照图1,本发明应用软件安全漏洞检测方法第一实施例提供一种应用软件安全漏洞检测方法,所述应用软件安全漏洞检测方法包括:
步骤S10、将应用软件编译为预设的中间语言代码文本。
本发明通过将待检测应用软件编译为中间语言文本,得到的应用软件代码一条语句包含一条语义,不会产生歧义,而且语言力度相对高级语言较细,相对低级语言较粗,适合进行静态的应用软件安全漏洞检测;而且,本发明综合应用软件的数据关联结构,结合程序上下文的语言传递,避免单一代码特征的粗糙检测造成的漏洞的误报、漏报,并且提高了安全漏洞检测效率。
具体的,作为一种实施方式,首先,通过编译器将待检测应用软件的程序代码编译为中间语言,得到编译后的应用软件代码文本。中间语言也称为Intermediate Language,简称IL。
基于中间语言的应用软件代码可视为节点树,应用软件中的类、方法为节点树的外围节点,类、方法中的变量参数等为外围节点的子节点。可以看出,转换为中间语言后,应用软件的数据结构清楚明了,便于进行数据回溯。
步骤S20、根据所述代码文本,获取所述应用软件的数据关联结构。
在得到应用软件的中间语言代码文本后,根据代码文本,提取用软件的数据关联结构。
得到的数据关联结构包括各调用点方法或类的类型、成员变量、函数、赋值、执行顺序等。为便于使用,可使用数据关联结构表记载上述参数。
步骤S30、根据所述应用软件中敏感调用点的变量参数及所述数据关联结构,回溯查找所述敏感调用点对应的外部输入点。
在得到应用软件的数据关联结构后,根据应用软件的敏感调用点中的变量参数,通过数据关联结构查找敏感调用点对应的外部输入点。其中,敏感调用点是应用软件中的关键调用点,或是安全性要求要高的调用点,可以由测试人员人为确定需检测的敏感调用点。
具体的,首先需要确定敏感调用点的变量参数,例如,敏感调用点使用形参执行函数输出返回值,则敏感调用点的形参即为变量参数,需要追踪传递给敏感调用点、对形参赋值的实参。
然后,根据数据关联结构中其他调用点的信息,进行数据回溯,查找此变量参数数值的来源,以获取影响此变量参数的值的调用点,直至查找到的能够影响此变量参数的值的调用点为源节点,例如常量赋值、外部输入点等时,停止数据回溯。
需要说明的是,源节点的参数不再受应用软件内部其他调用点的影响。
若能够影响此变量参数的值的调用点的源节点为外部输入点,则确定此外部输入点为敏感调用点对应的外部输入点,此外部输入点输入的数据能够影响、控制敏感调用点,给应用软件造成风险。
作为一种实施方式,参照图2,所述步骤S30包括:
步骤S31、根据所述变量参数及所述数据关联结构,回溯查找输出所述变量参数的前驱调用点;
步骤S32、若所述前驱调用点是基于函数调用输出的返回值,则再次回溯查找返回所述前驱调用点实参的前驱调用点,确定源节点;
步骤S33、若所述源节点为外部输入点,则确定所述外部输入点为所述敏感调用点对应的外部输入点;
步骤S34、若所述源节点为常量赋值,则停止回溯,确定未找到所述敏感调用点对应的外部输入点。
例如,主函数调用当前敏感调用点时,传递给敏感调用点的参数为A,敏感调用点根据A执行函数调用后会对应输出返回值,则确定敏感调用点的形参为变量参数。
然后,根据数据关联结构中记载的各调用点的信息,查找应用软件中返回或输出A的前驱调用点,也即查找将A作为返回值输出且执行顺序早于敏感调用点的调用点。
需要说明的是,前驱调用点在应用软件的各调用点执行顺序中,早于对比调用点执行函数调用。例如上述“查找输出A的前驱调用点”中,前驱调用点的函数执行顺序应当早于当前敏感调用点。
若前驱调用点1输出的返回值为A,则判断前驱调用点1输出的参数是否为外部输入点输入的变量。
若前驱调用点1输出的参数是外部输入点输入的变量,也即A是由前驱调用点1根据外部输入点输入的变量对应输出的,则可以确认此外部输入点为数据流的源节点,也就是当前敏感调用点对应的外部输入点。
若前驱调用点1是根据输入的实参B,执行函数调用运算得到A,则根据B继续查找返回B的前驱调用点,也即查找将B作为返回值输出,且执行顺序早于前驱调用点1的调用点,以此类推,直至找到数据流的源节点。
若源节点为外部输入点,则可以确定找到源节点为敏感调用点对应的外部输入点。
若源节点为常量赋值,则可以确定未回溯到外部输入点,当前敏感调用点安全,停止回溯。
进一步地,作为另一种实施方式,参照图3,所述步骤S30还包括:
步骤S35、若所述前驱调用点将所述变量参数作为赋值输出,则根据所述数据关联结构获取所述变量参数对应的右值;
步骤S36、若所述右值为外部输入点输入的变量,则确定所述外部输入点为所述敏感调用点对应的外部输入点;
步骤S37、若所述右值为常量赋值,则停止回溯,确定未找到所述敏感调用点对应的外部输入点。
若敏感调用点的变量参数值是由前驱参数的赋值决定的,也即传递给敏感调用点、对变量参数进行赋值的参数是前驱调用点的赋值,则根据数据关联结构回溯对应的右值,也即对传递给敏感调用点的变量参数进行赋值的右值。
若此右值是外部输入点输入的变量,也即前驱调用点是根据外部输入点输入的变量对输出的参数进行赋值的,则可以确定此外部输入点为敏感调用点对应的外部输入点。
若右值为常量赋值,则可以确定当前数据链安全,未回溯到外部输入点,停止回溯。
由此,实现了对函数调用和赋值的数据追踪,保障了回溯调用点的完整性和准确性。
步骤S40、若成功查找到所述敏感调用点对应的外部输入点,则确定所述外部输入点为所述应用软件的安全漏洞。
若成功回溯数据找到敏感调用点对应的外部输入点,则找到的外部输入点可能会被利用输入数据,调用此敏感调用点,给应用软件带来安全隐患。
由此,可以确定此外部输入点为应用软件的安全漏洞,进行漏洞上报。
在本实施例中,首先将待检测应用软件编译为预设的中间语言代码文本,转换后的应用软件代码一条语句包含一条语义,不会产生歧义,适合做安全漏洞检测;然后,根据应用软件的中间语言代码文本,获取应用软件的数据关联结构,从而得到应用软件中各调用点的函数及参数具体信息,以供进行数据回溯;然后,根据应用软件中敏感调用点的变量参数及数据关联结构,回溯查找敏感调用点对应的外部输入点;若成功查找到敏感调用点对应的外部输入点,则确定此找到的外部输入点为应用软件的安全漏洞,会给应用软件带来风险。本实施例中针对基于Android smali(安卓编译器)或者java(计算机编程语言)的规则匹配检测方法存在的误报问题,采用中间语言的应用软件程序代码进行数据流分析,既可避免单一程序代码特征的粗糙检查,又能够通过数据关联结构,关联应用软件上下文的数据传递进行数据回溯、漏洞检测,避免了漏洞的误报和漏报;另一方面,本实施例基于折中的中间语言的分析规避了smali和java语言的缺点,降低了安全漏洞检测的工作量,使得漏洞检测的结果更准确。由此,本实施例解决了现有的应用软件代码语言给安全漏洞检测带来的各项困扰,大大提升了应用软件安全漏洞检测的效率。
进一步地,参照图4,本发明应用软件安全漏洞检测方法第二实施例提供一种应用软件安全漏洞检测方法,基于上述本发明应用软件安全漏洞检测方法第一实施例,所述步骤S30还包括:
步骤S38、若找到多个输出所述变量参数且执行顺序先于所述敏感调用点的调用点,则确定所述多个调用点中执行顺序最接所述近敏感调用点的为所述前驱调用点。
在根据变量参数及数据关联结构进行数据回溯时,可能会遇到多个调用点输出参数均为此变量参数,此时,首先根据各调用点的执行顺序,筛选出执行顺序先于敏感调用点的调用点,也可称为执行顺序早于敏感调用点的调用点。
若筛选后,得到的调用点只有一个,则就可以确定此调用点为当前查找的、用于进一步进行数据回溯前驱调用点;若筛选后,得到的调用点有多个,则此时根据这多个调用点的执行顺序,确定执行顺序最晚、但早于敏感调用点的调用点为当前查找的、用于进一步进行数据回溯前驱调用点,也即确定执行顺序最接近敏感调用点的为前驱调用点。
例如,基于上述本发明应用软件安全漏洞检测方法第一实施例,若输出变量参数A的调用点包括调用点2、调用点3,则获取调用点2、调用点3的执行顺序。若调用点2先于调用点3执行,敏感调用点晚于调用点3执行,则调用点3的执行顺序更加接近敏感调用点,确定调用点3为前驱调用点;若调用点3先于调用点2执行,敏感调用点晚于调用点2执行,则调用点2的执行顺序更加接近敏感调用点,确定调用点2为前驱调用点。
由此,在有多个调用点输出变量参数时,可以唯一确定前驱调用点,实现了通过调用点时序,进行数据回溯和外部输入点的查找。
同理,在后续回溯数据时,若遇到多个调用点输出的参数均为当前回溯的参数、无法确定前驱调用点的情况时,选取执行顺序早于当前调用点、且最接近当前调用点的为前驱调用点,继续进行数据回溯。
在本实施例中,若找到多个输出变量参数且执行顺序先于敏感调用点的调用点,则确定多个调用点中执行顺序最接近敏感调用点的为前驱调用点。本实施例解决了在数据回溯过程中,遇到多个调用点输出所需要回溯的变量参数时无法确定前驱调用点的问题,使得数据回溯能够顺利进行。
进一步地,参照图5,本发明应用软件安全漏洞检测方法第三实施例提供一种应用软件安全漏洞检测方法,基于上述本发明应用软件安全漏洞检测方法第一实施例或第二实施例(本实施例以上述本发明应用软件安全漏洞检测方法第一实施例为例),所述步骤S40之后,还包括:
步骤S50、确定回溯找到所述外部输入点的路径为危险路径。
当成功找到敏感调用点对应的外部输入点时,将找到外部输入点的路径信息提取出来,得到从外部输入点输入的污点数据流向敏感调用点的路径,以及路径上被感染的各调用点。
然后,标记此路径为危险路径,便于研发人员了解敏感调用点的具体风险,以提高应用软件的完全性。
在本实施例中,确定回溯找到敏感调用点对应外部输入点的路径为危险路径,以便于研发人员进行进一步地漏洞原因分析、提升应用软件的安全性。
参照图6,本发明应用软件安全漏洞检测系统第一实施例提供一种应用软件安全漏洞检测系统,所述应用软件安全漏洞检测系统包括:
编译模块10,用于将应用软件编译为预设的中间语言代码文本。
本发明通过将待检测应用软件编译为中间语言文本,得到的应用软件代码一条语句包含一条语义,不会产生歧义,而且语言力度相对高级语言较细,相对低级语言较粗,适合进行静态的应用软件安全漏洞检测;而且,本发明综合应用软件的数据关联结构,结合程序上下文的语言传递,避免单一代码特征的粗糙检测造成的漏洞的误报、漏报,并且提高了安全漏洞检测效率。
具体的,作为一种实施方式,首先,编译模块10通过编译器将待检测应用软件的程序代码编译为中间语言,得到编译后的应用软件代码文本。中间语言也称为IntermediateLanguage,简称IL。
基于中间语言的应用软件代码可视为节点树,应用软件中的类、方法为节点树的外围节点,类、方法中的变量参数等为外围节点的子节点。可以看出,转换为中间语言后,应用软件的数据结构清楚明了,便于进行数据回溯。
关联模块20,用于根据所述代码文本,获取所述应用软件的数据关联结构。
在得到应用软件的中间语言代码文本后,关联模块20根据代码文本,提取用软件的数据关联结构。
得到的数据关联结构包括各调用点方法或类的类型、成员变量、函数、赋值、执行顺序等。为便于使用,关联模块20可使用数据关联结构表记载上述参数。
回溯模块30,用于根据所述应用软件中敏感调用点的变量参数及所述数据关联结构,回溯查找所述敏感调用点对应的外部输入点。
在得到应用软件的数据关联结构后,回溯模块30根据应用软件的敏感调用点中的变量参数,通过数据关联结构查找敏感调用点对应的外部输入点。其中,敏感调用点是应用软件中的关键调用点,或是安全性要求要高的调用点,可以由测试人员人为确定需检测的敏感调用点。
具体的,回溯模块30首先需要确定敏感调用点的变量参数,例如,敏感调用点使用形参执行函数输出返回值,则敏感调用点的形参即为变量参数,需要追踪传递给敏感调用点、对形参赋值的实参。
然后,回溯模块30根据数据关联结构中其他调用点的信息,进行数据回溯,查找此变量参数数值的来源,以获取影响此变量参数的值的调用点,直至查找到的能够影响此变量参数的值的调用点为源节点,例如常量赋值、外部输入点等时,停止数据回溯。
需要说明的是,源节点的参数不再受应用软件内部其他调用点的影响。
若能够影响此变量参数的值的调用点的源节点为外部输入点,则回溯模块30确定此外部输入点为敏感调用点对应的外部输入点,此外部输入点输入的数据能够影响、控制敏感调用点,给应用软件造成风险。
作为一种实施方式,所述回溯模块30还用于,
根据所述变量参数及所述数据关联结构,回溯查找输出所述变量参数的前驱调用点;若所述前驱调用点是基于函数调用输出的返回值,则再次回溯查找返回所述前驱调用点实参的前驱调用点,确定源节点;若所述源节点为外部输入点,则确定所述外部输入点为所述敏感调用点对应的外部输入点;、若所述源节点为常量赋值,则停止回溯,确定未找到所述敏感调用点对应的外部输入点。
例如,主函数调用当前敏感调用点时,传递给敏感调用点的参数为A,敏感调用点根据A执行函数调用后会对应输出返回值,则回溯模块30确定敏感调用点的形参为变量参数。
然后,回溯模块30根据数据关联结构中记载的各调用点的信息,查找应用软件中返回或输出A的前驱调用点,也即查找将A作为返回值输出且执行顺序早于敏感调用点的调用点。
需要说明的是,前驱调用点在应用软件的各调用点执行顺序中,早于对比调用点执行函数调用。例如上述“查找输出A的前驱调用点”中,前驱调用点的函数执行顺序应当早于当前敏感调用点。
若前驱调用点1输出的返回值为A,则回溯模块30判断前驱调用点1输出的参数是否为外部输入点输入的变量。
若前驱调用点1输出的参数是外部输入点输入的变量,也即A是由前驱调用点1根据外部输入点输入的变量对应输出的,则回溯模块30可以确认此外部输入点为数据流的源节点,也就是当前敏感调用点对应的外部输入点。
若前驱调用点1是根据输入的实参B,执行函数调用运算得到A,则回溯模块30根据B继续查找返回B的前驱调用点,也即查找将B作为返回值输出,且执行顺序早于前驱调用点1的调用点,以此类推,直至找到数据流的源节点。
若源节点为外部输入点,则回溯模块30可以确定找到源节点为敏感调用点对应的外部输入点。
若源节点为常量赋值,则回溯模块30可以确定未回溯到外部输入点,当前敏感调用点安全,停止回溯。
进一步地,作为另一种实施方式,所述回溯模块30还用于,
若所述前驱调用点将所述变量参数作为赋值输出,则根据所述数据关联结构获取所述变量参数对应的右值;若所述右值为外部输入点输入的变量,则确定所述外部输入点为所述敏感调用点对应的外部输入点;若所述右值为常量赋值,则停止回溯,确定未找到所述敏感调用点对应的外部输入点。
若敏感调用点的变量参数值是由前驱参数的赋值决定的,也即传递给敏感调用点、对变量参数进行赋值的参数是前驱调用点的赋值,则回溯模块30根据数据关联结构回溯对应的右值,也即对传递给敏感调用点的变量参数进行赋值的右值。
若此右值是外部输入点输入的变量,也即前驱调用点是根据外部输入点输入的变量对输出的参数进行赋值的,则回溯模块30可以确定此外部输入点为敏感调用点对应的外部输入点。
若右值为常量赋值,则回溯模块30可以确定当前数据链安全,未回溯到外部输入点,停止回溯。
由此,实现了对函数调用和赋值的数据追踪,保障了回溯调用点的完整性和准确性。
确定模块40,用于若成功查找到所述敏感调用点对应的外部输入点,则确定所述外部输入点为所述应用软件的安全漏洞。
若成功回溯数据找到敏感调用点对应的外部输入点,则找到的外部输入点可能会被利用输入数据,调用此敏感调用点,给应用软件带来安全隐患。
由此,确定模块40可以确定此外部输入点为当前应用软件的安全漏洞,进行漏洞上报。
在本实施例中,首先编译模块10将待检测应用软件编译为预设的中间语言代码文本,转换后的应用软件代码一条语句包含一条语义,不会产生歧义,适合做安全漏洞检测;然后,关联模块20根据应用软件的中间语言代码文本,获取应用软件的数据关联结构,从而得到应用软件中各调用点的函数及参数具体信息,以供进行数据回溯;然后,回溯模块30根据应用软件中敏感调用点的变量参数及数据关联结构,回溯查找敏感调用点对应的外部输入点;若成功查找到敏感调用点对应的外部输入点,则确定模块确定此找到的外部输入点为应用软件的安全漏洞,会给应用软件带来风险。本实施例中针对基于Android smali(安卓编译器)或者java(计算机编程语言)的规则匹配检测方法存在的误报问题,采用中间语言的应用软件程序代码进行数据流分析,既可避免单一程序代码特征的粗糙检查,又能够通过数据关联结构,关联应用软件上下文的数据传递进行数据回溯、漏洞检测,避免了漏洞的误报和漏报;另一方面,本实施例基于折中的中间语言的分析规避了smali和java语言的缺点,降低了安全漏洞检测的工作量,使得漏洞检测的结果更准确。由此,本实施例解决了现有的应用软件代码语言给安全漏洞检测带来的各项困扰,大大提升了应用软件安全漏洞检测的效率。
进一步地,参照图6,本发明应用软件安全漏洞检测系统第二实施例提供一种应用软件安全漏洞检测系统,基于上述本发明应用软件安全漏洞检测系统第一实施例,所述回溯模块30还用于,
若找到多个输出所述变量参数且执行顺序先于所述敏感调用点的调用点,则确定所述多个调用点中执行顺序最接所述近敏感调用点的为所述前驱调用点。
在根据变量参数及数据关联结构进行数据回溯时,可能会遇到多个调用点输出参数均为此变量参数,此时,回溯模块30首先根据各调用点的执行顺序,筛选出执行顺序先于敏感调用点的调用点,也可称为执行顺序早于敏感调用点的调用点。
若筛选后,得到的调用点只有一个,则回溯模块30就可以确定此调用点为当前查找的、用于进一步进行数据回溯前驱调用点;若筛选后,得到的调用点有多个,则此时回溯模块30根据这多个调用点的执行顺序,确定执行顺序最晚、但早于敏感调用点的调用点为当前查找的、用于进一步进行数据回溯前驱调用点,也即确定执行顺序最接近敏感调用点的为前驱调用点。
例如,基于上述本发明应用软件安全漏洞检测方法第一实施例,若输出变量参数A的调用点包括调用点2、调用点3,则获取调用点2、调用点3的执行顺序。若调用点2先于调用点3执行,敏感调用点晚于调用点3执行,则调用点3的执行顺序更加接近敏感调用点,确定调用点3为前驱调用点;若调用点3先于调用点2执行,敏感调用点晚于调用点2执行,则调用点2的执行顺序更加接近敏感调用点,确定调用点2为前驱调用点。
由此,在有多个调用点输出变量参数时,回溯模块30可以唯一确定前驱调用点,实现了通过调用点时序,进行数据回溯和外部输入点的查找。
同理,在后续回溯数据时,若遇到多个调用点输出的参数均为当前回溯的参数、无法确定前驱调用点的情况时,回溯模块30选取执行顺序早于当前调用点、且最接近当前调用点的为前驱调用点,继续进行数据回溯。
在本实施例中,若找到多个输出变量参数且执行顺序先于敏感调用点的调用点,则回溯模块30确定多个调用点中执行顺序最接近敏感调用点的为前驱调用点。本实施例解决了在数据回溯过程中,遇到多个调用点输出所需要回溯的变量参数时无法确定前驱调用点的问题,使得数据回溯能够顺利进行。
进一步地,参照图6,本发明应用软件安全漏洞检测系统第三实施例提供一种应用软件安全漏洞检测系统,基于上述本发明应用软件安全漏洞检测系统第一实施例或第二实施例,所述确定模块40还用于,
确定回溯找到所述外部输入点的路径为危险路径。
当成功找到敏感调用点对应的外部输入点时,确定模块40将找到外部输入点的路径信息提取出来,得到从外部输入点输入的污点数据流向敏感调用点的路径,以及路径上被感染的各调用点。
然后,确定模块40标记此路径为危险路径,便于研发人员了解敏感调用点的具体风险,以提高应用软件的完全性。
在本实施例中,确定模块40确定回溯找到敏感调用点对应外部输入点的路径为危险路径,以便于研发人员进行进一步地漏洞原因分析、提升应用软件的安全性。
以上仅为本发明的可选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
Claims (8)
1.一种应用软件安全漏洞检测方法,其特征在于,所述应用软件安全漏洞检测方法包括以下步骤:
将应用软件编译为预设的中间语言代码文本;
根据所述代码文本,获取所述应用软件的数据关联结构;
根据所述应用软件中敏感调用点的变量参数及所述数据关联结构,回溯查找所述敏感调用点对应的外部输入点;
若成功查找到所述敏感调用点对应的外部输入点,则确定所述外部输入点为所述应用软件的安全漏洞;
所述中间语言代码文本被视为节点树,所述应用软件中的类、方法为所述节点树的外围节点,所述类、方法中的变量参数等为所述外围节点的子节点;
所述代码文本一条语句包含一条语义;
所述数据关联结构包括所述应用软件各调用点的函数及具体参数信息;
所述根据所述应用软件中敏感调用点的变量参数及所述数据关联结构,回溯查找所述敏感调用点对应的外部输入点的步骤包括:
根据所述变量参数及所述数据关联结构,回溯查找输出所述变量参数的前驱调用点;
若所述前驱调用点是基于函数调用输出的返回值,则再次回溯查找返回所述前驱调用点实参的前驱调用点,确定源节点;
若所述源节点为外部输入点,则确定所述外部输入点为所述敏感调用点对应的外部输入点;
若所述源节点为常量赋值,则停止回溯,确定未找到所述敏感调用点对应的外部输入点。
2.如权利要求1所述的应用软件安全漏洞检测方法,其特征在于,所述根据所述应用软件中敏感调用点的变量参数及所述数据关联结构,回溯查找所述敏感调用点对应的外部输入点的步骤,还包括:
若找到多个输出所述变量参数且执行顺序先于所述敏感调用点的调用点,则确定所述多个调用点中执行顺序最接近所述敏感调用点的为所述前驱调用点。
3.如权利要求1所述的应用软件安全漏洞检测方法,其特征在于,所述根据所述应用软件中敏感调用点的变量参数及所述数据关联结构,回溯查找所述敏感调用点对应的外部输入点的步骤,还包括:
若所述前驱调用点将所述变量参数作为赋值输出,则根据所述数据关联结构获取所述变量参数对应的右值;
若所述右值为外部输入点输入的变量,则确定所述外部输入点为所述敏感调用点对应的外部输入点;
若所述右值为常量赋值,则停止回溯,确定未找到所述敏感调用点对应的外部输入点。
4.如权利要求1-3任一项所述的应用软件安全漏洞检测方法,其特征在于,所述确定所述外部输入点为所述应用软件的安全漏洞的步骤之后,还包括:
确定回溯找到所述外部输入点的路径为危险路径。
5.一种应用软件安全漏洞检测系统,其特征在于,所述应用软件安全漏洞检测系统包括:
编译模块,用于将应用软件编译为预设的中间语言代码文本;
关联模块,用于根据所述代码文本,获取所述应用软件的数据关联结构;
回溯模块,用于根据所述应用软件中敏感调用点的变量参数及所述数据关联结构,回溯查找所述敏感调用点对应的外部输入点;
确定模块,用于若成功查找到所述敏感调用点对应的外部输入点,则确定所述外部输入点为所述应用软件的安全漏洞;
所述中间语言代码文本被视为节点树,所述应用软件中的类、方法为所述节点树的外围节点,所述类、方法中的变量参数等为所述外围节点的子节点;
所述代码文本一条语句包含一条语义;
所述数据关联结构包括所述应用软件各调用点的函数及具体参数信息;
所述回溯模块还用于,
根据所述变量参数及所述数据关联结构,回溯查找输出所述变量参数的前驱调用点;若所述前驱调用点是基于函数调用输出的返回值,则再次回溯查找返回所述前驱调用点实参的前驱调用点,确定源节点;若所述源节点为外部输入点,则确定所述外部输入点为所述敏感调用点对应的外部输入点;若所述源节点为常量赋值,则停止回溯,确定未找到所述敏感调用点对应的外部输入点。
6.如权利要求5所述的应用软件安全漏洞检测系统,其特征在于,所述回溯模块还用于,
若找到多个输出所述变量参数且执行顺序先于所述敏感调用点的调用点,则确定所述多个调用点中执行顺序最接近所述敏感调用点的为所述前驱调用点。
7.如权利要求5所述的应用软件安全漏洞检测系统,其特征在于,所述回溯模块还用于,
若所述前驱调用点将所述变量参数作为赋值输出,则根据所述数据关联结构获取所述变量参数对应的右值;若所述右值为外部输入点输入的变量,则确定所述外部输入点为所述敏感调用点对应的外部输入点;若所述右值为常量赋值,则停止回溯,确定未找到所述敏感调用点对应的外部输入点。
8.如权利要求5-7任一项所述的应用软件安全漏洞检测系统,其特征在于,所述确定模块还用于,
确定回溯找到所述外部输入点的路径为危险路径。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611036441.2A CN107038115B (zh) | 2016-11-14 | 2016-11-14 | 应用软件安全漏洞检测方法和系统 |
PCT/CN2017/077988 WO2018086294A1 (zh) | 2016-11-14 | 2017-03-24 | 应用软件安全漏洞检测方法、系统、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611036441.2A CN107038115B (zh) | 2016-11-14 | 2016-11-14 | 应用软件安全漏洞检测方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107038115A CN107038115A (zh) | 2017-08-11 |
CN107038115B true CN107038115B (zh) | 2018-05-04 |
Family
ID=59531123
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611036441.2A Active CN107038115B (zh) | 2016-11-14 | 2016-11-14 | 应用软件安全漏洞检测方法和系统 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN107038115B (zh) |
WO (1) | WO2018086294A1 (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109214190B (zh) * | 2018-08-30 | 2022-05-20 | 腾讯科技(深圳)有限公司 | 确定漏洞利用样本文件的方法和设备 |
CN111506900B (zh) * | 2020-04-15 | 2023-07-18 | 抖音视界有限公司 | 漏洞检测方法、装置、电子设备及计算机存储介质 |
CN111723375A (zh) * | 2020-06-09 | 2020-09-29 | 杭州孝道科技有限公司 | 一种基于运行时非执行态模式的软件安全漏洞检测方法 |
CN112162777B (zh) * | 2020-09-27 | 2022-11-18 | 北京智联安行科技有限公司 | 一种源代码特征提取方法及装置 |
CN112131122B (zh) * | 2020-09-27 | 2022-09-30 | 北京智联安行科技有限公司 | 一种源代码缺陷检测工具误报评估方法及装置 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104462981A (zh) * | 2013-09-12 | 2015-03-25 | 深圳市腾讯计算机系统有限公司 | 漏洞检测方法及装置 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102955914B (zh) * | 2011-08-19 | 2015-11-25 | 百度在线网络技术(北京)有限公司 | 一种源文件安全漏洞的检测方法及检测装置 |
CN103164331B (zh) * | 2011-12-15 | 2016-03-30 | 阿里巴巴集团控股有限公司 | 一种应用程序的漏洞检测方法和装置 |
CN104298921B (zh) * | 2013-07-15 | 2019-01-29 | 深圳市腾讯计算机系统有限公司 | 动画源文件安全漏洞检查方法及装置 |
US9426177B2 (en) * | 2013-07-15 | 2016-08-23 | Tencent Technology (Shenzhen) Company Limited | Method and apparatus for detecting security vulnerability for animation source file |
CN105550594B (zh) * | 2015-12-17 | 2018-05-25 | 西安电子科技大学 | 安卓应用文件的安全性检测方法 |
-
2016
- 2016-11-14 CN CN201611036441.2A patent/CN107038115B/zh active Active
-
2017
- 2017-03-24 WO PCT/CN2017/077988 patent/WO2018086294A1/zh active Application Filing
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104462981A (zh) * | 2013-09-12 | 2015-03-25 | 深圳市腾讯计算机系统有限公司 | 漏洞检测方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN107038115A (zh) | 2017-08-11 |
WO2018086294A1 (zh) | 2018-05-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107038115B (zh) | 应用软件安全漏洞检测方法和系统 | |
CN104899147B (zh) | 一种面向安全检查的代码静态分析方法 | |
CN101714119B (zh) | 基于二进制程序的测试数据生成器和方法 | |
CN103577324B (zh) | 移动应用中隐私信息泄露的静态检测方法 | |
Gosain et al. | Static analysis: A survey of techniques and tools | |
CN110543421B (zh) | 基于测试用例自动生成算法的单元测试自动执行方法 | |
CN107038378B (zh) | 应用软件安全漏洞检测方法和系统 | |
CN104794401A (zh) | 一种静态分析辅助的符号执行漏洞检测方法 | |
CN102567200A (zh) | 基于函数调用图的并行化安全漏洞检测方法 | |
CN104573503B (zh) | 一种内存访问溢出的检测方法及装置 | |
CN111104335B (zh) | 一种基于多层次分析的c语言缺陷检测方法及装置 | |
CN104021084A (zh) | 一种Java源代码缺陷检测方法及装置 | |
CN107704382A (zh) | 面向Python的函数调用路径生成方法和系统 | |
CN104536883A (zh) | 一种静态缺陷检测方法及其系统 | |
CN103914379B (zh) | 故障自动注入与故障检测的方法及其系统 | |
CN103914374B (zh) | 基于程序切片和频繁模式提取的代码缺陷检测方法及装置 | |
CN104407968B (zh) | 一种通过静态分析测算代码指令最长运行时间的方法 | |
Gallaba et al. | Refactoring asynchrony in JavaScript | |
CN114036072B (zh) | 一种支持自动化检测程序缺陷的方法和系统 | |
CN106021113A (zh) | 一种精准测试的实现方法 | |
KR101583932B1 (ko) | 프로그램의 시그니처를 생성하는 시그니처 생성 장치 및 방법, 시그니처의 악성 코드를 검출하는 악성 코드 검출 장치 및 방법 | |
Saumya et al. | Xstressor: Automatic generation of large-scale worst-case test inputs by inferring path conditions | |
CN103559127A (zh) | 一种缺陷处理方法及缺陷处理器 | |
Szalay et al. | Towards better symbol resolution for C/C++ programs: A cluster-based solution | |
CN115408700A (zh) | 基于二进制程序模块化的开源组件检测方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 1237057 Country of ref document: HK |
|
GR01 | Patent grant | ||
GR01 | Patent grant | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: GR Ref document number: 1237057 Country of ref document: HK |