请注意,本文编写于 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
许可协议。转载请注明出处!