Moonshine论文阅读

基于白盒源码生成歧义性数据

通常依赖于手工编码规则来生成可以引导模糊测试过程的系统调用的有效种子序列,但是限制较多,难度较大.

MoonShine: Optimizing OS Fuzzer Seed Selection with Trace Distillation-USENIX-2018

简介: 通过提取程序中的syscall trace, 并且对trace蒸馏,在保证代码覆盖率的前提下,尽可能缩小trace的size,来生成OS Fuzz的种子。 针对系统调用跟踪的任意大小性和重复性对模糊测试速度的放缓问题的研究

核心方法: 利用轻量级静态分析,有效地检测不同系统调用之间的依赖关系。

蒸馏的时候,将syscall的依赖关系分为两类:

  1. 显式依赖关系: 函数c1的结果(输出)被函数c2作为参数之一(输入)
  2. 隐式依赖关系: 函数c1通过内核中的某个共享数据结构的写操作影响函数c2的读操作(即使c1的输出和c2的输入参数之间没有重叠)
  • c1必须在其控制流中具有条件,该控制流取决于由c2修改的全局值。(可以细化数据流,但效率有所牺牲) (内核锁定映射到进程地址空间的所有内存页以避免交换) Moonshine首先查找明确的依赖关系, 然后对内核源代码使用静态分析的技术来查看隐含的依赖关系

种子筛选算法 (DES)

  1. 系统调用跟踪集合S中指令以覆盖率降序的方式排序
  2. 分别捕获两种依赖关系并合并
  3. 将提纯后的排序与原排序匹配
  4. 添加到种子集合

捕获显式关系算法:

  1. 对于每个调用的返回值,构造相应的结果节点并将其添加到图形中 (结果节点: 存储返回值, 返回类型和跟踪中产生结果的调用) (图形: 网状结构, 参数结点和结果节点相连表示有依赖关系)
  2. 对每个参数检查其缓存中的条目是否命中
  3. 迭代存储在图形中的所有结果节点以获取特定类型和值,并将参数节点中的一条边添加到图中的每个结果节点。 隐式也是迭代检查,类似的. 隐式和显式函数相互调用,但最终接近跟踪的开头而终止
用到的方法

跟踪器: Strace 多进程跟踪

构建进程树, 本地缓存的关系图

问题举例: 两个种子(目前放在单独的提纯程序中)被发现彼此依赖。 在这种情况下,MoonShine将两个程序合并为一个 隐式关系:

  1. 基于Smatch构建, c的静态分析框架(Hook)
  2. 通过注册一元运算符挂钩和分配挂钩来跟踪写入依赖关系, 将结构和字段记录为写入依赖项。