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 所示,我们
         可以发现赋值语句简单匹配处理方法和约束求解匹配处理方法在时间和内存消耗上都随着程序规模的扩大,
         呈现接近线性趋势的增长,因此我们的方法具有很好的可扩展性.
   16   17   18   19   20   21   22   23   24   25   26