中文译名:使用上下文敏感软件故障注入模糊化错误处理代码
作者:蒋mingzhu
单位:清华大学
国家: #中国
年份: #2020年
来源: #USENIX会议
关键字: #fuzzing #故障注入
代码地址:
笔记建立时间: 2023-06-29 10:36
这篇文章的作者和 [[Fuzzing Error Handling Code in Device Drivers Based on Software Fault Injection]] 一样,是进一步的后续工作。

Abstract

  • FIFUZZ的核心是上下文敏感的软件故障注入 (SFI)方法,该方法可以有效覆盖不同调用上下文中的错误处理代码,从而发现隐藏在复杂上下文中的错误处理代码中的深层错误。

Background

现有的基于sfi的方法存在一个关键的限制: 据我们所知,它们只执行上下文(执行路径)不敏感的故障注入,这通常会阻止测试的深入。可能某些错误会在特定的调用上下文中才会被触发。 举例 image.png 函数P存在double free漏洞,但是如果是上下文不敏感的故障注入,在函数P的错误处理代码(if)中注入故障,每次执行到函数A程序就会触发故障而不会到达函数B,也就不会触发double free错误,如果进行上下文敏感的故障注入,只有在函数B调用函数P的时候引入故障,那么就可以触发double free错误。

方法

Error Sequence Model

在 [[Fuzzing Error Handling Code in Device Drivers Based on Software Fault Injection]] 的error site序列($ErrSeq = [ErrPt1, ErrPt2, …, ErrPtx], ErrPti = {0, 1}$)的基础上,作者增加了执行错误站点时的运行的调用堆栈作为上下文 $ErrPt =< ErrLoc,CallCtx >$ $CallCtx$ 就是上下文 $CallCtx = [CallIn f o1,CallIn f o2, …,CallIn f ox]$ $CallIn f o =< CallLoc, FuncLoc >$ callloc应该是该函数的位置,funcloc是该函数调用的函数的位置(应该是这样吧) 作者存储相关信息的结构就是Errpt的hash作为键,0/1作为值 image.png 作者指出,因为要考虑上下文,所以故障注入不能再静态的注入,而是要动态的进行注入。比如说当一个error site等待注入,但是有N个上下文,那么实际上相当于要注入N个不同的error site

Context-Sensitive SFI-based Fuzzing

image.png 1)静态地识别测试程序源代码中的错误位置; 2)运行测试程序,收集每个执行错误站点的调用上下文和代码覆盖率的运行时信息; 3)根据运行时信息创建已执行错误位点的错误序列; 4)运行程序后,对每个已创建的错误序列进行变异,生成新的序列; 5)运行被测程序,根据变异后的错误序列,在特定调用上下文的错误位点注入故障; 6)收集运行时信息,创建新的错误序列,并对这些错误序列再次进行变异,构建一个模糊循环。当没有新的错误序列产生或达到时间限制时,模糊循环结束。

框架

image.png

Error-site提取器。它对测试程序的源代码执行自动的静态分析,以识别可能的错误位置。
程序生成器。它对程序代码执行代码检测,包括识别错误位置、函数调用、函数入口和退出、代码分支等。它生成一个可执行的测试程序。

  • 对代码进行插桩,有两个目的: 收集有关错误站点的运行时信息和注入错误。
    • 为了收集每个错误点的运行时调用上下文的信息,程序生成器在对被测试程序代码中定义的每个函数调用之前和之后,以及在每个函数定义的入口和出口处测量代码。
    • 为了监视错误点的执行并对其进行错误注入,程序生成器在每个错误点前编写代码。
    • image.png

运行时监视器。它使用生成的输入运行被测程序,收集被测程序的运行时信息,并根据生成的错误序列执行故障注入。
错误序列生成器。它创建错误序列,并根据收集的运行时信息改变错误序列以生成新的错误序列。
输入发生器。根据收集到的运行时信息,它执行传统的模糊处理来改变和生成新的输入。
Bug检查器。它们检查收集的运行时信息以检测错误并生成错误报告。
(和原先的一篇基本一样,多了一个输入发生器)

疑问

  • 其实和上一篇一样,对error-site的模糊是何意?既然是为了提升覆盖率,全给他触发不就行了么。
  • 具体每个步骤是如何实现的,作者并没有开源代码

收获

其实这篇文章最大的收获就是如何将一篇B扩充到一篇A。这篇文章是基于Fuzzing Error Handling Code in Device Drivers Based on Software Fault Injection进行升级的,相较于原来的文章,作者做出了以下几点提升:

  • 在原先的基础上对error-site增加了上下文——模型建模更精细化,复杂化
  • error-site提取的时候,考虑了库函数的情况,而且采用了统计的方法进一步提高识别的精度——方法步骤复杂化,增加未曾考虑的情况
  • 不再只聚焦于驱动程序,将范围扩大到所有程序
  • 在fuzz过程中增加了传统fuzz,之前只有对error-sites sequence的fuzz

目的: 方法: 意义: 效果: