发明内容
有鉴于此,本公开的目的在于提出一种基于优化变异策略的漏洞检测方法、装置、设备及介质。
基于上述目的,根据本公开的第一方面,提供了一种基于优化变异策略的漏洞检测方法,包括:
获取目标应用程序的源代码;
对所述源代码进行编译和插桩,得到所述源代码的结构中每个分支的内部变量和判断条件,并形成分支-内部变量映射关系;
对所述目标应用程序的输入变量所包括的各输入字节计进行逐字节变动,确定所述源代码中随变动的所述输入字节发生变化的所述内部变量,得到输入字节-内部变量映射关系;
基于所述分支-内部变量映射关系和所述输入字节-内部变量映射关系生成关于输入字节的优化变异策略;
基于所述优化变异策略对所述源代码进行模糊测试,得到漏洞检测结果。
可选地,所述对所述源代码进行插桩包括:
对所述源代码进行词法分析和语法分析得到插桩的位置;
在所述插桩的位置插入信息采集代码,以获取所述源代码被执行时的特征数据。
可选地,得到所述源代码的结构中每个分支的内部变量和判断条件,包括:在所述插桩过程中对所述源代码进行词法分析和语法分析得到每个分支的内部变量和判断条件。
可选地,基于所述分支-内部变量映射关系和所述输入字节-内部变量映射关系生成关于输入字节的优化变异策略,包括:
基于所述输入字节-内部变量映射关系得到所述输入字节对应的内部变量;
基于所述输入字节对应的内部变量和所述分支-内部变量映射关系确定所述输入字节对应的所述判断条件;
基于所述判断条件生成所述输入字节对应的优化变异策略。
可选地,基于所述优化变异策略对所述源代码进行模糊测试,包括:
重新对所述源代码进行编译和插桩,得到经重新插桩的源代码;
基于所述优化变异策略针对所述输入变量的至少部分输入字节进行变异,得到包括变异输入字节的输入队列;
将所述输入队列的每个元素输入所述经重新插桩的源代码,检测所述目标应用程序是否崩溃,得到所述漏洞检测结果。
可选地,对所述源代码进行编译包括:对所述源代码进行无优化等级的编译;重新对所述源代码进行编译包括:对所述源代码进行最高优化等级的编译。
可选地,检测所述目标应用程序是否崩溃,得到所述漏洞检测结果,包括:
如果未检测到目标应用程序崩溃,则所述漏洞检测结果为无漏洞;
如果检测到目标应用程序崩溃,则所述漏洞检测结果包括使得所述目标应用程序崩溃的元素。
根据本公开的第二方面,提供了一种基于优化变异策略的漏洞检测装置,包括:
获取模块,用于获取目标应用程序的源代码;
编译和插桩模块,用于对所述源代码进行编译和插桩,得到所述源代码的结构中每个分支的内部变量和判断条件,并形成分支-内部变量映射关系;
确定模块,用于对所述目标应用程序的输入变量所包括的各输入字节进行逐字节变动,确定所述源代码中随变动的所述输入字节发生变化的所述内部变量,得到输入字节-内部变量映射关系;
策略模块,用于基于所述分支-内部变量映射关系和所述输入字节-内部变量映射关系生成关于输入字节的优化变异策略;
测试模块,用于基于所述优化变异策略对所述源代码进行模糊测试,得到漏洞检测结果。
根据本公开的第三方面,提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如第一方面所述的方法。
根据本公开的第四方面,提供了一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使计算机执行第一方面所述方法。
从上面所述可以看出,根据本公开实施例的基于优化变异策略的漏洞检测检测方法、装置、设备及存储介质,通过生成关于输入字节的优化变异策略,并在模糊测试中对不同的输入字节采用对应的优化变异策略,实现了对应用程序的源代码快速漏洞检测,从源头上保证了应用程序的安全,提高了漏洞检测效率。
具体实施方式
为使本公开的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本公开进一步详细说明。
需要说明的是,除非另外定义,本公开实施例使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。本公开实施例中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。
对于应用程序来说,从应用程序的源代码来对程序进行检测和分析是保障应用程序安全的最好方法。它既可以确保应用程序不被设立后门,也可以提前发现并解决潜在的漏洞安全威胁。在对应用程序进行测试的方法中,灰盒测试和模糊测试是目前常见的源代码缺陷测试技术,灰盒测试的检测效率比白盒测试更高,从应用程序的整体出发,而非陷入程序的细节,同时具有一定的先验知识;灰盒测试比黑盒测试更加关注程序的内部逻辑,常常会通过一些表征性的现象,事件,标志来判断内部的运行状态。而模糊测试通过向目标应用程序发送格式不正确的输入来查找软件漏洞,如果软件崩溃或执行非预期操作,就意味着可能存在安全漏洞。目前传统的模糊测试方法在变异阶段变异效率不高,导致模糊测试整体的效率变低,从而使得漏洞检测的效率降低。
基于上述考虑,本公开实施例提供了一种基于优化变异策略的漏洞检测方法方法。参见图1,图1示出了根据本公开实施例的基于优化变异策略的漏洞检测方法的示意性流程图。如图1所示,基于优化变异策略的漏洞检测方法,包括:
步骤S110,获取目标应用程序的源代码;
步骤S120,对所述源代码进行编译和插桩,得到所述源代码的结构中每个分支的内部变量和判断条件,并形成分支-内部变量映射关系;
步骤S130,对所述目标应用程序的输入变量所包括的各输入字节进行逐字节变动,确定所述源代码中随变动的所述输入字节发生变化的所述内部变量,得到输入字节-内部变量映射关系;
步骤S140,基于所述分支-内部变量映射关系和所述输入字节-内部变量映射关系生成关于输入字节的优化变异策略;
步骤S150,基于所述优化变异策略对所述源代码进行模糊测试,得到漏洞检测结果。
其中,通过对目标应用程序的源代码进行编译和插桩可以得到每个分支的内部变量和判断条件,以形成分支-内部变量映射关系;再通过对输入变量逐字节变动确定随之变动的内部变量,得到输入字节-内部变量映射关系;将分支-内部变量映射关系和输入字节-内部变量映射关系二者结合起来可以得到输入字节对应于不同分支路径上的内部变量和判断条件,从而生成关于输入字节的优化变异策略,并在模糊测试中对不同的输入字节采用对应的优化变异策略,从而完成模糊测试,得到漏洞检测结果。与传统的模糊测试在不同分支路径约束没有相对应的变异方法,导致漏洞检测效率变低相比,根据本公开的基于优化变异策略的漏洞检测方法,在模糊测试时调用更优化的变异策略来从整体提高漏洞检测的效率,实现了对应用程序的源代码快速漏洞检测,从源头上保证了应用程序的安全,提高了漏洞检测效率。
根据本公开实施例,步骤S110,获取目标应用程序的源代码。
其中,获取目标应用程序的源代码可以是基于OpenSSL(Open Secure SocketsLayer,开放式安全套接层协议)对目标应用程序进行分析获取,从而得到相应的OpenSSL源代码。还可以使用Github中的git命令直接将目标应用程序的文件拉取到对应的输入文件夹下,或从网络端通过下载源代码的方式,从而得到目标应用程序的源代码。
根据本公开实施例,步骤S120,对所述源代码进行编译和插桩,得到所述源代码的结构中每个分支的内部变量和判断条件,并形成分支-内部变量映射关系。
在一些实施例中,对所述源代码进行编译可以包括:对所述源代码进行无优化等级的编译。
其中,无优化等级即为O0级,以表示减少编译时间并使调试可以产生预期的结果。通过O0级的编译能够在编译后的文件中尽量保留目标应用程序的源结构,由于源结构中必然存在需要进行判断的步骤,相应地,每个判断发生之前的步骤(即两个判断之间的步骤)可以作为分支结构,那么源代码的结构中包含多个不同的分支结构。
在一些实施例中,对所述源代码进行插桩可以包括:
对所述源代码进行词法分析和语法分析得到插桩的位置;
在所述插桩的位置插入信息采集代码,以获取所述源代码被执行时的特征数据。
其中,插桩的位置可以是发生判断(如选择if语句)、跳转(如goto语句、continue语句)或例程(如函数的入口和/或出口)等的位置。而信息采集代码可以在保证源代码原有逻辑完整性的基础上,获取源代码在被执行时的特征数据,通过对这些特征数据的分析,可以获得源代码的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目的。
在一些实施例中,所述源代码中的每个分支包括至少一个所述插桩的位置。进一步地,则在每个所述插桩的位置对应地包括信息采集代码。
在一些实施例中,得到所述源代码的结构中每个分支的内部变量和判断条件,可以包括:在所述插桩过程中对所述源代码进行词法分析和语法分析得到每个分支的内部变量和判断条件。应了解,在插桩过程中对源代码进行词法分析和语法分析时,可以同时得到插桩的位置、每个分支的内部变量及其判断条件,也可以不同时得到插桩的位置、每个分支的内部变量及其判断条件,在此不做限制。
其中,在对源代码进行插桩的过程中,对所述源代码进行词法分析和语法分析不仅得到插桩的位置,还可以得到个分支的内部变量和判断条件。例如,通过词法分析和语法分析得到在源代码的一个分支A的步骤中“如果X>10则发生跳转”,则其中X为该分支A的内部变量,X>10为该分支A的判断条件。
在一些实施例中,分支-内部变量映射关系可以包括分支与所述分支中对于的变量和判断条件。在上述实施例中,分支-内部变量映射关系可以包括:分支A:内部变量X以及判断条件X>10。
进一步地,在一些实施例中,分支-内部变量映射关系中每个分支可以对应一个或多个内部变量,每个内部变量对应各自的判断条件。例如,分支B:内部变量Y以及判断条件Y′;内部变量Z以及判断条件Z′。
应了解,上述分支-内部变量映射关系仅为示例,并不旨在对其进行限制,分支-内部变量映射关系还可以包括更多分支,每个分支可以对应更多的内部变量和判断条件,在此不做限制。
根据本公开实施例,步骤S130,对所述目标应用程序的输入变量所包括的各输入字节进行逐字节变动,确定所述源代码中随变动的所述输入字节发生变化的所述内部变量,得到输入字节-内部变量映射关系。
其中,可以通过逐个字节调整目标应用程序的输入变量,通过所述插桩的信息采集代码可以确定当输入字节发生变动时,不同分支中随之发生变化的内部变量,则说明该输入字节是依赖于该变化的内部变量,从而可以将变动的输入字节与对应发生变化的内部变量形成映射关系,得到输入字节-内部变量映射关系。
具体地,目标应用程序的输入变量C的输入字节C1、C2、……、Cn,n为正整数,从C1开始进行变动,当变动输入字节C1时,通过步骤S120中插桩的信息采集代码可以获取到每个分支中发生变动的内部变量,如分支D中的内部变量E、F和分支G中的内部变量H随着输入字节C1的变动发生了变化,则可以基于输入字节C1对应于分支D中的内部变量E、F和分支G中的内部变量H形成输入字节-内部变量映射关系。例如,输入字节C1:分支D中的内部变量E、F;分支G中的内部变量H。依次类推,可以得到每个输入字节与内部变量的映射关系。
应了解,上述输入字节-内部变量映射关系仅为示例,并不旨在对其进行限制,输入字节-内部变量关系还可以包括更多输入字节,每个输入字节可以对应更多的内部变量,在此不做限制。
根据本公开实施例,步骤S140,基于所述分支-内部变量映射关系和所述输入字节-内部变量映射关系生成关于输入字节的优化变异策略。
在一些实施例中,基于所述分支-内部变量映射关系和所述输入字节-内部变量映射关系生成关于输入字节的优化变异策略,包括:
基于所述输入字节-内部变量映射关系得到所述输入字节对应的内部变量;
基于所述输入字节对应的内部变量和所述分支-内部变量映射关系确定所述输入字节对应的所述判断条件;
基于所述判断条件生成所述输入字节对应的优化变异策略。
具体地,以输入字节-内部变量映射关系包括:输入字节I:分支A的内部变量X;分支-内部变量映射关系包括:分支A:内部变量X和判断条件J(X>10)为例进行说明。对于输入字节I,可以通过输入字节-内部变量映射关系得到对应的分支A的内部变量X;在基于分支-内部变量映射关系确定该分支A的内部变量X对应的判断条件J,此时,即可确定输入字节I对应于判断条件J,那么基于判断条件J可以生产输入字节I的优化变异策略。例如,判断条件J为X>10,则可以将输入字节I增加预设值作为该输入字节I的优化变异策略。
应了解,每个输入字节可以对应一个或多个内部变量,也就可以对应一个或多个判断条件,则可以对应一个或多个优化变异策略。
在一些实施例中,基于所述分支-内部变量映射关系和所述输入字节-内部变量映射关系生成关于输入字节的优化变异策略,包括:
基于所述输入字节-内部变量映射关系得到每个内部变量对应的输入字节;
基于所述分支-内部变量映射关系中每个内部变量的判断条件,分别为对应的输入字节生成优化变异策略。
具体地,以输入字节-内部变量映射关系包括:输入字节I:分支A的内部变量X;输入字节K:分支A的内部变量X。分支-内部变量映射关系包括:分支A:内部变量X和判断条件J(X>10)为例进行说明。基于输入字节-内部变量映射关系可以得到分支A的内部变量X对应输入字节I和K,基于分支A的内部变量X的判断条件J可以分别为输入字节I和K生成优化变异策略。
根据本公开实施例,步骤S150,基于所述优化变异策略对所述源代码进行模糊测试,得到漏洞检测结果。
在一些实施例中,基于所述优化变异策略对所述源代码进行模糊测试,可以包括:
重新对所述源代码进行编译和插桩,得到经重新插桩的源代码;
基于所述优化变异策略针对所述输入变量的至少部分输入字节进行变异,得到包括变异输入字节的输入队列;
将所述输入队列的每个元素输入所述经重新插桩的源代码,检测所述目标应用程序是否崩溃,得到所述漏洞检测结果。
具体地,对于输入变量中的输入字节可以采用步骤S140中得到的对应的优化变异策略进行变异,则每个输入字节可以变异得到一个或多个变异输入字节,这些变异输入字节基于更优化的变异策略生成,能够提高漏洞检测的效率,从而克服了传统方法中变异阶段没有针对性的变异策略,使得变异效率低,导致整个漏洞检测的效率下降的缺陷。将输入队列的每个元素循环输入所述经重新插桩的源代码进行漏洞检测。
在一些实施例中,重新对所述源代码进行编译可以采用较高优化等级进行编译。进一步地,重新对所述源代码进行编译包括:对所述源代码进行最高优化等级的编译。其中较高优化等级包括:O等级,O1等级,O2等级,或O3等级。其中,最高优化等级为O3等级,采用O3等级对源代码进行变异可以以确保整个模糊测试的运行速度。
在一些实施例中,重新对所述源代码进行插桩与前述插桩方法相同,在此不再赘述。插桩的位置可以是发生判断(如选择if语句)、跳转(如goto语句、continue语句)或例程(如函数的入口和/或出口)等的位置。
在一些实施例中,如果在所述模糊测试中未检测到目标应用程序崩溃,则所述漏洞检测结果为无漏洞。
在一些实施例中,如果在所述模糊测试中检测到目标应用程序崩溃,则所述漏洞检测结果可以包括使得所述目标应用程序崩溃的元素。
其中,基于使得所述目标应用程序崩溃的元素可以对目标应用程序的源代码进行检查和修复,以提高目标应用程序的安全性和可靠性。
在一些实施例中,步骤S150还可以包括:将所述输入队列的每个元素输入所述经重新插桩的源代码,检测所述源代码的代码覆盖率是否增加。
其中,可以通过检测目标应用程序是否进入新的分支得到源代码的代码覆盖率是否增加。代码覆盖率常常被拿来作为衡量测试好坏的指标,比如,代码覆盖率需要达到一定值(如80%或90%)。如果源代码的代码覆盖率未达到要求,则可以进行多次模糊测试,直至代码覆盖率达到要求。
在一些实施例中,步骤S150中,可以基于优化变异策略进行一次或多次模糊测试。
需要说明的是,本公开实施例的方法可以由单个设备执行,例如一台计算机或服务器等。本实施例的方法也可以应用于分布式场景下,由多台设备相互配合来完成。在这种分布式场景的情况下,这多台设备中的一台设备可以只执行本公开实施例的方法中的某一个或多个步骤,这多台设备相互之间会进行交互以完成所述的方法。
需要说明的是,上述对本公开的一些实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于上述实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
基于同一发明构思,与上述任意实施例方法相对应的,本公开还提供了一种基于优化变异策略的漏洞检测装置。
参考图2,所述基于优化变异策略的漏洞检测装置,包括:
获取模块,用于获取目标应用程序的源代码;
编译和插桩模块,用于对所述源代码进行编译和插桩,得到所述源代码的结构中每个分支的内部变量和判断条件,并形成分支-内部变量映射关系;
确定模块,用于对所述目标应用程序的输入变量所包括的各输入字节进行逐字节变动,确定所述源代码中随变动的所述输入字节发生变化的所述内部变量,得到输入字节-内部变量映射关系;
策略模块,用于基于所述分支-内部变量映射关系和所述输入字节-内部变量映射关系生成关于输入字节的优化变异策略;
测试模块,用于基于所述优化变异策略对所述源代码进行模糊测试,得到漏洞检测结果。
为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本公开时可以把各模块的功能在同一个或多个软件和/或硬件中实现。
上述实施例的装置用于实现前述任一实施例中相应的基于优化变异策略的漏洞检测方法,并且具有相应的方法实施例的有益效果,在此不再赘述。
基于同一发明构思,与上述任意实施例方法相对应的,本公开还提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上任意一实施例所述的基于优化变异策略的漏洞检测方法。
图3示出了本实施例所提供的一种更为具体的电子设备硬件结构示意图,该设备可以包括:处理器310、存储器320、输入/输出接口330、通信接口340和总线350。其中处理器310、存储器320、输入/输出接口330和通信接口340通过总线350实现彼此之间在设备内部的通信连接。
处理器310可以采用通用的CPU(Central Processing Unit,中央处理器)、微处理器、应用专用集成电路(Application Specific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本说明书实施例所提供的技术方案。
存储器320可以采用ROM(Read Only Memory,只读存储器)、RAM(Random AccessMemory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器320可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器320中,并由处理器310来调用执行。
输入/输出接口330用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。
通信接口340用于连接通信模块(图中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信。
总线350包括一通路,在设备的各个组件(例如处理器310、存储器320、输入/输出接口330和通信接口340)之间传输信息。
需要说明的是,尽管上述设备仅示出了处理器310、存储器320、输入/输出接口330、通信接口340以及总线350,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本说明书实施例方案所必需的组件,而不必包含图中所示的全部组件。
上述实施例的电子设备用于实现前述任一实施例中相应的基于优化变异策略的漏洞检测方法,并且具有相应的方法实施例的有益效果,在此不再赘述。
基于同一发明构思,与上述任意实施例方法相对应的,本公开还提供了一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使所述计算机执行如上任一实施例所述的基于优化变异策略的漏洞检测方法。
本实施例的计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。
上述实施例的存储介质存储的计算机指令用于使所述计算机执行如上任一实施例所述的基于优化变异策略的漏洞检测方法,并且具有相应的方法实施例的有益效果,在此不再赘述。
所属领域的普通技术人员应当理解:以上任何实施例的讨论仅为示例性的,并非旨在暗示本公开的范围(包括权利要求)被限于这些例子;在本公开的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,步骤可以以任意顺序实现,并存在如上所述的本公开实施例的不同方面的许多其它变化,为了简明它们没有在细节中提供。
另外,为简化说明和讨论,并且为了不会使本公开实施例难以理解,在所提供的附图中可以示出或可以不示出与集成电路(IC)芯片和其它部件的公知的电源/接地连接。此外,可以以框图的形式示出装置,以便避免使本公开实施例难以理解,并且这也考虑了以下事实,即关于这些框图装置的实施方式的细节是高度取决于将要实施本公开实施例的平台的(即,这些细节应当完全处于本领域技术人员的理解范围内)。在阐述了具体细节(例如,电路)以描述本公开的示例性实施例的情况下,对本领域技术人员来说显而易见的是,可以在没有这些具体细节的情况下或者这些具体细节有变化的情况下实施本公开实施例。因此,这些描述应被认为是说明性的而不是限制性的。
尽管已经结合了本公开的具体实施例对本公开进行了描述,但是根据前面的描述,这些实施例的很多替换、修改和变型对本领域普通技术人员来说将是显而易见的。例如,其它存储器架构(例如,动态RAM(DRAM))可以使用所讨论的实施例。
本公开实施例旨在涵盖落入所附权利要求的宽泛范围之内的所有这样的替换、修改和变型。因此,凡在本公开实施例的精神和原则之内,所做的任何省略、修改、等同替换、改进等,均应包含在本公开的保护范围之内。