Page 21 - 《软件学报》2020年第10期
P. 21
高凤娟 等:基于污点分析的数组越界缺陷的静态检测方法 2997
Table 2 Warnings of Carraybound and the compared tools
表 2 Carraybound 与对比工具的警报统计
规模 CAB-simple CAB-Z3 Cppcheck Checkmarx Fortify
程序
(KLOC) W T W T W T W T W T
libco-v1.0 6.0 3 2 3 2 0 0 10 0 0 0
libfreenect-0.5.7 34.7 10 10 10 10 0 0 10 0 − 0
vips-8.7.4 167.7 49 42 47 42 0 0 100 0 5 0
coreutils-8.30 206.8 12 5 10 5 0 0 305 1 35 2
curl-7.63.0 233.7 30 16 15 15 0 0 144 4 88 3
libxml2-2.9.9 2 302.4 9 5 6 5 0 0 96 0 − 0
总计 4 772.2 113 80 92 79 0 0 617 5 128 5
注:W 表示相应工具报告的警报数目.T 表示工具报告的警报中真警报的数目.−表示该项数据不可用,因为使用 Fortify 扫描
这些程序时出错
Table 3 Time and memory consumption of Carraybound and the compared tools
表 3 Carraybound 与对比工具的时间和内存开销
规模 AST CAB-simple CAB-simple CAB-Z3 CAB-Z3 Cppcheck Checkmarx Fortify
程序
(KLOC) 文件数 时间(s) 内存(MB) 时间(s) 内存(MB) 时间(s) 时间(s) 时间(s)
libco-v1.0 6.0 6 0.2 33 0.3 44 0.8 84 22
libfreenect-0.5.7 34.7 17 0.6 55 0.8 66 14.5 828 −
vips-8.7.4 167.7 411 110 3 866 117 3874 4 633 1 364 504
coreutils-8.30 206.8 393 39 1 225 36 1234 5 646 6 001 976
curl-7.63.0 233.7 179 11 556 12 565 466 1 191 429
vim-8.1.0818 838.6 81 142 1 785 140 1797 434 1 483 −
espruino-2.01 1 141.6 97 5 336 9 349 539 1 801 3 403
libxml2-2.9.9 2 302.4 50 171 2 093 171 2105 30 12 720 108
注:−表示该项数据不可用,因为使用 Fortify 扫描这些程序时出错
Table 4 Results of checking programs with known out-of-bound CVEs and the repaired programs
表 4 对包含已知数组越界 CVE 漏洞程序和修复后程序的检查结果
CAB-Z3 Cppcheck Checkmarx Fortify
程序 CVE 修复版本 缺陷 修复 缺陷 修复 缺陷 修复 缺陷 修复
版本 版本 版本 版本 版本 版本 版本 版本
file(1)(9611f3) CVE-2017-1000249 (35c94d) Yes No No No No No No No
openjpeg-1.5.0 CVE-2012-3535 1.5.1 Yes No No No No No Yes Yes
sendmail-8.12.7 CVE-2002-1337 8.12.8 Yes No No No No No Yes No
注: (9611f3)和(35c94d)表示程序 git 的提交序号
Q1 有效性评估.我们分别统计了赋值语句简单匹配处理方法(CAB-simple)和约束求解处理方法(CAB-Z3)
的误报情况,发现前者的平均误报率为 29.2%,后者的平均误报率为 16.3%.导致约束求解匹配处理方法误报的
主要原因是我们无法处理一些库函数调用,如果在条件语句或者赋值语句中存在库函数调用并保证了数组边
界,但是我们却无法判断从而导致误报.而赋值语句简单匹配处理方法相比约束求解匹配处理方法存在更多误
报的原因是前者只简单匹配一些固定格式的语句并要求语句中特定位置为常量,很多复杂情形无法处理导致
误报;而通过约束求解我们可以增强条件判断的能力,除了能处理更多的线性约束,甚至可以处理非线性约束.
Q2 效率评估.为了评估 Carraybound 的分析效率,我们统计了如表 3 所示的程序的分析时间和内存消耗.约
束求解匹配处理方法由于调用约束求解器,总体会比赋值语句简单匹配处理方法消耗更多的时间和内存.但是
时间平均增加了 1.53%,内存平均增加了 0.86%.使用约束求解方法并未造成明显的时间和内存消耗增加.这是
因为,一方面,我们存储和复用了约束求解的结果,避免了冗余的约束求解;同时,我们针对求解 expr1→expr2 约
束进行了专门的优化,减少了对约束求解器的调用;另一方面,由于约束求解可以精确地判断程序语句是否对数
组边界进行了检查,可以尽早地移除已经被满足的数组边界检查,从而从总体上能够节约开销.如表 3 所示,我们
可以发现赋值语句简单匹配处理方法和约束求解匹配处理方法在时间和内存消耗上都随着程序规模的扩大,
呈现接近线性趋势的增长,因此我们的方法具有很好的可扩展性.