原论文地址:https://arxiv.org/pdf/1812.00140.pdf
由于本人的英文水平实在是太垃圾了 所以用的是谷歌机翻看的
部分语句可能由于机翻带来的影响导致语义错误
Abstract
模糊测试是一种概念简单 部署门槛低 且成效显著的漏洞发现技术
本文的目的旨在帮助保存大量的模糊测试样例以及保证其连贯性 提出一个统一的通用模型
Introduction
作者简单介绍了fuzz是什么 以及此前其存在的缺陷 同时举了几个比赛队伍或者厂商使用FUZZ的案例 随后简要概括了fuzz社区的规模
因为fuzz的逐渐发展 导致了各种fuzz工具之间的术语存在明显的“歧义”(fragmentation)
作者认为 这种歧义很有可能会阻碍fuzz的传播 影响到fuzz的发展
所以 其认为有必要巩固和提炼模糊测试的进展
SYSTEMIZATION, TAXONOMY, AND TEST PRO-GRAMS
介绍了模糊测试最开始的提出者以及其最开始的定义 列举了模糊测试可适用的领域 接着为了使得大量模糊测试文献中的用语系统化 作者决定介绍一个由现代用途中提取的术语
1.Fuzzing & Fuzz Testing
本小节针对模糊测试下了第一个定义
Definition 1 (Fuzzing). Fuzzing is the execution of the PUTusing input(s) sampled from an input space (the “fuzz inputspace”) that protrudes the expected input space of the PUT. |
此外还针对fuzz testing和fuzz进行了一个定义
作者认为fuzz testing是一种利用fuzz的软件测试技术 其的特定目标是用来查找和安全有关的错误 包括程序崩溃
Definition 2 (Fuzz Testing). Fuzz testing is the use of fuzzing |
Definition 3 (Fuzzer). A fuzzer is a program that performs |
此外还定义了fuzz compaign
Definition 4 (Fuzz Campaign). A fuzz campaign is a specific |
早期的模糊测试活动 其安全策略只局限于测试输入 使PUT崩溃 但是模糊测试活动可以用于测试执行中观察到的任何安全策略 而这一决定执行是否违反安全策略的称为漏洞预测器
Definition 5 (Bug Oracle). A bug oracle is a program, per- |
这一段话有点没看懂 目前还不能理解执行中观察到的任何安全策略的含义 除了输入点可以诱发的崩溃 还有什么呢 笔者于这里提出了第一个疑问
作者称由模糊器实现的算法为模糊算法 模糊参数是依赖于PUT之外的一些参数 称其为模糊配置 笔者这里将其理解为 模糊参数于PUT不相干 是否可以认为是一种用于模糊测试的语料库
Definition 6 (Fuzz Configuration). A fuzz configuration of |
接着针对模糊算法进行了进一步的说明 作者认为模糊算法的定义是广泛的 复杂的模糊配置会随着时间的推移而演变其算法 引入了突变率和种子的概念
种子是用来生成输入PUT的测试用例
而种子的集合则成为种子池 复杂的模糊配置就会演变种子池
作者举了一个基于覆盖率引导的模糊测试例子 其会在每个配置中存储已经达到的覆盖率信息
笔者这里经过查阅资料(其实是询问gpt 大致了解了覆盖率是一种什么概念
覆盖率引导是一种模糊测试的技术策略 其主要目的是用来寻找最优的测试用例 该测试用例可以经过最多的代码分支 经过的代码占总代码的百分比就是覆盖率
那么这里就是一种迭代的过程 会根据上一次的模糊测试返回的覆盖率 来决定下一次的种子 从而使其获得更大的覆盖率
2.Paper Selection Criteria
这一小节 主要是作者声明了收纳出版物的范围 举了几个会议的名称
同时引入了黑盒白盒的概念(并未由作者提出 为笔者根据段落大意可以看出)
作者认为 以安全为特定目标的模糊测试和软件测试相比 从理论来说 二者的不同点只体现在漏洞预测器的区别(bug oracle)
接着作者提到 在实际中 软件测试的前提是知晓源代码 而且测试人对于PUT有更多的了解
而模糊测试更可能是被PUT开发者以外的人使用 其不知晓上述信息
由于这二者领域仍然密切相关 所以作者决定 只要出版物出现模糊(fuzz)一次 就纳入其中
3.Fuzz Testing Algorithm
本节作者提供了一个算法1
其采用一组模糊配置C以及Tlimit(最大时间限制)作为输入
输出一组已发现的错误
其由两部分组成 第一部分为预处理(preprocess)函数构成 该函数在模糊测试开始时执行
第二部分为由五个功能组成的循环 但不是所有的模糊器都全是这五个功能
称这个循环的每次运行为模糊迭代 每次inputeval将模糊样例输入给PUT称为模糊运行
PREPROCESS(C)->C
用户向P提供一组模糊配置 其可能返回一组已修改的模糊配置
根据模糊算法的不同 P可以执行各种各样的操作 比如插入测试代码到PUT中
或者测量种子文件的执行速度
SCHEDULE(C,Telapsed,Tlimit)->conf
将一组模糊配置C 最大时间限制 经过的时间作为参数输入 其会返回一个用于当前模糊迭代的模糊配置
这句话笔者有点没看懂 是意味着该功能负责实现模糊配置的迭代?
不过作者说详细看2.4节 所以这里暂且留一个疑问
INPUTGEN(conf)->tcs
这个功能输入一个当前模糊配置 根据模糊器的不同 会选择模糊配置中的种子 又或者是模型或语法作为参数 以此来输出模糊测试的样例
笔者这里对于模型和语法是什么东西 还没有概念 先继续往下看
INPUTEVAL(conf,tcs,0bug)->B,execinfos
接收当前模糊配置conf 模糊测试样例 以及漏洞预测器作为参数
该功能用于判断PUT是否违反了安全策略
结束后会输出一个漏洞合集B 以及execinfos 用来迭代模糊配置
CONFUPDATE(C,conf,execinfos)->C
接收模糊配置C 当前模糊配置conf execinfos作为参数
该功能用来更新模糊配置C
CONTINUE(C)->{True,False}
该功能用来接收当前模糊配置 并且进行判断是否进行模糊迭代
如果没有新的路径可发现 其就可以终止执行
4.Taxonomy of Fuzzers
本节 作者对于模糊器的分类进行了定义 分为了三种 黑盒 白盒 灰盒
同时 这与传统的软件测试分类不同 灰盒是作为白盒的变体
Black-box Fuzzer
黑盒适用于模糊测试以及软件测试中 表示测试者无法看到PUT的内部结构 只能看到PUT的输入输出 大部分的模糊器都属于这一类
现代的部分模糊器 在考虑输入的结构信息以此来生成更有意义的测试样例的同时 也会保证不检查PUT
White-box Fuzzer
白盒测试是指在进行模糊测试的时候 已经了解了PUT的内部结构和逻辑
接着作者提到 白盒测试一词最早的提及是动态符号执行DSE
普通的符号执行是指利用符号值而非输入值来分析执行路径
而动态符号执行中 符号执行和具体执行路径同时运行 根据PUT的状态和具体输入的数据来简化符号约束条件
在简化符号约束条件中 可以将符号值转化为具体的值 例如将符号执行的系统调用转化为实际的系统调用
上述的符号值表示的概念 按笔者的理解 应该是用例如符号’a’这样的字符来代替具体的值例如’6’ 类似于数学中一元方程的x
随后 作者还提到 白盒测试通常来用来描述污点分析的模糊器
笔者查询得知 污点分析中的污点是指不受信任的输入源进入PUT的数据 通常是用户输入
通过模糊器生成污点数据 可以模拟潜在的攻击场景 检测PUT是否在处理污点数据的时候存在安全隐患
作者提到 由于白盒测试需要进行动态检测和smt求解 所以相比黑盒测试 所需要的开销会更多
Grey-box Fuzzer
灰盒测试位于白盒和黑盒之间 模糊器可以获得PUT的一部分内部信息
与白盒模糊器相比 灰盒不会推理PUT的完整语义
笔者认为 这里的完整语义是指 PUT的内部逻辑 数据流 控制流以及外部的交互等等
作者提到 灰盒测试可以对PUT进行轻量的静态分析或者收集其执行的动态信息 比如代码覆盖率
5.Fuzzer Genealogy and Overview
暂时看不下去了 断更。。。