Fuzzing Error Handling Code using Context-Sensitive Software Fault Injection

错误处理码是很重要的,但是很难在现实中测试。因此很多难以找到的bug在错误处理码中存在,并且一旦触发会导致很严重的安全问题。已有的fuzz方法在测试错误处理码方面是有限的,因为有些错误处理码只能被偶尔的错误而不是输入触发,例如内存不足和网络连接失败。

本文提出了一个新的fuzz框架FIFUZZ,可以测试错误处理码并且检测bug。FIFUZZ的核心是一个上下文敏感的软件错误注入(SFI)方法,这种方法可以在不同的调用上下文中有效覆盖错误处理码来找到复杂上下文下错误处理码的深层bug。实现了FIFUZZ,并且在9个常用C程序上评估了,报告了由50个独特bug触发的317个报警,其中32个已经被确认。作者还比较了FIFUZZ和已有的fuzz工具,发现FIFUZZ找到了很多个被这些工具忽略的bug。

Motivation

错误处理是重要的,但是它本身是容易出错的。首先很难正确实现,因为经常包含特殊和复杂的语法。其次错误处理码很难测试,因为这些代码不经常执行并且没有受到足够重视,所以其中会有很多bug,在实际执行中也很难发现。一些DoS和信息泄露漏洞也是由于这个原因产生的。

由于错误是无法确定产生的,测试错误处理码是困难的。一种解决方案是使用SFI,可以将错误注入到程序,并测试程序运行时是否可以正确处理注入的错误。错误可以注入到某个点,称为错误点。

现有的基于SFI的方法只注入上下文不敏感的错误,很难测试到深层错误。即只根据源代码中的错误点进行错误注入,不考虑上下文。但是很多错误处理会考虑上下文,只有上下文满足一定条件时才会触发bug。

Design

本文提出了一种上下文敏感的基于SFI的fuzz方法。这种方法考虑到了运行时的上下文,引导SFI最大化bug找到率。包含6步

  1. 静态识别被测程序源代码中的错误点:用户可以选择实际上的错误点,这些错误点可能崩溃并且触发错误处理码
  2. 运行被测,收集每一个错误点调用上下文的运行时信息和代码覆盖率
  3. 根据运行时信息创建关于执行错误点的错误序列,序列中的每一个元素根据执行的错误点位置和调用上下文的信息而不同
  4. 执行程序之后,变化每一个创建的错误序列生成新的序列
  5. 执行被测并且根据变化后的错误序列注入错误
  6. 手机运行时信息,创建新的错误序列,再次变换,构成了fuzz循环

1658575009687

贡献

  • 在广泛使用的应用和被已有fuzz工具找到的漏洞上错误处理码上进行了两个研究,发现:42触发错误处理码的站点都和偶然错误有关,但是已有的fuzz工具和偶然错误相关,因此,提高fuzz工具支持测试错误处理码很重要
  • 提出了一种新的上下文敏感的基于SFI的fuzz方法,可以基于错误点的位置和调用上下文动态注入错误,以便覆盖很难触发的错误处理码
  • 基于这种方法,提出了FIFUZZ,可以有效处理错误处理码,是第一个考虑上下文的fuzz框架
  • 在9个广泛测试的最新C程序,得出了50个独特bug,其中32个被确认。还将FIFUZZ和已有的fuzz工具比较。