Many bugs in protocol implementations may only manifest when the system is in a particular "state". For instance, to trigger one of the bugs we found in an RTSP implementation, the fuzzer must first send two different types of messages to usher the protocol implementation from the INIT via the READY to the PLAY state where the bug is exposed. Without knowledge of the protocol, it is inherently difficult for a fuzzer to discover such stateful bugs. A key challenge in fuzzing stateful systems, therefore, is to cover the state space without an explicit specification of the protocol. So, how can we help our fuzzer navigate an unknown state space? In our analysis of the Top-50 most widely used open-source protocol implementations, we found that every implementation uses state variables that are assigned named constants (such as INIT, READY) to represent the current state. In this work, we propose to automatically identify such state variables and track the sequence of values assigned to them during fuzzing to produce a "map" of the explored state space. Our stateful greybox fuzzing approach uses this map to focus on the most promising regions of the code and state space. Our experiments confirm that our stateful fuzzer discovers stateful bugs twice as fast as the baseline greybox fuzzer that we extended. The state sequence for an input is determined by the sequence of values assigned to the state variables during its execution. Starting from the initial state, our fuzzer exercises one order of magnitude more state sequences and covers the same code two times faster than the baseline fuzzer. Several zero-day bugs in prominent protocol implementations were found by our fuzzer, and 8 CVEs have been assigned.
翻译:协议执行中的许多错误只有在系统处于特定“ 状态” 时才会显现出来 。 例如, 要触发我们在 RTSP 执行中发现的一个错误, 模糊器必须首先发送两种不同类型的信息, 将协议执行从 INIT 通过 READY 启动到 PRAY 启动到 PRAY 状态。 在对协议不知情的情况下, 模糊器自然很难发现这种有声的错误。 因此, 模糊状态系统的一个关键挑战就是覆盖国家空间, 而没有协议的清晰规格 。 因此, 我们如何帮助我们的 farzzer 运行一个未知的状态空间? 在分析最广泛使用的 ST- 50 公开源协议执行过程中, 我们发现每个执行者都使用指定为常数的变量( 如 INIT, READY ) 来代表当前状态 。 在这项工作中, 我们提议自动识别这样的状态变量, 并跟踪在模糊状态生成“ 映射” 状态中指定的代码的顺序。 我们的状态是模糊的初始值 。 我们的模糊信箱的初始运行方法使用了这个地图, 作为我们最有希望的运行的序列, 我们的运行的状态的状态的状态, 以两次的状态的顺序被确认的顺序。 。 。 我们的路径被定位的路径被定位的预测测为 。