张国强 殷 博 邱 宇 王伟静
1(国网天津市电力公司电力科学研究院 天津 300384) 2(国网天津市电力公司 天津 300010) 3(南开大学计算机与控制工程学院 天津 300350)
缓冲区溢出指计算机对接收的输入数据没有进行有效的检测导致数据占用了合法分配空间之外的内存空间,从而使其他内存空间的数据被覆盖[1]。一旦发生缓冲区溢出会导致内存相邻位置的数据被修改、用户的重要文件被修改甚至导致系统崩溃等严重的安全问题[2]。据中国国家信息安全漏洞库统计,缓冲区溢出漏洞占其收录的漏洞的22.10%,超危漏洞中有近三分之一是缓冲区溢出漏洞。
目前用来检测程序漏洞的方法主要有静态检测技术和动态检测技术[3-4]。动态检测技术是将漏洞检测代码注入到目标文件中以发现问题,它的优点就是一般不会产生误报[5]。但是由于要真正的编译运行源程序,容易出现性能问题。静态检测技术是通过静态程序分析方法扫描目标文件源代码,以发现潜在的缓冲区溢出漏洞。通过静态检测技术进行检测速度快且能够尽早地发现漏洞,因此它目前是进行漏洞检测的主要方法[6]。然而由于静态检测技术不运行源程序,仅通过分析程序语法、结构等来检测漏洞,因此静态检测技术的准确率对程序编码的规范性、程序员的编程习惯以及静态检测方法的检测强度和适用范围等具有很强的依赖性。
由于静态检测技术的局限性,在使用漏洞检测工具检测缓冲区溢出漏洞时,存在着漏报、误报等问题,使得在使用这些漏洞检测工具时不能得到准确的检测结果,从而造成严重的软件安全问题。目前关于缓冲区溢出漏洞工具的评估研究,已有一些研究成果。北京航空航天大学的李舟军等[7]利用软件安全漏洞检测中的轻量级符号执行、自动化白盒模糊测试等实现技术开发了相关的漏洞评估和响应工具。莱顿大学的Xypolytos等[8]就漏洞检测工具评估建立了分析模型并成功用于评估漏洞检测工具。然而这些评估技术仅通过模型等定性地分析了各漏洞检测工具的适用性,对各工具在缓冲区溢出中的检测能力以及误报、漏报等未能定量地进行细粒度评估,使得它们在应用方面有所局限。并且这些评估技术仅仅针对单个工具进行纵向评估,涉及多个检测工具的评估时,无法横向评估各工具之间的性能。
本文研究了目前开源且使用范围较为广泛的Cppcheck、Splint、FlawFinder、ITS4和RatScan五种静态漏洞检测工具。提出了基于层次分析法的概率层次分析法,建立了漏洞检测工具的评估模型。应用SARD标准数据集分析缓冲区溢出漏洞的多发类型并提取其程序特征结构,根据漏洞检测工具对含有缓冲区溢出漏洞的数据集的静态检测结果,基于缓冲区溢出漏洞的特征结构、漏报率和误报率,对五种典型的缓冲区溢出漏洞检测工具进行了分析,综合评估了各漏洞检测工具在缓冲区溢出漏洞检测方面的适用性和局限性。
Cppcheck基于规则检查,用来静态检测C/C++程序中的漏洞,它只检查编译器无法检测出来的bug[9]。Cppcheck检查的bug主要有:数组写操作是否越过上下边界、内存泄漏检查、未初始化变量检查、空指针检查、安全异常检查、格式化字符串检查。
Cppcheck仅能检测出其规则中规定的缓冲区溢出漏洞,对其他类型的缓冲区溢出漏洞没有检测能力。
Splint 基于规则检查,主要用于检测 C 语言的安全漏洞。Splint可以检测出包括缓冲区溢出在内的基本的源文件漏洞,Splint工具所能检测出来的漏洞有空指针引用错误、内存管理错误、缓冲区溢出漏洞等。
和Cppcheck类似,Splint仅能检测出其规则中规定的缓冲区溢出漏洞。Splint的检测机制精确,但其精确的检测是以时间和空间效率为代价,因此Splint所占用的时间、空间资源都较高。
Flawfinder基于词法分析,是在Linux系统下使用的,其设计初期就与众多漏洞数据库关联,漏洞数据库中包含了FlawFinder能够检测出来的所有漏洞集合,如缓冲区溢出、格式化串漏洞等。
FlawFinder执行速度快,能够迅速且准确地检测到源代码中潜在的缓冲区溢出漏洞,但是它仅能检测出已存在于漏洞数据库中的漏洞,其检测能力基于漏洞数据库的完备性。
ITS4基于词法分析,既支持Linux操作系统,也支持Windows操作系统。ITS4有一个漏洞数据库,在对C/C++语言程序进行检查时,将检测的源文件解析为多个方法标记流,对不安全的方法调用进行分析并确定其危险程度,并将检查生成的方法标记与相应的漏洞数据库进行匹配,从而得到源文件中的全部错误及其详细叙述。
和FlawFinder类似,ITS4仅能检测出已存在于漏洞数据库中的漏洞,其检测能力基于漏洞数据库的完备性。
RatScan基于词法分析,用于C/C++源代码程序的静态检测[10],可以检测缓冲区溢出漏洞、数组边界错误等,并且会报告漏洞的等级信息和修改建议。RatScan界面清晰、操作方便。
RatScan的局限性与FlawFinder和ITS4类似。
层次分析法AHP(Analytic Hierarchy Process)将与评估相关的元素分解成目标、准则、方案等不同的层次,并在此基础上进行定性和定量分析[11],最终将每个评估方案的优先级与总体目标进行匹配,得出基于组合权重整体评判的一致性指标,可以对其进行分析[12]。Wang Min等[13]基于层次分析法提出模糊综合评价发进行风险评估。Kapil Singi等[14]基于层次分析法优化测试用例达到择优选取测试用例进行软件测试的目的。层次分析法在进行决策分析时具有系统性、实用性等多种优点,但本文在使用层次分析法进行缓冲区溢出漏洞工具评估过程中,发现存在着如下缺陷:
(1) 难以模拟真实数据。层次分析法在构建每个层次要素的比较判断矩阵时,标度值分别使用1、3、5、7、9等代表两元素之间的重要程度,这种粗粒度的比较难以真正模拟现实中的真实数据。在进行缓冲区溢出漏洞工具评估中,由于检测工具的复杂性和层次分析法的低精度造成评估结果具有较大的偏差。
(2) 当涉及多个检测工具的评估时,无法横向评估各工具之间的性能。层次分析法仅可以对单个漏洞检测工具进行性能评估,而难以实现多个漏洞检测工具之间的评估。这是因为层次分析法仅将评估准则进行层次划分来进行单个工具的评估,而在横向多工具的评估中并没有进行准则划分。因此,层次分析法的这一特性严重影响了在工具评估中的实际应用。
针对缓冲区溢出漏洞检测工具的评估研究,本文基于层次分析法的思想提出了概率层次分析法,概率层次分析法由如下两点改进:
(1) 使用符合实际情况的细粒度标度值。在构建判断矩阵时,不严格划分各重要程度以及各重要程度的标度值,根据实际情况对重要程度及其标度值进行赋值。即若a比b重要6.3倍,则其标度值则为6.3,实现细粒度的评估各工具。
(2) 使用概率权重评估。将每种检测工具在各评估层次中所占的概率与层次分析法得到的各层次的权重值相结合,得到每种检测工具在各层次的评估值,最后得到每种检测工具在总层次中的概率权重评估值,并依据这个概率权重评估值对多个工具进行评估。
在使用概率层次分析模型进行评估时主要步骤有下述几步。
(1) 概率层次分析模型建立因素:目的层、准则层。
(2) 构建每个层次要素的两个比较判断矩阵:判断矩阵是重要性排序的有关依据,判断矩阵中的元素aij表示因素i比因素j重要aij倍。
(3) 确定判断矩阵的特征向量、权重,并检验了判断矩阵的一致性。根据权重来计算和规格化矩阵的特征向量,以下为判断矩阵和相应特征向量的最大特征值计算方法:
① 正规化判断矩阵的每列:
(1)
② 加和正规化后的每列矩阵:
(2)
(3)
所求的特征向量即为:w=[w1,w2,…,wn]T
对一致性指标和测试系数的计算,验证了判断矩阵的一致性及其一致指标和测试系数公式,如下:
(4)
(5)
式中:RI为平均随机一致性指标,其近似值如表1所示。
表1 平均随机一致性指标
(4) 一致性测试后,确定了各层的分类权重。若测试失败,需要重新校准判断矩阵。当CR<0.1时,判断矩阵的整体一致性是较好的,CR>0.1时,需要对判断矩阵进行调整。
(5) 相同的整体水平,相对于总体目标,将各层次的相对权重进行比较并将其排序,再将排序的相对权重正确组合并计算,最后的计算结果应与层次一致性的检查结果保持一致。在此部分,需要从上到下进行抽取,从而获得最小元素,以确定优先级的相对权重和整个层次模型的相关性。
(6) 计算概率权重评估值:
定义概率权重公式如式(6)所示,定义Stool为概率权重评估值,矩阵(C1,C2,…,Ci,…,Cn)为各层次评估准则权重,(R1,…,Ri,…,Rn)T为每种检测工具在各评估层次中所占的概率。
(6)
本文中将缓冲区溢出漏洞的特征结构定义为各层次评估准则权重。漏报率(Rerror)是指使用该工具对某程序进行检测时未检测出的漏洞数占程序中实际存在的漏洞数的比率。程序用P表示,缺陷模式用M表示,算法用A表示,IP(M,A,P)表示IP的数量。则漏报率定义为:
(7)
误报率(Rdistor)是指使用该工具对某程序进行检测时检测出的但实际上并不属于漏洞的漏洞数占程序中实际存在的漏洞数的比率。与漏报率类似,程序用P表示,缺陷模式用M表示,算法用A表示,IP(M,A,P)表示IP的数量,IPN(M,A,P)表示经检查不是漏洞的IP数。则误报率定义为:
(8)
因此,将概率层次分析模型用于评估漏洞检测工具的结果表达式为:
(9)
评估架构如图1所示。架构模块主要分为四部分,分别是程序结构分析模块、工具检测及漏报率误报率计算模块、概率层次分析法分析模块、工具评估及分析模块。
图1 评估分析架构
各模块介绍如下所述:
(1) 程序特征提取模块 对数据集SARD-testsuite-100中的各程序进行分析,提取每个程序的结构特征,并分析程序中缓冲区溢出漏洞发生的位置及原因,最后根据其漏洞发生位置及引发原因对缓冲区溢出漏洞多发类型进行分类。
(2) 工具检测及漏报率误报率计算模块 分别使用Cppcheck、Splint、ITS4、FlawFinder和RatScan五种工具对数据集SARD-testsuite-100中的各程序进行检测,记录检测结果。结合各程序的结构及漏洞发生的位置、原因,提取所有能检测出的缓冲区溢出漏洞的程序,计算每个工具检测的漏报数和误报数并进一步计算漏报率和误报率。
(3) 概率层次分析法分析模块 使用概率层次分析法,通过构建概率层次分析模型、构建判断矩阵并计算权重、计算概率权重评估值。若一致性检验通过,则得到各缓冲区溢出漏洞占总体评估准则的权重,通过这权重可以得到各缓冲区溢出漏洞的严重程度、多发情况等。
(4) 工具评估及分析模块 根据(2)中的漏报率和误报率两个准则和(3)中的各缓冲区溢出漏洞的权重大小,对各工具进行评估,结合缓冲区溢出漏洞的分类分析各工具使用的适用性和局限性。
使用五个工具对SARD-testsuite-100数据集中的程序进行检测,检测结果如表2所示,记录了每个工具能检测出的漏洞总数、漏报数以及误报数。
表2 五个工具对数据集的检查结果
每种工具的误报率(Rerror)和漏报率(Rdistor)(即每种检测工具在评估层次中所占的概率)如表3所示。其中误报率和漏报率为工具评估准则是对工具性能等进行评估的一般性指标。
表3 漏报率和误报率计算结果 %
使用概率层次分析模型进行缓冲区溢出漏洞检测工具评估的步骤如下所述。
(1) 构建概率层次分析结构模型,如图2所示。
图2 概率层次分析结构模型
该概率层次结构模型为:目标层为评估准则A,又分为两个准则,分别为漏报B1和误报B2。准则层为漏报准则B1和误报准则B2,B1层和B2层结构及权重分别如图3和图4所示。
图3 漏报B1
图4 误报B2
(2) 构建细粒度判断矩阵并计算权重。评估准则A的判断矩阵及B层相对于A层权重如表4所示。其中各判断矩阵中重要程度的标度值均是根据CWE中的信息而统计的各准则重要程度实际数据。
表4 A层判断矩阵
准则层中漏报B1的判断矩阵及C层相对于B1层权重如表5所示。
表5 B1层判断矩阵
准则层中误报B2的判断矩阵及C层相对于B2层权重如表6所示。
表6 B2层判断矩阵
(3) 对细粒度判断矩阵的一致性进行检验。计算结果如下:
A:λmax=2.000 0 CR=0<0.1
B1:λmax=5.128 3 CR=0.028 6<0.1
B2:λmax=3.065 8 CR=0.063 3<0.1
计算所得数据表明,一致性检验通过。
(4) 层次总排序。排序结果如表7所示。
表7 层次总排序
(5) 计算概率权重评估值。根据表3的概率和表7的权重,使用式(9)进行计算,结果如表8所示。
表8 评估计算结果 %
通过对表9的分析,得出:(1) Cppcheck的漏报缺陷值为28.12%,远远超过其他检测工具,但其误报缺陷值为1.03%,检测误报非常低。(2) ITS4的漏报缺陷值为1.28%,漏报很低,但其误报缺陷值为17.74%,是五种工具中误报最高的。(3) 五种工具的漏报缺陷值排序为ITS4、Splint、RatScan、FlawFinder、Cppcheck,在使用检测工具时,若追求低漏报,则性能最优的检测工具为ITS4,其次为Splint。(4) 五种工具的漏报缺陷值排序为Cppcheck、FlawFinder、RatScan、Splint、ITS4,在使用检测工具时,若追求低误报,则性能最优的检测工具为Cppcheck,其次为FlawFinder。(5) 五种工具的总缺陷值排序为FlawFinder、ITS4、RatScan、Splint、Cppcheck,在考虑总体情况下选择检测工具时,检测性能最优的FlawFinder和ITS4,分别为9.00%和9.51%。
总体而言,FlawFinder和ITS4的总体检测性能最优。但是在现实应用中,若实际需求,若对代码质量要求较高,则在检测时需使用漏报最低的工具以提高代码质量。若追求代码质量和人力物理投入相平衡,则在检测时需使用漏报和误报相均衡的工具,此时RatScan是性能最优的检测工具。因此在实际进行缓冲区溢出检测时,应根据相应评估结果,选择最满足需求的漏洞检测工具。
为验证应用概率层次分析模型进行缓冲区溢出漏洞检测工具评估的结果的正确度,使用五种检测工具对SARD中多个数据集进行检测,记录检测结果并对结果进行分析,根据五种漏洞检测工具对SARD中多个数据集的批量检测结果分析,可得出:(1) 检测结果中ITS4漏报率最低且远低于其他检测工具,而Cppcheck漏报率最高且远高于其他检测工具。但Cppcheck误报率很低。与使用概率层次分析模型进行分析的结果基本一致。(2) Splint和ITS4误报率较高且误报率相近,均远超过其他工具的误报率。在概率层次分析模型的分析结果中可以看到,除Splint和ITS4误报率较高且误报率相近外,RatScan的误报率也较高。
在使用概率层次分析模型评估漏洞检测工具中,使用根据实际情况而定的细粒度标度值来表述重要程度,得到精确的漏洞检测工具的评估结果。(1) 误报和漏报在每个工具中都是普遍存在的,且漏报率相对较低的检测工具其检测率较高,因此其误报率相对较高。(2) Cppcheck对于指针间赋值、malloc()函数等动态分配的内存空间以及非定长数组等引发的缓冲区溢出均无法检测,对于只有在代码运行后才发生的缓冲区溢出漏洞无法检测。因此其漏报率较大而误报率很低。(3) Splint对所有可能引发缓冲区溢出的不安全语句均会报错,而不进行进一步的确定缓冲区溢出是否真正发生,需要人为地进行检查排除。因此其误报率较高而漏报率相对较低。(4) FlawFinder仅能检测出有限种已存在于漏洞数据库中的缓冲区溢出漏洞,并且对于指针的越界访问、数组的越界访问等不会报错,检测有较大漏报。FlawFinder一旦发现代码中存在与漏洞数据库中相匹配的语句就进行报错,而没有进一步确认,因此FlawFinder会产生误报。(5) ITS4可以解析出所有的不安全的函数调用,把它们列入漏洞行列,使工具检测的误报率较高。ITS4对于漏洞的解析依赖于已存在的漏洞数据库,因此漏洞数据库中漏洞的不全面性也会导致无法检查出某些漏洞,从而导致漏报。(6) RatScan主要检查源程序文件中隐藏的漏洞,对于能引发缓冲区溢出的不安全的库函数的使用和定长数组的定义均会报错,误报率较大。
本文所构建的概率层次分析模型定量评估的结果与批量检测的分析结果一致性较高,
且通过细粒度标度值,使用概率权重改进型评估,使概率层次分析模型进行评估的结果精确度很高。因此该模型适用于对多种漏洞检测工具的综合评估中,并且提高了评估结果的准确性和科学性。
在实际应用中,使用层次分析法进行缓冲区溢出漏洞检测工具评估时发现其有一定的局限性,因此本文在此基础上提出了概率层次分析法模型。实验中使用数据集SARD-testsuite-100,并使用概率层次分析模型对Cppcheck、Splint、ITS4、FlawFinder和RatScan五种漏洞检测工具进行了评估,综合评估了各漏洞检测工具在缓冲区溢出漏洞检测方面的适用性和局限性。实验证明,概率层次分析法在横向评估多个漏洞检测工具上具有有效性,且其评估效果较好。在进一步的工作中,会将概率层次分析法应用到其他的多种工具、系统或软件的评估中。