编辑
2025-02-10
Paper
00
请注意,本文编写于 51 天前,最后修改于 45 天前,其中某些信息可能已经过时。

目录

Automatic Library Fuzzing through API Relation Evolvement
作者
传统方案
作者的方案
API误用的定义
方法论
APIGraph构建
Liblang Seed Mutation

🤔

Automatic Library Fuzzing through API Relation Evolvement

作者

传统方案

  • 提取所有的API列表,然后对其进行排列组合 -> 随机性大,可能不符合API的调用规范导致误报率高
  • 提取所有的API列表,然后按照Example进行组合 -> 随机性小,误报率小,但是无法称称多样化的API调用序列

目前的研究方案具体可以归结到两个问题

  • 如何组合API调用序列覆盖广域的程序空间
  • 如何满足API之间的调用规范合成合法的调用序列来解决测试中的因为API调用序列不当而导致的误报

作者的方案

  • 为了解决隐式API调用规范的问题提出了关系学习阶段,即通过更改API调用顺序观察执行状态的变化来推断API关系。而后根据程序状态的变化(崩溃/非崩溃)将API加入到一个APIGraph的动态图结构中
  • 根据经验设置了一套崩溃原因库,可以根据程序反馈分析出程序崩溃是因为API调用中不合理的参数还是错误的API调用顺序

API误用的定义

作者将API误用定义为了两种漏洞模式——API调用不规范导致的未定义行为(UB)API库中由于开发者的疏忽导致的漏洞

  • API调用不规范 对应的测试工具的多样性指标 即测试工具会生成大量的调用序列而不仅仅依靠案例代码
  • API漏洞对应测试工具的准确性指标 即测试工具会组合出大量的合法调用序列而仅测试API内部的漏洞

方法论

APIGraph构建

文中所有的API调用序列都是基于APIGraph为基础进行合成的,APIGraph本身是一个有向图结构。其基础结构为

  • Node: 一个Node和一个函数一一对应,其具体由函数名和参数类型所定义
    • Parameters: 参数类型和属性
    • Constraints:
      • Value-Set Constraints: 指具有特定值的参数(CONSTANT、Range、Random、Length、FILEIO)
      • Dependency Constraints: 指在该节点上存在APIGraph的边
    • SeedSpace: 存储键值对,其中键位在此节点崩溃的libLang种子,值是从键中学习到的对于API关系
  • Edge: 涉及到数据依赖关系的时候,APIGraph会存在一条边用以链接Node之间的Parameters;当涉及到控制流关系时,APIGraph将会存在一条边链接两个Node
    • Control-Flow Edge: 两个Node之间存在控制流关系
    • Def-Use Edge: 存在显式数据依赖关系。其中目标Node使用由源Node的返回值或者参数定义的参数
    • Valid Edge: 存在隐式的数据依赖关系。即源Node的存在对于目标Node是必须的
    • Invalid Edge: 存在隐式的数据依赖关系。即源Node的存在将导致目标Node的未定义行为

APIGraph的构建过程分为两类

  • 存在ConsumerCode(Test Unit): 识别其中的API,而后利用FuzzGen相似的技术对API向后切片来进行数据流分析,根据数据的特性为API参数分配不同的属性(CONSTANT、Range、Random、Length、FILEIO),如果子啊数据流分析中遇到指针或者结构体将执行Anderson的Points-to分析来分析相关字段
  • 不存在ConsumerCode:将直接匹配参数和返回值类型构建Def-Use Edge,对于设计到的参数均分配DEPENDENT属性,并且仅对适用的参数分配FILEIO其余都为Random

Q1: 本文中提到的Seed是什么?

其实就是API调用序列,每个API调用序列组成一个Seed

Q2: Anderson的Points-to分析是什么?

https://www.zhihu.com/question/528991938

Q3: Seed是如何生成的(API调用序列是如何生成的)?

  • Consumer Code: 从Root Node开始执行深度优先搜索
  • APIGraph: 从APIGraph中随机选择一个Node(不能是Def-use Edge或者Valid Edge的目标),而后进行多轮Node插入

Q4: Seed和APIGraph的生成顺序似乎存在逻辑问题? APIGraph中使用到了Liblang Seed,但是Liblang Seed是由APIGraph生成的?

SeedSpace中的Seed和Liblang Seed中的Seed不是一个东西,其中SeedSpace在后文中可以看出是指某一个参数值的范围

而Liblang Seed指的就是API调用序列

Liblang Seed Mutation

NEXZZER将会在Liblang Seed(API调用序列)上随机执行type-aware argument mutation(参数类型感知突变)或者sequence-aware mutation(序列感知突变)

  • type-aware argument mutation: 根据之前对每个参数分配到的属性进行对应方式的变异(CONSTANT、Range、Random、Length、FILEIO)
  • sequence-aware mutation: 因为存在APIGraph的关系,可以分辨出Node之间的关系,便可以执行Node Insertion和Node Deletion操作
    • Node Insertion: 随机选择一个位置,插入一个API(不能引入Invalid Edge),需要为现有的参数和Node保留所有的Def-use Edge和Valid Edge
    • Node Deletion: 删除一个Node和所有其Def-use Edge和Valid Edge相关联的Node

本文作者:Du4t

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!