一种对计算机漏洞库进行改进的方法转让专利

申请号 : CN202010326021.8

文献号 : CN111428247B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 耿思嘉茅兵

申请人 : 南京大学

摘要 :

本发明提供了一种对计算机漏洞库进行改进的方法,包括:(1)对样本漏洞程序使用GCC编译器的GCOV编译选项进行插桩并进行重现,获取程序的执行路径;(2)使用Cloc和Lizard工具获取漏洞程序的代码行数和圈复杂度;(3)通过以上获得的数据,对比计算机漏洞库LAVA‑M与样本漏洞程序的区别与联系;(4)从控制流和数据流两个方面对现有的计算机漏洞库(LAVA‑M)进行改进,使之更加趋近于样本;本发明对计算机漏洞库与样本的漏洞进行大规模对比研究,对现有计算机漏洞库的不足进行改进,使之作为基准测试程序可以更全面地评估漏洞检测工具的各项性能。

权利要求 :

1.一种对计算机漏洞库进行改进的方法,其特征在于,包括如下步骤:

步骤1,选择国家安全漏洞库NVD中的内存错误漏洞作为样本漏洞,样本漏洞组成样本漏洞数据集,获取样本漏洞程序的源代码与触发漏洞的输入,安装相应版本的操作系统和软件,对样本漏洞程序重新进行动态插桩编译,获得代码执行的覆盖率及具体执行的代码,提取关于样本漏洞本身的特征,样本漏洞本身的特征是指程序执行路径上的控制流约束特征与数据流约束特征;

步骤2,对样本漏洞程序和计算机漏洞库LAVA‑M使用Cloc和Lizard工具,剔除其中无用信息,提取关于程序本身的特征,程序本身的特征是指样本漏洞程序的代码行数和圈复杂度的数据;

步骤3,基于样本漏洞本身的特征和程序本身的特征对比目标漏洞库与样本漏洞程序的区别与联系,所述目标漏洞库为计算机漏洞库LAVA‑M;

步骤4,依据步骤1得到的样本漏洞在数据流和控制流上面的特征对计算机漏洞库LAVA‑M进行改进;

步骤1中,在公开的已知漏洞中,选择内存错误漏洞作为样本漏洞,样本漏洞组成样本漏洞数据集,且样本漏洞数据集中漏洞类型的比例与CVE披露的总体比例一致;

对样本漏洞数据集进行处理,处理过程具体为:通过CVE网站上的内容以及其给出的外部链接收集与样本漏洞相关的报告和信息来源;确定易受攻击软件的目标版本,找到相应的源代码,并为易受攻击软件配置对应版本的操作系统,默认操作系统是Linux系统;按照收集的报告或软件规范中给出的编译和配置选项的说明来编译和安装易受攻击的软件,在编译时,使用GCC中的GCOV编译选项对其进行动态插桩编译,获得程序的覆盖率及具体执行的代码行;

使用漏洞报告中提供的崩溃证明作为输入来触发并验证漏洞类型和出错信息;

提取程序执行路径上的控制流约束特征与数据流约束特征;控制流约束特征是指条件约束中魔法字节magic byte的类型,数据流约束特征是指程序执行路径上对于输入是否存在数据流转换data transformation;

步骤1中,在控制流约束特征方面,通过使用GCOV重新编译获得的程序路径上具体执行的代码,记录各个条件约束中魔法字节magic byte的类型信息和符号信息,类型信息包括char,string,float,int16,int32,int64,符号信息包括有符号和无符号,将所述类型信息与符号信息的不同种类分别记录下来,并获取每种类型在相应程序中的百分比;

在数据流约束特征方面,通过二进制分析工具Valgrind将源代码信息包括的二进制代码转换成VEX中间代码,并且在转换的过程中,记录步骤1中所述漏洞报告里面的能够触发漏洞的输入中的所有字节到最终崩溃点这条传播路径上发生的数据类型的转换,对内容的写指令及算数运算所对应的指令,根据提取的信息,判断与输入相关的算术运算的类型,所述类型包括加、减、乘、除和移位,然后记录加、减、乘、除和移位的总和占全部指令的比例,统计样本漏洞数据集与计算机漏洞库数据集中输入进行了数据转换的漏洞数在相应数据集中占的百分比,记为N;

步骤1中,将获得的程序执行路径上得到的所有状态特征构成集合G,将提取到的所有控制流约束特征记为C,数据流约束特征记为D,控制流约束特征中的魔法字节magic byte的类型和百分比集合用mb表示,数据流约束中的数据转换形式及百分比用dt表示,状态特征集合表示为G=(C,D),以程序开始为出发点,此时 执行路径上的每一条语句记为s,则C=mb∪{s},D=dt∪{s},一直到程序崩溃为止;

步骤2中,对样本漏洞程序和计算机漏洞库的程序分别执行如下操作:用Cloc工具分析得到程序的代码行数,使用Lizard工具获取程序的圈复杂度,根据获得的代码行数,对其求平均值;

样本漏洞程序的代码行数平均值记为L1,样本漏洞程序的圈复杂度的中位数记为CCN1;

计算机漏洞库的程序的代码行数平均值记为L2,样本漏洞程序的圈复杂度的中位数记为CCN2;

步骤3包括:对步骤1得到的关于样本漏洞本身的相关特征,基于控制流约束特征和数据流约束特征,分别对比样本漏洞与计算机漏洞库:包括魔法字节magic byte的类型及百分比,数据的转换形式;

对于步骤2得到的关于样本漏洞程序本身的特征,比较程序的圈复杂度的中位数的值和代码行数的平均数的值,分别对比样本漏洞与计算机漏洞库的区别;

步骤4中,根据步骤1得到的关于样本漏洞本身的相关特征和步骤2得到的关于样本漏洞程序本身的特征,从控制流约束特征和数据流约束特征两个方面对现有的计算机漏洞库进行改进,具体改进方法为:步骤4‑1,增加程序执行路径上控制流约束特征的条件判断的难度,把计算机漏洞库条件约束中的魔法字节magic byte的类型由原来的仅32‑bit类型改成步骤1获取的样本中魔法字节magic byte类型,且每种类型的比例符合样本的百分比;

步骤4‑2,增加程序执行路径上数据流的特征,由原来的输入没有数据流转换的形式增加数据流转换的形式,且发生数据流转换的百分比符合步骤1中获取的百分比N;

步骤4‑3,综合步骤4‑1和步骤4‑2的方法,对数据流和控制流的特征进行改进;最后,用漏洞检测工具分别检测改进的漏洞库与原有的漏洞库程序,通过观察前后检测到的漏洞数目,程序覆盖率,发现漏洞的时间,对比改进后的区别;

步骤4‑4,将现有的计算机漏洞库的程序替换为和样本漏洞程序的代码行数和圈复杂度较为接近的程序,使替换后的程序的代码行数的平均值与L1误差不高于1%,使替换后的程序的圈复杂度的中位数与CCN1误差不高于1%。

说明书 :

一种对计算机漏洞库进行改进的方法

技术领域

[0001] 本发明属于计算机技术领域,尤其涉及一种对计算机漏洞库进行改进的方法。

背景技术

[0002] 为了有效地检测漏洞,近年来众多科研工作者们提出了不同漏洞检测技术,可以分为两类——动态分析技术和静态分析技术。由于静态分析不需要执行目标程序导致其结果经常为假阳性,动态分析由于真正执行目标程序所以其结果更加精确,在漏洞检测上具有更广泛的应用性。其中模糊测试技术(fuzz testing),已被广泛研究并应用到工业界与学术界中。
[0003] 作为一种软件测试技术,模糊测试可以分为黑盒,灰盒和白盒模糊测试。黑盒模糊测试对目标程序的内部机制一无所知,只是随机和盲目地生成新的测试输入,因此具有较低的有效性。白盒测试以牺牲可伸缩性为代价从而具有较高的有效性但无法处理大型程序。灰盒测试通过保持两个属性的平衡来兼顾有效性和可伸缩性,近年来受到越来越多的关注,目前应用最为广泛的灰盒模糊测试是American Fuzzy Lop(AFL)。
[0004] 随着模糊测试工具的全方面发展,对于fuzzer功能的普遍性测试是:通过观察fuzzer在一组基准测试程序(benchmark)上表现出来的结果来评判其性能的优劣。很多研究人员在不同的工作上提出各种各样的基准程序,这些程序总体上可以分为两类:真实程序(漏洞)和人工程序(漏洞)。其中样本程序所包含的漏洞在衡量漏洞检测工具有效性上有许多不足:比如不可把控;随着漏洞检测工具性能的提高,单个基准测试程序的价值都会随着时间下降;真实程序包含的漏洞较为分散等。
[0005] 因此,为了衡量漏洞检测工具的性能以及其局限性,研究人员一直致力于开发包含软件漏洞的人工基准程序(artificial benchmark,计算机漏洞库)。人们通过向现有程序中注入漏洞(LAVA‑M,Rode0day)或精心设计人为的易受攻击程序(CGC)来实现此类计算机漏洞库。与真实漏洞程序相比,计算机漏洞库具有以下优点:可以提供大量已知的确定存在的漏洞(ground truth);可以综合不同类型漏洞程序的多样性。
[0006] 尽管计算机漏洞库具有上述优点,但是同时也面临着棘手的问题:这些基准测试程序,无论是计算机漏洞库还是样本的漏洞,都是为了衡量漏洞检测工具的有效性。某些漏洞检测工具在计算机漏洞库上表现良好,但它们在检测真实漏洞上性能可能不佳。例如,Wang发现对于LAVA‑M(一种计算机漏洞库),Angora(基于AFL改进的模糊测试工具)几乎可以检测到它的所有漏洞,AFL只能检测出来部分漏洞。但是对于同样的一些样本的漏洞,在总计8次每次24小时的实验中,AFL可以发现比Angora多62%的漏洞(例如CVE‑2017‑6966,CVE‑2018‑11416,CVE 2017‑13741)。因此,研究人员对于是否能够采用计算机漏洞库来评价漏洞检测工具的有效性而犹豫不决。然而,现有的工作缺乏对计算机漏洞库能否充分代表真实漏洞的特征的对比和分析,如果不能充分了解计算机漏洞库和真实漏洞的区别和联系,盲目使用计算机漏洞库对漏洞检测工具进行评估是不可靠的,甚至会对结果的准确性产生误导。

发明内容

[0007] 发明目的:本发明所要解决的技术问题是针对现有技术的不足,提供一种对计算机漏洞库进行改进的方法,解决现有计算机漏洞库与样本的漏洞程序特征不相符,作为基准测试程序不能很好地衡量漏洞检测工具的各类性能的问题。本发明具体包括以下步骤:
[0008] 步骤1,选择国家安全漏洞库NVD中的内存错误漏洞作为样本漏洞,样本漏洞组成样本漏洞数据集,这里指的样本漏洞就是国家安全漏洞库NVD中的漏洞,本发明要进行改进的是目标漏洞库,目标漏洞库中包含的是人为构造的漏洞,比如往真实程序中插入一些bug,这些bug不是现实存在的,具有很大的人为性;获取样本漏洞程序的源代码与触发漏洞的输入,安装相应版本的操作系统和软件,对样本漏洞程序重新进行动态插桩编译,获得代码执行的覆盖率及具体执行的代码,提取关于样本漏洞本身的特征,即程序执行路径上的控制流约束特征与数据流约束特征;
[0009] 步骤2,对样本漏洞程序和计算机漏洞库LAVA‑M使用Cloc和Lizard工具,剔除其中无用信息,提取关于程序本身的特征,程序本身的特征即样本漏洞程序的代码行数和圈复杂度的数据;
[0010] 步骤3,基于样本漏洞本身的特征和程序本身的特征对比目标漏洞库与样本漏洞程序的区别与联系,所述目标漏洞库为计算机漏洞库LAVA‑M;
[0011] 步骤4,依据步骤1得到的样本漏洞在数据流和控制流上面的特征对计算机漏洞库LAVA‑M进行改进。
[0012] 进一步:
[0013] 步骤1中,在公开的已知漏洞库NVD中,从2004年到2018年,以三年为一个阶段,平均地选择九种内存错误漏洞作为样本漏洞,分别为stack overflow(栈溢出),heap overflow(堆溢出),integer overflow(整形溢出),null pointer dereference(空指针解引用),format string(格式化字符串),use after free(释放后重利用),invalid access(无效访问),invalid free(无效释放),uninitialized memory(未初始化内存)九种;样本漏洞组成样本漏洞数据集,且样本漏洞数据集中漏洞类型的比例与CVE披露的总体比例一致;
[0014] 对样本漏洞数据集进行处理,处理过程具体为通过CVE网站上的内容以及其给出的外部链接收集与样本漏洞相关的报告和信息来源,如ExploitDB;确定易受攻击软件的目标版本,找到相应的源代码(或二进制代码),并为易受攻击软件配置对应版本的操作系统,默认操作系统是Linux系统,少数系统为Centos;按照收集的报告或软件规范中给出的编译和配置选项的说明来编译和安装易受攻击的软件,在编译时,使用GCC中的GCOV编译选项对其进行动态插桩编译,获得程序的覆盖率及具体执行的代码行,报告里面会缺少一些必要的依赖库导致编译失败,因此还需要手动为易受攻击的软件正确安装所需的各种依赖库;使用漏洞报告中提供的崩溃证明(PoC)作为输入来触发并验证漏洞类型和出错信息;提取程序执行路径上的控制流约束特征与数据流约束特征;控制流约束特征是指条件约束中魔法字节magic byte的类型,数据流约束特征是指程序执行路径上对于输入是否存在数据流转换data transformation。
[0015] 步骤1中,在控制流约束特征方面,通过使用GCOV重新编译获得的程序路径上具体执行的代码,记录各个条件约束中魔法字节magic byte的类型信息和符号信息,类型信息包括char,string,float,int16,int32,int64,符号信息包括有符号和无符号,将所述类型信息与符号信息的不同种类分别记录下来,并获取每种类型在相应程序中的百分比;
[0016] 在数据流约束特征方面,通过二进制分析工具Valgrind将源代码信息包括的二进制代码转换成VEX中间代码,并且在转换的过程中,记录步骤1中所述漏洞报告里面的能够触发漏洞的输入中的所有字节到最终崩溃点这条传播路径上发生的数据类型的转换,对内容的写指令及算数运算所对应的指令,根据提取的信息,判断与输入相关的算术运算的类型,所述类型包括加、减、乘、除和移位,然后记录加、减、乘、除和移位的总和占全部指令的比例,即统计样本漏洞数据集与计算机漏洞库数据集中输入进行了数据转换的漏洞数在相应数据集中占的百分比,记为N。
[0017] 通过自动化脚本收集各个条件约束(主要是条件判断语句if,switch以及循环语句while,for)中魔法字节magic byte的类型,提取各个条件约束中魔法字节类型的方法如下:设定数组str为用户的输入,str[i]为输入中的某个字节,如果在程序执行路径中存在这样的语句:if(strcmp(str,magic byte)==0),if(str[i]==magic byte),或者存在如下代码段:
[0018] switch(str[i]){
[0019] case magic byte:语句1
[0020] case magic byte:语句2
[0021] …
[0022] }
[0023] 则收集该语句中魔法字节magic byte类型,从而得到样本中魔法字节magic byte类型,并获取每种类型在相应程序中的百分比,然后对比样本的漏洞程序与计算机漏洞库两者魔法字节magic byte的区别;在数据流约束特征方面,通过静态染色分析技术,提取从输入到程序崩溃点这条路径上的数据转换形式,即提取从输入到程序崩溃点这条路径上存在str=str+a,str=str‑a,str=str*a,str=str/a运算,或者<<,>>,hash运算的形式,[0024] 然后对比计算机漏洞库与真实漏洞程序各自执行路径中的数据转换特征,并使用脚本统计样本的漏洞数据集与计算机漏洞库数据集中输入进行了数据转换的漏洞数在相应数据集中占的百分比,记为N。
[0025] 步骤1中,将获得的程序执行路径上得到的所有状态特征构成集合G,将提取到的所有控制流约束特征记为C,数据流约束特征记为D,控制流约束特征中的魔法字节magic byte的类型和百分比集合用mb表示,数据流约束中的数据转换形式及百分比用dt表示,状态特征集合表示为G=(C,D),以程序开始为出发点,此时 执行路径上的每一条语句记为s,则C=mb∪{s},D=dt∪{s},一直到程序崩溃为止。
[0026] 步骤2中,为了对比样本漏洞程序与现有的计算机漏洞库中程序的区别,除了漏洞本身的特征之外,还需要对比包含漏洞的程序本身的特征;对样本漏洞程序和计算机漏洞库用Cloc和Lizard工具获取关于程序本身的特征,程序本身的特征包括代码行数和圈复杂度,对程序本身的特征进行处理,并在获取代码行数时剔除空白、注释、括号以及成员、类型和命名空间的声明等无用信息,获得代码行数的平均数以及圈复杂度的中位数,并绘制成盒状图,对两者进行对比分析区别与联系。
[0027] 步骤2中,除了漏洞本身的特征之外,还需要对比包含漏洞的程序本身的特征,对样本漏洞程序和计算机漏洞库的程序分别执行如下操作:用Cloc工具分析得到程序的代码行数,使用Lizard工具获取程序的圈复杂度,根据获得的代码行数,对其求平均值;
[0028] 样本漏洞程序的代码行数平均值记为L1,样本漏洞程序的圈复杂度的中位数记为CCN1;
[0029] 计算机漏洞库的程序的代码行数平均值记为L2,样本漏洞程序的圈复杂度的中位数记为CCN2。
[0030] 对于计算机漏洞库的LAVA‑M数据集,包含的软件程序有base64,uniq,who,md5sum四种软件程序;对于样本的漏洞程序,包含80个CVE,其中包括40种软件程序。这些软件包括完成某些特定功能的库文件,如libYAML等,还包括一些具有服务器功能的软件,如roftpd等,还包括一些编程语言,如php等。本文统计这些程序的代码行数和圈复杂度。普遍来说,代码行数越少,程序越小的程序中,隐藏的漏洞可能深度也较浅,并且更容易被漏洞检测工具检测到。圈复杂度大说明程序代码的判断逻辑复杂,程序的可能错误和高的圈复杂度有着很大关系圈复杂度。
[0031] 步骤3包括:对步骤1得到的关于样本漏洞本身的相关特征,基于控制流约束特征和数据流约束特征,分别对比样本漏洞与计算机漏洞库:包括魔法字节magic byte的类型及百分比,数据的转换形式(算术运算、移位运算、哈希运算);
[0032] 对于步骤2得到的关于样本漏洞程序本身的特征,比较程序的圈复杂度的中位数的值和代码行数的平均数的值,分别对比样本漏洞与计算机漏洞库的区别。对于计算机漏洞库LAVA‑M的平均代码行数为3093行,而对于样本漏洞库来说,平均代码行数为178971行,比LAVA‑M的代码行数多58倍。由人工漏洞库的程序与真实世界中的程序的代码行数的巨大差异可以看出,人工漏洞库程序的代码行数远小于真实世界中程序的代码行数。对于计算机漏洞库中LAVA‑M的圈复杂度的值为8.6,样本漏洞程序的圈复杂度为8.1,由此可以得出,计算机漏洞库的程序特征并不符合样本漏洞库。除此之外,程序本身的特点还对漏洞的存在造成一定程度的影响。因为由经验可知,往往程序包含的代码行数越少,漏洞在程序中隐藏的深度可能更浅,与那些代码行数较多,规模较大的程序相比,这些隐藏深度较浅的漏洞更容易被漏洞检测工具检测到,因此可能无法较好地衡量漏洞检测工具是否可以检测到隐藏更深的漏洞。所以,计算机漏洞库作为基准测试集,可能无法公平公正地衡量漏洞检测工具的性能。
[0033] 步骤4中,根据步骤1得到的关于样本漏洞本身的相关特征和步骤2得到的关于样本漏洞程序本身的特征,从控制流约束特征和数据流约束特征两个方面对现有的计算机漏洞库(即LAVA‑M数据集)进行改进,具体改进方法为:
[0034] 步骤4‑1,增加程序执行路径上控制流约束特征的条件判断的难度,即把计算机漏洞库条件约束中的魔法字节magic byte的类型由原来的仅32‑bit类型改成步骤1获取的样本中魔法字节magic byte类型,且每种类型的比例符合样本的百分比,即原有全部为int32类型的魔法字节改变为char(60%)+string(30%)+int32(10%)的比例;
[0035] 步骤4‑2,增加程序执行路径上数据流的特征,即由原来的输入没有数据流转换的形式增加数据流转换的形式,即((((str^a)&b)<
[0036] 步骤4‑3,综合步骤4‑1和步骤4‑2的方法,对数据流和控制流的特征进行改进;最后,用漏洞检测工具AFL分别检测改进的漏洞库与原有的漏洞库程序,通过观察前后检测到的漏洞数目,程序覆盖率,发现漏洞的时间,对比改进后的区别;
[0037] 步骤4‑4,将现有的计算机漏洞库的程序替换为和样本漏洞程序的代码行数和圈复杂度较为接近的程序,即使替换后的程序的代码行数的平均值与L1误差不高于1%,使替换后的程序的圈复杂度的中位数与CCN1误差不高于1%。
[0038] 本发明方法首先对样本漏洞程序使用GCC编译器的GCOV编译选项进行插桩并进行重现,获取程序的执行路径;然后使用Cloc和Lizard工具获取漏洞程序本身的特征;再通过以上获得的数据,对比三种主流的计算机漏洞库(LAVA‑M,CGC,Rode0day)与样本漏洞程序的区别与联系;最后从控制流和数据流两个方面对现有的计算机漏洞库(LAVA‑M)进行改进,使之更加趋近于样本,并用漏洞检测工具进行实验评估;从而达到改进现有计算机漏洞库的目的,使之作为基准测试程序可以更全面地评估漏洞检测工具的各项性能。
[0039] 通过采用以上技术方案,本发明具有以下优点:
[0040] 1、覆盖率广泛:本发明通过大量人工实验对计算机漏洞库和真实世界的漏洞进行全面分析,数据集涵盖了587个人工漏洞和80个真实漏洞(CVE)。
[0041] 2、通用性强:本文针对真实世界中危害性高,分布广泛的内存错误漏洞进行分析,分析方法可以通用到其他任何类型的漏洞。
[0042] 3、应用性强:本发明的改进方法兼容了多种程序,不依赖任何编程语言,可应用在绝大多数程序上。

附图说明

[0043] 下面结合附图和具体实施方式对本发明做更进一步的具体说明,本发明的上述和/或其他方面的优点将会变得更加清楚。
[0044] 图1为本发明中样本漏洞与计算机漏洞程序的不同对比特征示意图。
[0045] 图2为本发明方法的设计原理图。
[0046] 图3为图2中漏洞重现部分的流程图。

具体实施方式

[0047] 如图1、图2、图3所示,本发明提供了一种对计算机漏洞库进行改进的方法,本发明方法首先对挑选出来的真实世界中80个漏洞程序(即样本漏洞)使用GCC编译器的GCOV编译选项进行插桩并进行重现,获取程序的执行路径;然后使用Cloc和Lizard工具获取漏洞程序的代码行数和圈复杂度;通过以上获得的数据,接着对比三种主流的计算机漏洞库(LAVA‑M,CGC,Rode0day)与样本漏洞程序的区别与联系;最后从控制流和数据流两个方面对现有的计算机漏洞库(LAVA‑M)进行改进,使之更加趋近于真实世界。
[0048] 第一步:为了收集执行路径上的控制流约束和数据流约束,需要深入了解漏洞程序是如何从输入开始一步步执行并最终触发崩溃的,因此,需要获得漏洞程序在某个PoC上的动态执行轨迹。为此,本文提出基于GCC编译器的辅助漏洞分析框架,即使用{\tt gcov}编译选项重新编译这些程序,可以得到在某个程序的执行路径上,源代码中的哪些代码被真正被执行,每行代码执行的次数以及每一段代码的执行时间。然后,对于漏洞重现部分,一共分为四个阶段:报告收集阶段,环境配置阶段,软件准备阶段,漏洞重现四个阶段。需要说明的是,计算机漏洞库,LAVA‑M,Rode0day,DARPA CGC本身已经包含能够使程序触发的poc和易受攻击的软件版本,因此漏洞重现流程较为简单,只需安装对应的实验环境然后进行重现。而对于样本漏洞,其漏洞类型和发生原因以及触发所需要的各种命令各不相同,因此更需要抽象概括成一个具体且通用的实验流程,所以上述流程主要针对样本漏洞重现问题。在将漏洞程序进行编译和重现之后,最后通过手动用GDB调试程序,对程序的执行路径进行分析之后得到控制流和数据流的约束。
[0049] 第二步:在Linux系统上用如下命令安装Cloc:sudo apt‑get install cloc,然后根据漏洞报告里面提及的易受攻击的软件版本下载好相应版本的软件程序包到本地,在此目录下,直接运行cloc即可获得该目标文件夹内程序的代码行数。对于数据集中的计算机漏洞库中各个程序的代码行数,总共统计了LAVA‑M中4种程序,Rode0day中9种程序,DARPA CGC中93种程序。对于样本漏洞的程序,一共统计了40种不同程序的代码行数,并最终对每个单独的数据集的代码行数求平均值,以缩小误差。然后,用Lizard获取程序的圈复杂度。通过pip install lizard命令来安装Lizard。同样,根据漏洞报告里面提及的易受攻击的软件版本下载好相应版本的软件程序包到本地,然后进入该目标文件夹下,运行lizard命令,即可获得该目录下所有的文件的圈复杂度。
[0050] 第三步,通过第一步和第二步获得的数据,可以得出计算机漏洞库与样本漏洞区别很大:对于代码行数,计算机漏洞库程序的代码行数远小于样本漏洞中程序的代码行数,尤其是对于DARPA CGC,相差倍数达到几百倍。对于圈复杂度,计算机漏洞库中LAVA‑M和Rode0day与样本漏洞的程序较为接近,但DARPA CGC是完全由专家手工写的程序,圈复杂度比样本漏洞中的程序小很多,因此可能程序的逻辑比样本漏洞的程序更为简单。与那些代码行数较多,程序逻辑较为复杂的程序相比,这些隐藏深度较浅的漏洞更容易被漏洞检测工具检测到,因此可能无法较好地衡量漏洞检测工具是否可以检测到隐藏更深的漏洞。所以,计算机漏洞库作为基准测试集,可能无法公平公正的衡量漏洞检测工具的性能。对于程序的控制流方面,计算机漏洞库中的LAVA‑M和Rode0day两种数据集,其程序执行路径上条件约束中magic byte的类型和比例与样本漏洞相比相差较远,而magic byte的类型以及字节数目影响着漏洞检测工具求解该约束的难度,因此在该方面,LAVA‑M和Rode0day不能代表样本漏洞的程序来公平公正地评估漏洞检测工具解决路径约束的能力。另一方面,由于DARPA CGC是由专家编写的,所以该程序内的magic byte的类型的设计可以更加灵活,而且看起来更真实。对于数据流方面,LAVA‑M和Rode0day程序执行路径上的数据流转换与样本漏洞相比差距较大,虽然DARPA CGC在路径上做了一些数据转换操作,但是和样本漏洞的程序之间仍然存在着差距。
[0051] 第四步,基于步骤(3)发现的样本漏洞的特征,本发明从控制流和数据流两个方面改进计算机漏洞库使它更加趋近于现实:1)由样本漏洞的执行路径上条件约束中magic byte的类型及比例,来修改人工漏洞数据集中的特征。具体来说,即将计算机漏洞库条件约束中magic byte的类型由原来的仅仅int32类型扩展为char,string,int32类型,并使magic byte每种类型的比例与样本漏洞中相对一致。2)依据样本漏洞的执行路径上漏洞触发条件中数据流的特征,在计算机漏洞库的漏洞执行路径上,即输入与magic byte进行比较之前,对输入数据进行数据转换(data transformation)相关操作,具体转换有算数四则运算与移位运算。3)综合第一点和第二点,同时在计算机漏洞库中改变漏洞的执行路径上条件约束中的magic byte的类型及比例和对输入数据加入数据流转换相关操作。将计算机漏洞库按照上述方法进行改进之后,获得了3个不同改进版本的人工漏洞程序,并分别在这些改进后的程序和原始程序上运行漏洞检测工具AFL,每个实验重复进行5次,每次持续5小时以降低模糊测试的随机性,观察检测到漏洞的时间、数目及变化情况。所有实验进行完毕之后,收集在实验中被AFL检测到的漏洞数目来评估改进的效果。发现改进之后的计算机漏洞库与原始版本的计算机漏洞库在评估漏洞检测工具的结果上有很大的不同。
[0052] 综上,本发明可以有效改进现有计算机漏洞库不符合样本漏洞的情况,并更加趋近于样本漏洞的各种特征,作为基准测试程序,可以更加公平公正地衡量漏洞检测工具的各种性能。
[0053] 本发明提供了一种对计算机漏洞库进行改进的方法,具体实现该技术方案的方法和途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技术加以实现。