作为负责通信的重要组成部分,网络服务是安全的关键,因此发现其中的漏洞至关重要。模糊法是目前最流行的软件漏洞发现技术之一,由于其高有效性和低误报率而被广泛采用。然而,现有的覆盖引导型模糊测试主要针对无状态的本地应用程序,而对有状态的网络服务则没有进行充分的探索。最近,一些针对网络服务的模糊器被提出来,但有一定的局限性,例如,状态表示不充分或不准确以及测试效率低。在本文中,我们提出了一种新的针对有状态网络服务的模糊测试方案NSF。具体来说,我们研究了网络服务程序的典型实现,并确定了它们如何表示状态和与客户交互。因此,我们提出了(1)一种基于程序变量的状态表示方案和(2)一种有效的交互同步机制来提高模糊处理的效率。我们已经实现了NSFuzz的原型,它使用静态分析和注释API来识别服务中的同步点和状态变量,然后实现快速的I/O同步和准确的服务状态跟踪,通过轻量级的编译时工具来进行有效的状态感知模糊测试。评估结果显示,与其他网络服务模糊器(包括AFLnet和StateAFL)相比,我们的解决方案NSFuzz可以在模糊过程中推断出更准确的状态模型,并将模糊处理的吞吐量提高了200倍。此外,NSFuzz可以提高25%的代码覆盖率,并在更短的时间内触发更多的崩溃。此外,我们还对目标服务的最新版本进行了摸索,发现了8个零日漏洞,这些漏洞都是由NSFuzz发现的。
1 介绍
挑战:
然而,传统的灰箱模糊化方法不能直接很好地应用于网络服务,这是由于两个主要挑战 (1)服务状态表示。 大多数现有的灰盒模糊器主要是为无状态的本地应用程序设计的。对于基于协议的网络服务,一方面,当接收到相同的输入消息时,网络服务根据当前的会话状态做出不同的响应;另一方面,大多数bug是有状态的,只能由一系列特定的消息触发。因此,不知道服务状态的灰箱模糊解不能获得完整的反馈,这将误导遗传算法的进化方向。(2)测试效率。 网络服务程序通常被设计为C/S架构,动作通常涉及多个网络I/O交互,这意味着一个有效的fuzzer需要与目标服务进行多次交互。因此,fuzzers应该及时将每个消息发送给目标服务,以节省测试时间和提高测试吞吐量。
现状
值得注意的是,最近的一些研究工作已经为网络服务引入了灰盒模糊化。AFLnet [39]首先提出了针对有状态协议实现的灰盒模糊化解决方案。它从响应消息中提取响应代码来表示服务状态,然后使用响应代码序列来推断协议实现的状态模型,并进一步利用推断的模型来指导模糊化过程。StateAFL [33]试图使用程序的内存状态来表示服务状态,然后通过检测被测服务来执行状态收集和状态模型推断。在每一轮网络交互中,StateAFL将程序变量转储到一个分析队列中,并执行执行后分析来更新状态模型。
问题
然而,现有的作品仍然面临着上述两个挑战。至于状态表示挑战,AFLnet提出的响应代码方案假设协议将在响应消息中嵌入特殊代码,但情况并非总是如此。此外,如StateAFL中所指出的,由响应代码提供的网络服务状态的指示是不健壮的。为了克服基于响应代码的方法的局限性,StateAFL使用程序在内存中的状态来表示服务状态。但是由于程序内存状态的复杂性,将这样的内容直接映射到服务状态是不现实的。因此,StateAFL使用对位置敏感的散列来近似状态映射,引入了不太精确的状态表示。SGFuzz [18]提出用状态变量来表示网络服务的状态。它自动识别所谓的状态变量,并使用它们来构建状态转移树(STT ),该树被认为代表服务程序的探索状态空间。但是,SGFuzz可能会在状态表示中引入误报,因为SGFuzz直接使用枚举类型的变量作为状态变量,而不进行过滤。关于测试效率的挑战,由于没有明确的信号表明SUT的消息处理,AFLnet和StateAFL都使用固定的定时器来控制fuzzer向SUT发送消息,但是定时器的时间窗口要么太短(在这种情况下SUT会错过fuzzer发送的消息),要么太长(在这种情况下fuzzer会浪费太多时间等待)。此外,StateAFL需要对状态序列收集和状态模型推断进行执行后分析,这引入了额外的运行时开销,并进一步降低了测试吞吐量。
本文工作
在本文中,我们提出了NSFuzz,一种有效的状态感知灰盒模糊解决方案。我们研究了许多有代表性的网络服务程序,以了解它们的典型实现。我们发现这样的程序总是使用程序变量来直接描述服务状态。此外,我们还注意到网络服务总是带有一个网络事件循环,它负责连续处理传入的消息。因此,为了解决第一个挑战,我们提出了一个轻量级的基于变量的状态表示方案来表示网络服务状态。 我们将表示服务状态的变量称为状态变量。由于状态变量包含了服务程序的内在语义信息,基于变量的状态表示方案能够以更高的准确性和可解释性来表示服务状态。至于第二个挑战,网络服务的内在事件循环可以产生适当的信号反馈,从而在网络服务和fuzzer之间实现event loop同步。我们将事件循环中可以产生信号反馈的位置称为I/O同步点,因为它负责同步I/O与引信的交互。基于信号的同步可以促进模糊器发送新消息以减少等待时间开销。 此外