第一个有状态的CGF—–SCGF,第一个有状态的基于覆盖的灰盒模糊测试工具。
实现
1 构成
两个数据结构: 1. 队列条目链表(sequences) 2. 状态语料库: (i) 状态条目列表,即包含相关状态信息的数据结构; (ii) 一个哈希图,它将一个状态标识符映射到行使与该状态标识符对应的状态的队列条目列表。 相当于这两个数据结构单方面映射的关系
Sequence Mutators: 使用协议感知变异运算符增强了 AFL 的 fuzz_one 方法 (i) 利用真实网络流量的有效踪迹来生成可能有效的新序列 (ii) 突变的方法允许演化出一个特别有趣的消息序列的语料库。生成的序列导致发现了新的状态、状态转换或程序分支,被添加到语料库中以进一步模糊处理。
有趣的M′定义: (i) 服务器响应包含以前未观察到的新状态或状态转换,来自(10); (ii) 涵盖了服务器源代码中的新分支。
初始IPSM构造:
开始时只有一个包含网络流量的 pcap 文件
—> 初始语料库
—> server response
—> 选择目标状态
—> 序列选择器从序列语料库C选择序列(初始的那个)
—> Mutators 识别序列前缀(“USER foo”请求)、候选子序列(“PASS foo”请求)以及剩余的子序列作为后缀
—> 通过使用堆叠突变器突变候选子序列,序列突变器可能会生成错误的密码请求(“PASS bar”),从而导致错误状态(530 未登录)
—> 它会重播后缀导致状态 530 循环
—> 最后,发送“QUIT”请求,服务器退出,盖了新的状态和状态转换,添加到C和IPSM中
2 技术使用:
使用C Socket APIs —> (connect, poll, send, recv)
AFL【fuzz_one】
3 过程
(1)数据准备
pcap文件【tcpdump3记录真实消息交换】
— wireshark提取FTP序列 — 输入 —>
(2)初始语料库准备
使用其 Request Sequence Parser 组件来生成消息序列的初始语料库C
(5)【相互】序列语料库 & 序列选择器、(6)
序列选择器 —> 序列语料库
序列选择器
—> 利用哈希图来随机选择一个序列,如队列条目所代表的,来行使状态s / 这里应该也把变异后的有趣的消息也传到了C里面【7—>8—>5】
序列语料库 —> 序列选择器
序列语料库
—> 将所选择的状态传给序列选择器,为变异做准备
(3)、(4)消息序列
pool:实际消息 + 生成的消息
sequence分理出的message组成message pool M,为和状态s一起变异做准备
(7)、(9)变异
s\m —> M′【M′ = 〈M1, mutate(M2), M3〉】
为了确保M′依然执行选择状态s,M拆分三部分:〈M1, M2, M3〉=M (i) 前缀M1:达到s; (ii) 候选子序列M2:包含所有可以在M1之后执行而仍然留在s中的消息; (iii) 后缀M3:剩下的子序列。
通过保持原来的子序列M1,M′仍将达到状态s,即模糊器目前关注的状态。
(8)序列选择器 & 目标状态选择器
目标状态s
—> 序列选择器
(10)传输消息给状态学习机
— 获取服务器响应 —>
— 使用新观察的状态&转换 —>
协议状态机【IPSM】
(11)IPSM观察是否有新的状态
有新的状态代码,则会添加一个代表新状态的新图形节点
(12)【相互】IPSM & 目标状态选择器
IPSM —> 目标状态选择器
IPSM
—> 目标状态选择器
—> 选择 AFLNET 下一步应该关注的状态
目标状态选择器 —> IPSM
长时间后,执行启发式算法(选择状态s的概率与执行s (#fuzz) 的变异消息序列的比例成反比),选择状态节点(提高占比?)
创新?
- 自动状态模型推断和覆盖率引导模糊测试相结合,模糊测试有助于生成新的消息序列以覆盖新的状态,并使状态模型逐渐更完整。
- 动态构建的状态模型使用保留的消息序列的状态覆盖和代码覆盖信息来驱动模糊测试,以便将其驾驶到更重要的代码部分。
- AFLNET是一种灰盒模糊测试工具,可以在不需要协议规范或消息语法的情况下进行测试。
- AFLNET是一种客户端模糊测试工具,可以在不需要服务器源代码的情况下进行测试。
- AFLNET使用了一种新的状态反馈技术,该技术使用服务器的响应代码来识别由消息序列练习的服务器状态,从而识别出状态空间中的渐进区域,并系统地向这些区域驾驶。
- AFLNET使用了一种新的变异技术,该技术可以在不需要协议规范或消息语法的情况下进行测试,从而使其更加灵活和通用。
没有协议规范的模糊协议实现:
既不需要手动构造的消息模板,也不需要推断的任何消息模板。
系统进化的种子语料库中的现有消息序列以状态为中心的方式发生变异,以生成新的消息序列。