NSFuzz: Towards Efficient and State-Aware Network Service Fuzzing-论文阅读
Introduction
前作
在nsfuzz之前的一些工作是如何对有状态的网络应用的灰盒模糊测试的。
AFLNet
原理:
- aflnet通过从响应消息中提取响应码来表示服务状态,并使用响应码序列推断协议实现的状态模型,进一步利用推断的模型指导模糊测试过程。
- 利用推断的状态模型指导模糊测试:aflnet根据协议实现的状态模型,在模糊测试过程中指导生成的输入,以更好地探索协议实现的代码路径和增加代码覆盖率。
不足:
- 状态表示的挑战:aflnet提出的响应码方案假设协议会在响应消息中嵌入特殊的编码,这在实际情况下并不总是成立。因此,这种基于响应码的状态表示方案可能不适用于所有的网络服务。
- 测试效率的挑战:由于没有明确的信号指示被测试的网络服务是否已经完成对一个消息的处理,aflnet使用一个固定的定时器来控制模糊测试器发送消息给被测试的网络服务。然而,定时器的时间窗口要么太短(这样被测试的网络服务可能会错过模糊测试器发送的消息),要么太长(这样模糊测试器会在等待中浪费太多时间),从而影响了模糊测试的效率。
statefuzz
原理:
- statefuzz通过抽象符号执行和动态二进制分析技术,捕获和表示网络服务的状态信息,并在模糊测试过程中持续更新和利用这些状态信息。通过准确地表示网络服务的状态,statefuzz能够更好地引导模糊测试过程,提高测试用例的质量和效率。
- 利用状态信息优化模糊测试:statefuzz使用状态信息来引导探索测试路径,通过符号执行技术生成具有高覆盖率的测试用例。同时,statefuzz还利用状态信息的汇总来生成更多的有效测试用例,从而增加网络服务中漏洞的发现几率。
不足:
- 运行时开销较大:statefuzz需要对网络服务进行动态二进制分析和抽象符号执行,并在运行过程中捕获和更新状态信息。这些额外的运行时操作会导致较大的性能开销,使得模糊测试的过程变得较慢。
- 对协议解析的依赖:statefuzz需要分析网络服务的协议实现来获取状态信息。如果协议实现复杂或者没有明确定义的协议规范,statefuzz可能会遇到困难,难以准确捕获和表示网络服务的状态。
待解决的问题
-
状态表示的困难性:现有的模糊测试工具对网络应用的状态表示还存在问题。例如,AFLNET采用了从响应消息中提取响应码的方式来表示服务状态,但这种方法假设协议会在响应消息中嵌入特殊代码,而实际情况并非都是这样。此外,如STATEAFL所指出的,响应码只能提供服务状态的很差指示,甚至可能导致冗余的状态。
-
测试效率的挑战:由于没有明确的信号表明被测系统是否已经完成处理一个消息,目前的模糊测试工具使用固定的定时器来控制模糊器向被测系统发送消息。然而,定时器的时间窗口要么太短(这样被测系统可能会错过模糊器发送的消息),要么太长(这样模糊器将浪费太多时间等待)。此外,STATEAFL需要进行后执行分析来收集状态序列和推断状态模型,这会引入额外的运行时开销,并进一步降低测试吞吐量。
nsfuzz的贡献
作者通过研究多个代表性的网络服务程序,发现这些程序通常使用程序变量直接描述程序状态。此外,网络服务往往包含一个网络事件循环,负责分发传入的消息。
- 为了解决第一个挑战,作者提出了一种轻量级基于变量的状态表示方案,以更高的准确性表示服务状态。
- 对于第二个挑战,可以利用网络服务的内在事件循环来产生适当的信号反馈,从而实现网络服务与模糊器之间的高效同步,并促使模糊器发送新消息以减少等待时间开销。
- 此外,基于信号的同步还可以使模糊器主动进行状态序列收集和状态模型推断,从而避免STATEAFL所使用的繁重的执行后分析。
具体:
作者使用静态分析自动识别网络服务的网络事件循环和状态变量,并进行轻量级的编译时插桩,以实现状态感知模糊测试和基于信号的快速I/O同步。评估结果表明,NSFuzz在模糊测试过程中能够推断出更准确的状态模型,并且其模糊测试吞吐量显著高于AFLNET和STATEAFL。此外,NSFuzz能够在更短的时间内达到更高的覆盖率并触发崩溃。
贡献点:
- 提出了一种基于变量的状态表示方案,用于识别网络服务的状态并推断其状态模型,并将其用于指导模糊测试过程。

本文是对NSFuzz论文的阅读分享。先介绍前作AFLNet和statefuzz的原理与不足,指出待解决的状态表示和测试效率问题。NSFuzz提出基于变量的状态表示方案和基于网络事件循环的同步机制。通过静态分析和模糊测试循环实现功能,实验表明其在状态模型推断、模糊测试吞吐量等方面表现出色。
最低0.47元/天 解锁文章
447





