协议模糊测试

admin 2022年5月10日02:49:42评论1,751 views1字数 8265阅读27分33秒阅读模式

前言

Introduction

模糊测试作为一种常用的软件测试技术,其目的是寻找软件系统或给定目标程序的漏洞。在系统的开发与调试过程中,模糊测试也可以找到那些我们可能没有注意到的缺陷。模糊测试的对象可以是应用程序、操作系统、数据库、通信协议栈、智能合约等。在1989年,Miller等人首次提出使用模糊测试技术来测试UNIX程序[1]。经过三十多年的发展,越来越多的开源模糊测试工具被提出,模糊测试技术受到了学界和工业界越来越多的关注。

在互联网飞速发展的今天,许多本地应用都是在B/S模式下转化为网络服务:服务器部署在网络上,而客户端应用程序通过网络协议与服务器通信。网络协议的安全性测试成为一个重要的问题。协议中的安全问题可能会产生比本地应用更严重的损害,如拒绝服务、信息泄露等。与基于文件的模糊测试相比,协议模糊测试面临着更多的挑战,主要体现在:

🔹 网络服务可能会定义它们自己特有的通信协议,有时我们也称其为“专有协议”或“私有协议”,而这些协议标准往往不公开。此外,即使是有文档规范的协议,其具体实现也不一定能严格遵循诸如RFC文档之类的规范。

🔹 协议模糊器需要与被测目标建立通信连接,然后将生成的符合协议规范的测试用例发送给被测目标。建立通信的过程和发送测试用例的过程会带来额外的开销,因此协议模糊测试吞吐量往往低于本地文件模糊测试的吞吐量。

🔹 协议模糊测试的被测目标通常具有很大的状态空间,有时需要精心构造特定顺序的消息序列才能到达某一状态。早期的协议模糊测试工具常采用基于生成的方式进行黑盒模糊测试,这种方式依赖于协议格式的先验知识来生成有效的模糊测试用例,并且由于黑盒的特性,很难探索深层次的漏洞。

协议模糊测试工具汇总

Summary of Protocol Fuzzing Tools

早期的网络协议模糊器主要以黑盒的方式运行,通常是盲目地、持续地生成消息,并将消息发送到位于给定IP地址和端口的被测服务SUT(server under test)。尽管黑盒模糊测试很容易实现,但由于在模糊过程中缺乏SUT的内部反馈,导致代码覆盖率和漏洞发现效率具有局限性。近年来,随着灰盒模糊测试工具AFL[2]的流行,研究者开始将AFL中基于程序反馈与遗传算法的灰盒模糊测试思想引入到协议模糊测试中,有效提高了协议模糊测试的性能。表1总结了常见的协议模糊测试工具,简要介绍了它们所使用的方法。

表1 常见的协议模糊测试工具汇总

协议模糊测试

协议模糊测试研究进展

Advances in Protocol Fuzzing

网络协议模糊测试技术已经发展了约20多年,相关的工具与技术也逐渐成熟。在本节中,我们通过时间顺序回顾了网络协议模糊测试技术的研究进展。图1展示了协议模糊测试发展的时间线。

协议模糊测试

图1 协议Fuzz发展时间线

1

黑盒协议模糊测试

Blackbox Protocol Fuzzing

在2001年,奥卢大学安全编程组开发的一个对协议中特定字段进行模糊测试的可重用测试套件PROTOS[3]。PROTOS提供了一些异常元素注入和测试用例生成的原语,根据这些原语来生成能够使待测目标产生错误的测试用例。具体来说,PROTOS利用定义的原语,将协议规范中的特定字段替换为默认初始值或特定的边界值(本质上是一种可模糊测试字段值排列组合),因此只能测试边界条件或违反协议规范的情况;此外,PROTOS被测的目标协议是无状态协议,并且仅对协议中的特定字段进行简单的可选值替换,因此只能寻找到一些浅层的漏洞。尽管PROTOS灵活性差、适用范围小,但它仍然是协议模糊测试技术发展的一个重要起点。

在2002年,Dave提出并开发了一个基于块的协议模糊测试框架SPIKE[4]。与PROTOS不同,该框架通过扁平化协议栈的方法来解除不同层协议之间的耦合性,同时提供基于块的原语来构建定制模糊器的API。在SPIKE中,一个协议被分为一系列的块,块与块之间互相独立且自动进行模糊测试,由模糊测试引起的块大小的变化会被SPIKE自动处理。然而,SPIKE提供的块抽象是相当低级的,不能对有状态的协议和复杂报文及其依赖关系进行建模。

在2004年,Michael发布了一个可扩展的协议模糊测试框架Peach[5]。测试人员可以利用Peach Pit(XML格式)文件来对各种各样的对象进行模糊测试,其中就包括网络协议,因而Peach具有很好的可扩展性。但因为其黑盒的特性,Peach生成测试用例的随机性强,且不能根据程序运行时的信息来动态调整种子筛选和变异策略,因此在性能和效率上不如白盒或灰盒模糊测试工具。

为了创建能够对有状态协议进行模糊测试的工具,Greg等人在2006年提出一个构建灵活、面向安全、多协议的模糊测试工具SNOOZE[6]。SNOOZE提出了一种基于场景的模糊测试方法,该方法进一步要求用户通过指定消息顺序来预先构建交互场景,以实现对有状态协议的模糊测试。图2展示了SNOOZE的主要构成组件,其中解释器负责运行模糊测试,它将一组协议规范、一组用户定义的Fuzzing脚本和一个模块实现脚本原语作为输入;而协议规范使用XML语言定义了协议的一般特征,包括协议类型、协议头的通用格式、报文语法、允许的报文流等。SNOOZE允许测试人员描述协议中的有状态操作和每个状态下生成的消息。除此之外,SNOOZE还提供了针对特定攻击的模糊测试原语,允许测试人员专注于特定类型的漏洞。但是,SNOOZE中使用的协议规范和用例描述起来比较复杂,而且也没有解决模糊测试过程中获得的通信状态与被测试协议实体之间状态同步的问题。

协议模糊测试

图2 SNOOZE架构图

在2009年,Pedram在GitHub上发布了一个开源协议模糊测试框架Sulley[7],后来由Boofuzz[8]替代。与SPIKE类似,Sulley采用基于块的单一序列请求生成方法,该方法将协议划分为不同的块,然后选用不同的变异策略来生成不同块的测试用例。Sulley为用户提供了大量的数据格式(原语)来描述协议,测试人员在测试之前需要使用这些数据格式来定义所有核心的块,这些块在模糊测试过程中会产生变异与合并,从而生成新的测试用例。然而Sulley脚本需要人工编写,整体工作量较大,这使得该框架自动化程度不高,同时Sulley生成的测试用例基于脚本所定义的单一块序列,因此不能有效探索网络应用程序的状态空间。

为了减少模糊测试之前对先验知识和人工工作的依赖,Gorbunov等人在2010年提出了可扩展的自动化模糊测试框架AutoFuzz[9]。该框架作用在客户机和服务器之间(如图3所示),因此它可以截获它们之间通信会话数据,并自动的从记录的会话中提取网络协议实现的规范。具体来说,AutoFuzz捕获采样的会话并构造一个用来表示协议状态的有限状态自动机FSA,同时使用通用消息序列构建算法将静态数据字段与变量数据字段分离,最终得到表示消息格式的通用消息序列GMS。AutoFuzz为FSA中每一个状态转移分配一个特定的GMS,并在模糊测试过程中用于指导测试用例的生成。

协议模糊测试

图3 AutoFuzz代理模型

Gascon等人在2015年提出了一种针对专有网络协议的状态黑盒模糊测试方法Pulsar[10]。该方法将模糊测试的概念与自动协议逆向工程和仿真技术相结合,通过观察专有协议的流量,推断报文格式和协议状态生成模型,该模型既可以用来分析协议,也可以用于模拟通信。在模糊测试过程中,使用这种模拟通信的方法可以有效探索协议状态空间,从而发现协议实现中的深层漏洞。

同样在2015年,Ruiter等人提出了一种对TLS协议进行Fuzz的方法[11]。他们使用了状态机学习,该方法仅依赖于黑盒测试来推断协议具体实现中的状态机,然后对获得的状态机进行人工分析,找到可能暴露程序逻辑缺陷的行为。然而,该方法需要大量人工的参与,而且也无法检测到后门或是消息解析过程中出现的漏洞。

2

有状态灰盒协议模糊测试

Stateful Graybox Protocol Fuzzing

随着模糊测试工具AFL[2]的流行,越来越多的研究人员将AFL中程序反馈与遗传算法的灰盒思想应用于协议模糊测试中。

在2020年,Pham等人在AFL的基础上提出了首个有状态灰盒协议模糊测试工具AFLNET[12]。与大部分现有的协议模糊测试工具相比,AFLNET采用变异的策略,使用服务器的响应码来识别服务器的状态,并使用状态反馈来指导模糊测试过程,其整体架构如图4所示。AFLNE将服务器和客户端之间的信息交换记录作为种子输入,因而不需要协议规范或消息语法。AFLNET作为一个客户端,重复向服务器发送变化的种子,并保留那些能有效增加代码或状态空间覆盖率的种子。AFLNET通过服务器响应码识别由消息序列探索到的服务器状态。通过这样的反馈,AFLNET可以确定状态空间中的未被探索的区域,并系统地引导整个模糊测试过程向这些区域探索。然而,ALFNET本身也存在一些问题:① AFLNET使用粗粒度的响应报文状态码作为网络应用程序的状态,但这种状态码有时不能反映协议的真实状态,从而造成状态冗余,影响模糊测试的性能;② 为了到达某一状态,AFLNET需要发送较长的前缀消息,由此带来的额外开销使模糊测试的吞吐量极低;③ AFLNET与SUT之间缺少同步机制,导致模糊器无法得知SUT是否已经处理完发送的消息,因此模糊器需要设置一定的时间延迟等待SUT的响应报文。④AFLNET更倾向于更快到达目标状态的消息序列,而这样的消息序列通常较短,很难覆盖更深层次的状态。

协议模糊测试

图4 AFLNET整体架构图

为了精确识别网络服务的状态,Natella在AFLNET的基础上,使用细粒度的长生命周期变量表示程序的状态,设计并实现了模糊器StateAFL[13]。如前面所述,AFLNET依赖于响应消息的内容来推断协议状态,因此必须使用特定的协议解析器来定制AFLNET,以便从消息中提取状态码。StateAFL设计核心在于网络服务应用程序都是基于网络事件循环,当接收到客户端发来的消息时,网络事件循环对该消息进行处理,处理完成后,重新等待新消息的到来。在此循环过程中,长生命周期变量的更新在一定程度上能够反映程序的状态,而短生命周期变量仅在循环内有效,因此使用更细粒度的长生命周期变量来表示状态。具体来说,在编译时插桩阶段,StateAFL不仅在代码分支处插入原生AFL提供的用于统计覆盖率信息的桩代码,还在内存分配/释放处插入一套新设计的桩代码。这样,在服务端程序运行时,相应的长生命周期变量的内存信息将作为状态信息反馈给模糊器,模糊器根据该信息来确定更细粒度的状态,由此StateAFL也不需要手工定制额外的协议解析器。图5展示了StateAFL的整体架构。

协议模糊测试

图5 StateAFL整体架构图

为了进一步提升AFLNET模糊测试吞吐量,Andronidis等人提出了一个新的网络应用模糊测试框架SnapFuzz[14]。该框架在AFLNET的基础上,将AFLNET中的异步网络通信转换为基于UNIX套接字通信以增加通信速度,同时通过将所有文件操作重定向到内存中的文件系统来加速所有文件操作,消除了额外的时间开销。图6展示了SnapFuzz的整体架构。需要注意的是,SnapFuzz并没有对AFLNET中的模糊测试算法和变异策略进行任何修改,仅通过修改底层架构和引入先进系统来减少相关时间开销,以提高模糊测试的吞吐量。

协议模糊测试

图6 SnapFuzz整体架构图

有状态覆盖灰盒模糊测试SCGF速度慢的原因在于模糊器需要发送很多的前缀消息。具体来说,要使SUT达到目标状态,模糊器就需要发送特定长度的前缀消息使SUT处于目标状态,如果前缀消息过长,那么在发送和接受消息时将会带来额外的开销。此外,不同长度的前缀消息往往能够到达不同深度的目标状态,前缀消息越长,往往越能探索更深的状态。Li等人引入进程快照技术来解决SCGF吞吐量低的问题,同时提出消息链分析算法(MCA)来覆盖更深层的代码,在AFLNET的基础上实现了SNPSFuzzer[15]。SPNSFuzzer整体架构如图7所示。SNPSFuzzer使用CRIU作为快照器,为处于不同状态的SUT拍摄快照,当下次该状态作为目标状态进行模糊测试时,恢复快照以使SUT直接处于目标状态。此外,SNPSFuzzer使用消息链分析算法MCA保存消息链中前缀消息最长的目标状态的快照,由于使用了快照技术,发送前缀消息的开销可以忽略不计,前缀消息的长度不受限制,SUT可以处于更深层次的目标状态,更有利于发现深层次的漏洞。

协议模糊测试

图7 SNPSFuzzer整体架构图

Qin等人设计并实现了NSFuzz[16],该模糊器显著地改善了协议模糊测试的吞吐量,其工作流程如图8所示。NSFuzz的设计理念主要有两点:①作者注意到网络应用程序的本质使用一个网络事件循环来监听收到的消息,接着对消息进行处理。只需找到网络事件循环的入口点,然后在入口点处告知模糊器SUT已经结束对上一条消息的处理,模糊器可以直接将下一条消息发送给SUT,因此减少模糊器发送下一条消息前的等待时间,从而提高模糊测试吞吐量;②在StateAFL中,为了收集长周期变量的内容,引入了昂贵的插桩开销和计算开销,而NSFuzz使用轻量级的状态变量来表示更细粒度的状态。需要注意的是,NSFuzz通过执行前离线静态分析寻找网络事件循环的入口点,同时提取关键状态变量。NSFuzz模糊测试效率发现显著优于几个最先进的灰盒协议模糊测试的工具,但其局限性也很突出,主要体现在静态分析方面。目前的静态分析仅支持C语言的目标程序,对于C++程序,很难构建准确的调用图,从而影响分析结果;此外,一些网络应用程序使用事件驱动库来构建其服务程序,给寻找入口点带来很多的麻烦。

协议模糊测试

图8 NSFuzz工作流程图

结语

Conclusion

协议模糊测试的发展以AFLNET工具为分界线。在AFLNET提出之前,主流的协议模糊测试工具采用黑盒的方法,由于黑盒测试不能得到SUT的反馈,模糊测试很难有效探索协议的状态空间;在AFLNET提出之后,基于覆盖的有状态灰盒模糊测试成为协议模糊测试的主流方法。有状态的灰盒协议模糊测试使用SUT返回的状态作为反馈信息来进行指导,状态可以由SUT响应报文中的粗粒度的响应码表示(AFLNET),也可以由SUT中细粒度的变量值表示(StateAFL和NSFuzz)。

未来协议模糊测试技术的研究应侧重于两点:一是改进种子筛选策略,以更快更有效地发现深层次的漏洞。虽然AFLNetLegion[17]也进行了种子筛选方面的研究,将Legion算法引入AFLNET的种子筛选过程,但由于整体模糊测试吞吐量较低,AFLNetLegion在状态选择方面与AFLNET差异性不大。二是引入状态感知和结构感知的变异,使模糊测试变异阶段能够生成更有效、更有价值的测试用例。

协议模糊测试

参考文献

[1] Miller B P, Fredriksen L, So B. An empirical study of the reliability ofUNIX utilities[J]. Communications of the ACM, 1990, 33(12): 32-44.

[2] Website, “American fuzzy lop (afl) fuzzer,” http://lcamtuf.coredump.cx/afl/technicaldetails.txt, 2017, accessed: 2017-05-13.

[3] Kaksonen R , Laakso M , Takanen A . System Security Assessment throughSpecification Mutations and Fault Injection[J]. Kluwer, B.V. 2001.

[4] Aitel D. The advantages of block-based protocol analysis for securitytesting[J]. Immunity Inc., February, 2002, 105: 106.

[5] PeachTech, “Peach fuzzing platform.” [Online]. Available: https://www.peach.tech

[6] Banks G, Cova M,Felmetsger V, et al. SNOOZE: toward a Stateful NetwOrk prOtocolfuzZEr[C]//International conference on information security. Springer, Berlin,Heidelberg, 2006: 343-358.

[7] OpenRCE/sulley, Sulley, GitHub. [Online]. Available:https://github.com/OpenRCE/sulley. Accessed on: Jul. 12, 2016.

[8] J. Pereyda, “Boofuzz: A fork and successor of the sulley fuzzing framework.”[Online]. Available: https://github.com/jtpereyda/boofuzz

[9] Gorbunov S, Rosenbloom A. Autofuzz: Automated network protocol fuzzingframework[J]. IJCSNS, 2010, 10(8): 239.

[10] Gascon H, Wressnegger C, Yamaguchi F, et al. Pulsar: Stateful black-boxfuzzing of proprietary network protocols[C]//International Conference onSecurity and Privacy in Communication Systems. Springer, Cham, 2015: 330-347.

[11] De Ruiter J, Poll E. Protocol State Fuzzing of {TLS}Implementations[C]//24th {USENIX} Security Symposium ({USENIX} Security 15).2015: 193-206.

[12] Pham V T, Böhme M, Roychoudhury A. AFLNet: a greybox fuzzer for networkprotocols[C]//2020 IEEE 13th International Conference on Software Testing,Validation and Verification (ICST). IEEE, 2020: 460-465.

[13] Natella R. StateAFL: Greybox Fuzzing for Stateful Network Servers[J].arXiv preprint arXiv:2110.06253, 2021.

[14] Andronidis A, Cadar C. SnapFuzz: An Efficient Fuzzing Framework forNetwork Applications[J]. arXiv preprint arXiv:2201.04048, 2022.

[15] Li J, Li S, Sun G, et al. SNPSFuzzer: A Fast Greybox Fuzzer for StatefulNetwork Protocols using Snapshots[J]. arXiv preprint arXiv:2202.03643, 2022.

[16] Qin S, Hu F, Zhao B, et al. Registered Report: NSFuzz: Towards Efficientand State-Aware Network Service Fuzzing[J].

[17] Liu D, Pham V T, Ernst G, et al. State Selection Algorithms and TheirImpact on The Performance of Stateful Network Protocol Fuzzing[J]. arXivpreprint arXiv:2112.15498, 2021.



原文始发于微信公众号(FuzzWiki):协议模糊测试

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月10日02:49:42
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   协议模糊测试http://cn-sec.com/archives/993819.html

发表评论

匿名网友 填写信息