Fuzzing network servers is a technical challenge, since the behavior of the target server depends on its state over a sequence of multiple messages. Existing solutions are costly and difficult to use, as they rely on manually-customized artifacts such as protocol models, protocol parsers, and learning frameworks. The aim of this work is to develop a greybox fuzzer (StateaAFL) for network servers that only relies on lightweight analysis of the target program, with no manual customization, in a similar way to what the AFL fuzzer achieved for stateless programs. The proposed fuzzer instruments the target server at compile-time, to insert probes on memory allocations and network I/O operations. At run-time, it infers the current protocol state of the target server by taking snapshots of long-lived memory areas, and by applying a fuzzy hashing algorithm (Locality-Sensitive Hashing) to map memory contents to a unique state identifier. The fuzzer incrementally builds a protocol state machine for guiding fuzzing. We implemented and released StateaAFL as open-source software. As a basis for reproducible experimentation, we integrated StateaAFL with a large set of network servers for popular protocols, with no manual customization to accomodate for the protocol. The experimental results show that the fuzzer can be applied with no manual customization on a large set of network servers for popular protocols, and that it can achieve comparable, or even better code coverage and bug detection than customized fuzzing. Moreover, our qualitative analysis shows that states inferred from memory better reflect the server behavior than only using response codes from messages.
翻译:模糊网络服务器是一个技术挑战, 因为目标服务器的行为取决于它对于多个信息序列的状态。 现有的解决方案成本高昂, 也难以使用, 因为它们依赖于手动定制的工艺品, 如协议模型、 协议解析器和学习框架。 这项工作的目的是为网络服务器开发一个只依赖于目标程序轻量分析的灰盒模糊器( StateaAAFL), 没有手工定制, 类似于 AFL Fuzzer 为无国籍程序所实现的。 拟议的模糊器在编译时对目标服务器进行工具, 以插入存储存储范围以及网络 I/ O 操作的探测器。 在运行时, 它通过对长期记忆区域进行截图, 以及应用模糊的散乱算( StateaAFL) 来将存储内容映射成一个独特的国家标识。 模糊器只能用一个协议状态机器来引导 fluzz。 我们实施并释放国家AAAFL, 作为开源软件。 在运行时插入存储存储范围和网络内部代码时, 我们用一个可比较的协议基础, 用于更新的大规模服务器的服务器测试, 测试, 将一个协议设置成一个基础, 我们无法在服务器上, 测试系统上, 测试一个基础, 测试一个基础, 测试一个系统, 将它用来显示一个更精确的服务器的服务器的服务器的系统, 测试系统, 测试。