AFLnet 第一个有状态的覆盖率引导模糊测试器
来自ICST2020
1. Abstract
服务器具有巨大的状态空间,只有通过明确定义的输入消息序列才能有效地遍历。 AFLNET,这是第一个用于协议实现的灰盒模糊器,AFLNET 采用突变方法并使用状态反馈来指导模糊测试过程,AFLNET 充当客户端并向服务器发送变异的消息序列,并保留那些有效增加代码覆盖率或状态覆盖率的变异体。 最终发现了两个新的 CVE。
2. Introduction
- 基于覆盖率反馈的灰盒模糊测试(CGF)
- 缺少服务器的状态转换信息,服务器的响应取决于当前消息和由早期消息控制的当前内部服务器状态
- 也不知道发送的消息应有的结构或顺序
- 开发人员需要根据特有的服务器状态编写单元测试工具
- d安源测试可能无法彻底测试几个程序状态之间的转换
- 有状态的黑盒模糊测试(SBF),根据给定的协议,形成有限状态机以获取状态转换关系
- 初始消息序列是根据手工编写的模型生成的,存在不确定性
- SBF不会像CGF一样对有价值的种子进一步探索。
- 设计了AFLNET,第一个有状态的基于覆盖率反馈的灰盒模糊测试器(SCGF)结合了自动状态模型推理和覆盖率引导
3. Example:FTP
模糊器充当客户端,而服务器充当模糊目标
上图为客户端(红)和服务端(黑)的FTP通信
- 对于来自客户端的每个请求消息,FTP 服务器都会回复一个包含状态代码的响应消息,响应中的状态代码确保客户端请求得到确认并通知客户端当前服务器状态。
- 由客户端发送至服务器的每个请求都有可能推进服务器发生状态转变,如从初始状态到经过身份验证。
4.Tool Design and Implementation
1.请求序列解析器:
用于生成初始语料库,AFLNET 使用消息结构的协议特定信息以正确的顺序从捕获的网络流量中提取单个请求。它首先从 pcap 文件中过滤出响应以获取客户端请求。然后,它根据给定的协议解析过滤后的每条请求的开始和结束符。(如每条 FTP 消息都以USER、PASS开始,并以回车后跟换行符0x0D0A结束)以此得到每条请求
SCGF 将序列中的每条消息与相应的服务器状态转换相关联
2.状态机学习器:
接受服务器响应消息,并根据消息中的状态来学习并增进协议状态机(IPSM)。具体的,读取相应消息,提出状态码 ,确定状态转换,如果服务器响应中有新的状态码,则添加表示新状态的新图形节点。
3.目标状态选择器
从 IPSM 获取信息来选择 AFLNET 下一步应该关注的状态。采用了几种启发式方法选择下一个状态,这些启发式方法可以从学习的 IPSM 中可用的统计数据中计算出来。
4.序列选择器
一旦选择了目标状态 s,序列选择器就从语料库中选择可以到达状态 s 的消息序列。
种子语料库:包含种子输入信息的队列
状态语料库:包含状态信息的队列,以及一个存储种子和其能到达的状态的哈希表
序列选择器利用哈希图随机选择一个序列,以执行状态 s。
5.序列变异器
与现有的基于生成方法相比,AFLNET中基于突变的方法可以在真实网络消息的基础上生成新序列。
基于生成的方法需要详细的协议规范,包括具体的消息模板和协议状态机。
基于突变的方法可以将导致发现新状态、状态转换或程序分支的生成序列添加到语料库中以进行进一步的模糊测试。
6.整体流程
模糊LightFTP的整体流程
- 一个包含网络流量的pcap文件
- 请求序列解析器解析 pcap 文件以生成单个序列并将其保存到语料库 C 中,序列如下图
- 状态机学习器根据响应码构造初始IPSM,如下图
- 目标状态选择器选择一个目标状态,如331
- 序列选择器将从序列语料库 C 中随机选择一个序列
- 序列变异器识别出前缀(“USER foo”请求)、候选子序列(“PASS foo”请求)和剩余子序列为后缀,并对候选子序列进行变异
- 序列变异器可能会变异出错误的密码请求,导致服务器来到新的状态(530,未登录)
- 紧着这会继续发送后缀的请求,导致一直在530这个状态循环,如下图,因为在成功验证之前不允许所有这些命令
- 最后,发送“QUIT”请求,服务器退出
- 由于生成的测试序列触发新的状态转换,因此将其添加到语料库 C 和 IPSM 中。
如下图,添加到语料库 C 中的新序列
如下图,新的协议状态机
5. Case studies
AFLNET分别于与 BOOFUZZ(有状态黑盒模糊器) 和AFLNWE (无状态覆盖引导模糊器)进行对比,结果如下
-
AFLNET 在所有有效性度量上都优于BOOFUZZ,分支覆盖率、语句覆盖率和状态覆盖率的平均增幅分别为 60%、56% 和 67%,这种提升是因为 AFLNET 变异真实消息序列,以及根据增加覆盖率的消息序列来进化语料库。
-
AFLNET 也明显优于 AFLNWE,尤其是在 LightFTP 中。分支覆盖率、语句覆盖率和状态覆盖率分别提高了 121%、79% 和 85%。在Live555中的增幅不大是因为Live555 的协议状态机比 LightFTP 的协议状态机的深度更小,即有效序列中的消息数量更少。其次,状态较少,即大多数状态是错误状态。
-
AFLNET 总共发现了四个漏洞,其中两个(CVE2018-4013 和 CVE-2019-7733)是已知的,其余两个漏洞(CVE-2019-7314 和 CVE-2019-15232)是零日漏洞。 CVE-2019-7314 和 CVE-2019-15232 均获得 CVSS 评分 CRITICAL 9.8。