Page 24 - 《软件学报》2020年第10期
P. 24

3000                                  Journal of Software  软件学报 Vol.31, No.10, October 2020

         4.4   针对数组越界的缓冲区溢出检测
             当前有很多关于缓冲区溢出检测的工作.大多数工作在检测缓冲区溢出的同时也能检测数组越界缺陷.
             Tance [41] 提出了一种黑盒组合测试方法检测缓冲区溢出漏洞.Dinakar 等人               [42] 提出通过对内存进行细粒度
         的划分等技术来降低 C/C++程序动态数组越界检查的运行开销.如 Loginov                    [43] 和 rtcc [44] 等基于插桩的方法能在
         运行时检测是否出现缓冲区溢出.但是这些方法会引入额外的运行时开销,从而降低测试的效率.例如,Loginov
         工具的额外开销高达 900%.SafeC       [45] 、Cyclone [46] 和 DangDone [47] 使用扩展的指针表示,这些扩展包含每个指针
         值的合法目标对象的对象基础信息和大小.使用这些指针要对程序进行大量修改以使用外部库,这些外部库函
         数通常是被包装好的用于转换指针的方法.此外,编写这样的封装对于间接函数调用以及访问全局变量或存储
         器中其他指针的函数来说可能是难以实现的.
                                                                      [2]
             预防技术是一种用于防止数组下标越界被利用的方法.例如,StackGuard 可能在检测到堆栈上的返回地
         址被覆盖后终止进程.运行时预防的现有方法具有显著的运行时开销.除此之外,这些方法在可能有漏洞的程序
         部署完成后生效.CFI      [48] 检查程序的控制流程是否在执行期间被劫持.这与我们的工作形成对比,我们的工作目
         的是在部署之前发现程序中的数组越界缺陷.
         4.5   针对数组越界的模糊测试
             模糊(fuzzing)测试是安全测试中使用最为广泛的黑盒测试方法之一.该方法在检测数组越界或缓冲区溢出
         问题中也发挥着重要作用          [49−57] .它主要通过程序崩溃检测数组越界缺陷.模糊测试通常从一个或多个合法输入
         开始,然后随机改变这些输入以获得新的测试输入.高级模糊测试技术                        [50] 是基于生成的模糊测试技术,它为了解
         决具有复杂输入结构的程序的输入生成问题,通过基于语法的输入归约定义有效输入.Godefroid 等人                              [51] 提出了
         一种替代的白盒模糊测试方法,结合符号执行和动态测试生成.虽然模糊测试可以检测到数组越界错误,但一个
         主要限制是代码覆盖率低.此外,一些数组越界的错误可能只读取越界的区域,因此不会导致崩溃,这样,模糊测
         试中的监视器可能无法检测到这种情况               [52] .我们的方法基于静态方法,可以实现高代码覆盖,并且可以检测不同
         类型的数组下标越界.
         5    结论和未来工作

             本文提出了一种基于污点分析的数组越界缺陷的静态检测方法,并实现了一个可以在 Windows 和 Linux
         操作系统上运行的自动化静态分析工具——Carraybound.如果程序中存在数组越界缺陷,我们将报告相应的数
         组位置和待添加的数组边界条件.我们通过扫描一些真实程序的源代码来评估 Carraybound 工具.实验数据表
         明,Carraybound 可以快速报告在程序中没有进行数组边界检查的数组下标,在使用约束求解方法时,误报率大
         约为 16.3%.尽管 Carraybound 有一些误报和漏报,但它可以有效地减少程序员人工审查工作.我们的方法可以提
         供待增加的数组边界检查条件和位置,可以帮助程序员更加方便、快速地定位和确认所报告的数组越界警报,
         也可以作为修复推荐建议提供给程序员来参考.
             目前,Carraybound 由于库函数等原因,可能导致误报,对于库函数有源码的情况,可以考虑通过函数摘要等
         技术完成更高精度的数组越界缺陷检测,对于库函数无源码的情况,可以考虑结合动态测试的方法来检测;另一
         方面,数组越界缺陷是一类特殊的缓冲区溢出缺陷,我们可以考虑扩展到对缓冲区溢出缺陷的检测,对于常见的
         缓冲区溢出相关 API,如 strcpy、memcpy,可以通过定义总结其溢出条件,建立缓冲区溢出模型,再利用数据流分
         析检测程序中是否有相应的越界检查语句,从而检测缓冲区溢出缺陷.

         References:
          [1]    CWE. Improper validation of array index. https://cwe.mitre.org/data/definitions/129.html
          [2]    Cowan C, Pu C, Maier D, Walpole J, Bakke P, Beattie S, Grier A, Wagle P, Zhang Q, Hinton H. Stackguard: Automatic adaptive
             detection and prevention of buffer-overflow attacks. In: Proc. of the USENIX Security Symp. 1998,98:63–78.
          [3]    CVE. http://www.cvedetails.com/vulnerabilities-by-types.php
   19   20   21   22   23   24   25   26   27   28   29