AFLNET:一种针对网络协议的灰盒模糊器

背景

面向互联网的服务器使用安全协议以有效和可靠的方式相互通信或与客户端通信,这种从任意地方与服务器通信的能力为远程代码执行攻击提供了大量机会,所以发现协议实现中的安全漏洞至关重要。

AFL及其大多数扩展都是基于覆盖的灰盒模糊器(CGF),主要用于测试输入与输出之间的无状态程序,不维护或不考虑任何内部状态。而服务器是有状态和消息驱动的,服务器的响应取决于当前请求和由较早的请求消息控制的当前服务器的内部状态。由于CGF在有状态模糊器方面的局限,目前流行技术是有状态黑盒模糊器(SBF)。然而,器有效性很大程度取决于给定状态模型和数据模型的完整性。此外SBF不保留有趣的测试用例,换句话说就是没有学习能力,不会在运行时更新状态模型。

解决思路

引入一个有状态的CGF(SCGF)工具——AFLNET,它能够使自动状态模型推理和覆盖引导模糊协同工作。模糊测试过程有助于生成新的消息序列来覆盖新的状态,并使状态模型更加完整,同时,动态构建的状态模型通过使用保留消息序列的状态覆盖和代码覆盖信息,将模糊推向更重要的代码部分。

设计和实现

image-20210814215849572

AFLNET 支持两个通道,分别用于接收和发送来自被测服务器的消息、响应。响应接收信道除实现代码覆盖反馈信道之外,还形成了状态反馈信道。

AFLNET的输入是包含捕获网络流量的pcap文件。AFLNET使用请求序列解析器组件生成消息序列的初始语料库,从 pcap 文件中以正确的顺序提取单个请求,首先从pcap文件过滤出响应,以获得客户端请求的traces,然后解析过滤后的traces以识别traces中每条消息的开始和结束。同时,SCGF将序列中的每条消息与相应的服务器状态转换相关联。

AFLNET将服务器响应读入字节缓冲区,提取协议中指定的状态码,确定状态转换,如果为新的状态代码,则添加表示新状态的新节点,通过以上步骤来增强协议状态机(IPSM),构成状态机学习器。

目标状态选择器从IPSM中获取信息,选择AFLNET下一步应该关注的状态。AFLNET一开始使用随机选择目标状态,当工作足够长事件后开始使用启发式算法。

当选择目标状态s后,从序列语料库中选择可以达到状态s的消息序列,序列选择器利用哈希图随机选择一个序列。选中序列后,执行突变。AFLNET采用基于突变的模糊方法,将消息序列进行突变以生成新的序列,这样能够生成有效的新序列,并允许进化出有趣的消息序列语料库。将发现新状态、状态转换或程序分支的生成序列添加到语料库以进行进一步模糊。

给定状态s和消息序列M时,为了确保突变序列M'仍然能到达状态s,AFLNET将M分成三部分,前缀M1达到状态s,子序列M2在M1之后,且可以执行并仍然保持在s中,剩余子序列为后缀M3。突变消息序列M'=M1,mutate(M2),M3通过保持M1,使得仍能达到抓过状态s,突变的M2在状态s上产生一个可选的消息序列,之后继续执行后缀M3.

AFLNET从消息序列C的语料库中生成一个消息池,消息池时来自网络嗅探器traces和生成的消息的集合,可以将其添加或替换到现有消息序列M中,为了突变M2,AFLNET支持消息的替换、插入、复制和删除,还支持常见的字节操作符如位翻转以及字节块的替换、擦汗如或删除。如果服务器响应包含之前没有观察到的新状态或状态转换或序列覆盖服务器源代码中的新分支,则序列是有趣的,有趣的序列M'将被添加到语料库C中。

思考

受控系统也是有状态的,可以借鉴本论文思路实现有状态的模糊测试。

最后修改:2021 年 08 月 14 日
如果觉得我的文章对你有用,请随意赞赏