ProFuzzBench: A Benchmark for Stateful Protocol Fuzzing
一个用来对基于状态的协议模糊测试的基准测试器
相关的一些基准测试工具
- LAVA-M:合成bug的程序
- Google FuzzBench:OSS-Fuzz像项目的云服务
- DAPRA Cyber Grand Challege:语料库???
- MAgma:针对具有手动挑选的漏洞的目标
以上的工具都侧重于无状态的库和程序,对有状态的程序和软件的只能进行有限的测试。
协议的选择
首先,要选择一些被测协议,这些协议应该是流行且被广泛使用的。并收集实现了选定协议的开源软件。
最终ProFuzzBench选择了10个协议,如下:
协议 | 实现协议的程序 | 简述 | 协议的状态信息 | 相关论文 | 非学术的模糊测试工具 |
---|---|---|---|---|---|
RTSP | Live555 | Real-time media streaming | Progress of ongoing streaming | Fw-fuzz,AFLNET | beSTORM, Defensics Fuzz Testing. |
SMTP | Exim | Email transmission | Message queue, progress of the session | 一本书。。 | beSTORM, Defensics Fuzz Testing,Metasploit |
FTP | ProFTPD, LightFTP | File transfer | CWD, session flags, progress of the session | Pulsar, AFLNET | beSTORM, Defensics Fuzz Testing,Metasploit |
SSH | OpenSSH | Secure remote shell | User authentication progress, session configuration | FIRM-AFL | beSTORM, Defensics Fuzz Testing,Metasploit |
TLS | OpenSSL | Secure socket connection | User authentication progress, session configuration | Protocol State Fuzzing,Exploiting Dissent | beSTORM, Defensics Fuzz Testing |
DTLS | TinyDTLS | Secure datagram communication | User authentication progress, session configuration | Analysis of DTLS Implementations Using Protocol State Fuzzing | Defensics Fuzz Testing |
DNS | dnsmasq | Network domain names | Cached DNS records | FIRM-AFL | beSTORM, Defensics Fuzz Testing,Metasploit |
SIP | Kamailio | Signaling protocol for real-time sessions | User registrations, progress of the session | 06-08年的文章(没价值了吧) | beSTORM, Defensics Fuzz Testing |
DAAP | forked-daapd | HTTP-based audio library streaming | Progress of ongoing streaming, playlist | Identifying vulnerabilities in SCADA systems via fuzz-testing(11年) | beSTORM, Defensics Fuzz Testing,Metasploit |
DICOM | dcmqrscp | Image retrieval | Progress of the session | DICOM Vulnerability Mining | Defensics Fuzz Testing |
协议的状态会跟踪客户端和服务器之间通信会话的进度。例如,FTP协议规定了身份验证的初始状态和验证用户名和密码的消息;然后,认证之后是一个或多个文件传输命令;最后,会话以注销结束。安全通信协议(SSH、TLS、DTLS)的情况类似,协议状态跟踪身份验证过程中步骤的顺序,包括用于加密的公钥和其他信息的交换。协议状态反映了服务器进程的当前状态,以及它与客户端交互的历史。如在SMTP和DAAP中,服务器对要传输的电子邮件和要播放的歌曲创建队列。在处理这些消息时,服务器继续通过进一步的消息与客户机进行交互。ProFuzzBench中还包括DNS协议,虽然其是一种无状态的协议,但是它经常作为模糊测试目标,而且它的实现仍然可以提供有状态行为,比如缓存过去查询的记录。
自动化测试过程
一、构建docker
在ProFuzzBench中包含了AFLnwe和AFLNET的docker。且其中还有针对上面表格中提到的应用的补丁,其有很多作用:
- 这些补丁会让程序去随机化,这样可以保证程序的行为是可重复的,同样的输入无论执行多少次都会覆盖相同的路径。同时,由于程序会重复的运行一样的路径,对于不同fuzzer的评估才有可比较性。
- 补丁还将程序中的延迟减少或者取消,因为模糊测试在本地运行不需要像在网络中那样同步网络。例如,AFL使用UNIX信号来管理目标进程并检测其故障。禁用这些信号的任何自定义处理程序,就可以避免干扰基于afl的fuzzer。
- 补丁引入了一些标记。对于AFLNET会使用网络消息序列作为输入,其会使用解析器来寻找网络流量中的标记字符从而分割消息,但是部分协议在其实现中并没有包含什么标记字符。所以使用补丁将标记引入。
- 跟踪协议状态:并非所有的协议像FTP一样有不同的状态码,为了使有状态模糊测试更有效,ProFuzzBench对目标(Live555)进行了补丁,使其发送具有不同状态码的响应,例如,在处理PLAY命令时使用201,而在处理PAUSE命令时使用203。
二、在docker上测试fuzzer
多次重复的进行测试,并将fuzzer的原始数据复制出来以便进行下一步的分析与评估。原始数据包括由模糊器生成的覆盖程序中新路径的输入(例如,AFL中的“有趣输入”),在协议状态机(如AFLnet)中发现新状态转换的输入,以及导致目标软件崩溃或挂起的输入。
三、对原始数据进行分析
生成模糊实验的统计数据。它使用用gcov编译的目标软件再次运行输入,以便获得关于每个输入的覆盖率的行级和分支级信息。
发现的问题(后续可以进一步研究的点)
各种协议的配置问题(针对车联网中的构建仿真,如何把协议仿真起来)
协议模糊测试需要对服务器进行特定的配置,不同的配置可能会有不同的攻击面。
现有的模糊测试技术只采用客户机-服务器方案,其中模糊测试器充当客户机。有些协议则需要第三方参与,如SIP协议至少需要三方:被测服务器、“调用方”和“被调用方”。一个或多个“被调用者”和“调用者”必须首先在服务器上注册;然后调用者才能指示被调用者的名称与服务器联系;服务器将作为被调用方和调用方之间的代理,以便在它们之间建立通信(例如,VoIP呼叫)。在此过程中,服务器则需要处理被调用方可能正忙等情况。
确定的执行(执行稳定性—>)
大量使用线程和基于事件的I/O会导致的服务器的行为是具有不确定性的。当相同的输入应用到目标软件时,不确定性导致程序路径覆盖的变化,这就会影响覆盖驱动的模糊测试。AFL对每个扩大覆盖范围的新输入执行“校准”,以评估执行是否确定,并报告异常新输入的百分比(稳定性指标)。在ProFuzzBench中,通过尽可能禁用线程,或通过将内核级线程(如pthreads)替换为用户级线程(如inGNU Pth)和relatedI/O api,从而增加基准测试的稳定性。尽管有这些对策,在几个基准测试中报告的稳定性仍然低于50%,这是由于在目标软件调用的库中使用了线程和I/O。
执行速度(协议模糊测试并行化)
协议模糊测试需要用到和服务器的沟通,所以速度会很慢。
与模糊测试库和命令行实用程序(在AFL中每秒可以执行数千次)相比,模糊测试网络服务器由于进程的复杂初始化(例如,初始化缓存或数据库),网络开销(由于进程之间的通信和上下文切换)以及测试用例中的长序列消息而减慢。例如,在对SIP进行模糊测试时,由于模糊器和其他进程(服务器和SIP被调用方)之间的同步,初始化速度减慢,每秒执行的次数少于5次。值得注意的是,在对DAAP进行模糊测试时,被测服务器需要大约2秒才能可靠地完成初始化,因此模糊测试速度显著下降。
状态识别(基于机器学习的车联网协议状态识别建模)
协议模糊测试的目标是生成覆盖协议状态的测试。一个重要的开放研究领域是在协议状态机的正式规范不可用时执行模糊测试(例如,使用模型推理技术,通过试错来反转协议)。在ProFuzzBench中,当协议没有在消息中编码当前状态的时候(例如,RTSP协议),如何在运行时识别协议当前状态是他们没有解决的问题。