【论文分享】Nyx-Net: 使用增量快照对网络服务程序进行模糊测试

admin 2022年12月16日20:46:15评论295 views字数 5959阅读19分51秒阅读模式

今天分享的论文主题是面向网络服务程序的基于快照的模糊测试技术 Nyx-Net,由来自德国波鸿大学和荷兰阿姆斯特丹自由大学的研究人员完成。模糊测试是一种热门的自动化进行程序漏洞测试的方法,近年来,为了满足不同目标类型的测试需求,研究人员设计了不同的模糊测试方案。然而,网络服务类程序状态复杂且交互效率较低,现有的模糊测试方案对网络服务没有进行针对性优化,导致测试效率低下。该论文首次尝试使用快照技术解决上述问题,并实现了首个基于模拟网络栈和增量快照的网络服务程序灰盒模糊测试工具 Nyx-Net。该工具在现有的基于快照的模糊测试工具 Nyx 的基础上,实现了针对网络服务的增量快照功能以及模拟网络栈交互功能,其表现相较于现有的模糊测试方案,测试吞吐量最高提升了 300 倍,覆盖率达到了 70 % 以上,并在 Lighttpd, MySQL Client, Firefox 等软件项目中发现了数个安全漏洞。论文发表于高性能计算方向重要学术会议 EuroSys 2022(录取率:27.9%)。

【论文分享】Nyx-Net: 使用增量快照对网络服务程序进行模糊测试

全文共 3500 字,阅读时间约 8 分钟。


01

【背景介绍】


模糊测试(Fuzzing)是一种自动化的漏洞挖掘技术,简单来说,模糊测试过程就是不断地按照一定的生成或变异策略生成测试用例,输入至被测程序中,尝试使被测程序达到目标状态(如:崩溃等)。


这个过程可以视作一次对能够达到目标状态输入的搜索过程,如果仅采用随机方法生成测试用例,将带来巨大的搜索空间,导致寻找漏洞的效率低下。现有的模糊测试方法大多采用了边覆盖情况指导测试用例生成变异过程,边覆盖率越高意味着产生的测试用例触发了越多的代码,因此发现漏洞的概率也会更大。除此之外,由于被测程序往往只接受高度结构化的输入,模糊测试工具还需要根据被测程序的特点调整测试用例生成变异策略和执行方法,以提高测试用例的通过率。


本文主要面向网络服务程序进行模糊测试,主要存在网络交互、协议格式和程序状态等影响模糊测试效率的因素。下面分别介绍这三类影响因素及其现有的解决方案。


网络交互(针对网络服务的模糊测试)

为了提高处理程序的性能,当前大多数网络服务的服务端程序采用了内存不安全语言编写(C 语言),很容易出现内存安全问题,如缓冲区溢出等。而网络服务一般会暴露在互联网上,相较于传统的二进制程序,攻击者能更加容易地发起攻击。模糊测试技术能够很好地发现潜在的安全问题。


为了对网络服务类程序进行模糊测试,研究人员提出了多种方案。比如,AFLNET[2] 通过将原版 AFL 的单文件标准输入形式修改为使用 Socket 向目标监听端口发包,实现了对网络服务程序的测试。然而 Socket 交互的效率较低,因此有研究人员提出了将基于 Socket 的 I/O 转换为基于文件的 I/O 的方法[3],以直接使用现有的模糊测试工具,同时提高测试效率。


然而,现有的解决方案有如下的缺点:

  • 由于网络服务程序大多是带状态的,在AFLNET 中强制要求用户编写清理脚本恢复状态,较为不便;同时,AFLNET 在发送数据时,采用了固定的等待时间,对于超时时间未知的新程序,需要手动指定这个等待时间值,同时等待的时间过长,导致测试效率低下;

  • 在现代操作系统中,网络相关的 API 远远慢于文件操作。常见的解决方案是使用文件操作替代网络操作,比如 libpreeny[3] 引入了一种“去 Socket 化”操作,在建立连接后不返回 Socket 的文件描述符,而是直接返回标准输入的文件描述符。这种方法大大提升了网络交互的性能,但由于大多数在 Socket 上的操作在标准输入上无法实现,测试的准确性会大大降低。

在本文实现的 Nyx-Net 中,作者设计了模拟网络栈方法来解决现有工具的上述缺点,将在下一个部分进行详细介绍。


协议格式(针对协议的模糊测试)

相较于处理静态文件格式的一般程序,网络服务程序的交互性更强且隐含数据格式要求,因此更为复杂。同时,网络服务通常还引入了压缩、加密、序列号、校验码等机制,增加了测试用例生成的难度。


现有的针对网络协议的模糊测试方案可以分为以下两类:

  • 无反馈盲生成的模糊测试:向目标程序发送生成的随机但合法的测试用例。此类模糊测试依赖大量的被测协议相关的专家知识,消耗人力较多;

  • 带反馈的模糊测试:利用类 AFL 遗传算法,在仅知道少量甚至不知道任何格式信息的情况下,利用覆盖反馈也能产生效果较好的测试用例。但如果要更好地利用覆盖反馈这一优势,测试者也需要编写满足被测程序要求的生成器和变异器。


现有的 AFLSmart[4] 和 Nautilus[5] 工具能够根据用户给定的语法或格式描述,生成或变异出满足格式要求的输入。其中 Nautilus 不要求用户提供初始种子,更注重测试用例生成。本文的前置研究 Nyx 也不需要初始种子,实现了一种输入生成方法,允许用户以“带类型函数调用序列”的形式声明输入格式。

【论文分享】Nyx-Net: 使用增量快照对网络服务程序进行模糊测试

图表 1:Nyx 中同时处理多个连接的 opcode 定义


在 Nyx 中,用户需要定义一组 opcode,指定一次模糊测试过程的操作。上图展示了在 Nyx 中同时处理多个连接的 opcode 定义。d_bytes 包含要发送的数据包内容,n_con 定义了创建新连接的 opcode,n_pkt 定义了通过 n_con 创建的连接发送 d_bytes 数据包的 opcode。Nyx 执行上述 opcode 即可产生输入、建立与被测程序的连接并执行输入。


程序状态(基于虚拟机快照的模糊测试)

正如之前提到的,许多网络服务程序在多次访问中维护了一个全局的状态,这可能导致先前执行的测试用例影响后续执行测试用例的结果;还有些网络服务程序的启动过程较为缓慢,如果为了重置状态在每次执行后重启程序,将极大地降低测试效率。


快照技术能够很好地解决上述两个问题。简单来说,快照就是在程序就绪后记录状态信息,在单次测试结束后恢复这些状态。使用增量快照的话,恢复快照的时间仅取决于单次执行对状态修改量。现有的 AFL++、Agamotto[6] 和 Nyx 工具都实现了快照机制提高测试性能。


Nyx-Net 继承了 Nyx 中的快照机制。Nyx 在 QEMU 中运行被测程序,复用 QEMU 和 KVM 现有的快照功能。每次测试后对整个内存空间进行覆盖效率较低。Nyx 基于 KVM 维护的内存“脏页”表,实现对内存已修改区域的快速恢复。

02

【系统设计】

【论文分享】Nyx-Net: 使用增量快照对网络服务程序进行模糊测试

图表 2:Nyx-Net 总体结构


Nyx-Net 使用基于虚拟机快照的模糊测试技术:被测目标运行在虚拟机中,模糊测试器运行在宿主机中,二者通过共享内存的形式通讯。虚拟机快照相较于进程快照,能够更好地确保内核网络连接、文件系统、其他依赖进程的状态被正确地重置。即使采用了快照技术,对网络服务程序进行测试还存在如下几个挑战:


1. 在虚拟机内建立新的网络连接涉及多次上下文切换,导致测试效率低下;

2. 在网络服务程序在建立连接时,往往有复杂的握手过程,在握手之后才会收发实际的应用数据;

3. 消息格式往往比较复杂,对所有可能的情况编写策略较为麻烦,导致 Nyx 中的纯生成方法不适用于网络服务程序。


针对以上三个挑战,作者提出了模拟网络栈、增量快照和复杂输入生成三个技术,下面将分别介绍这三个技术。


模拟网络栈

为了提高网络交互的性能,Nyx-Net 设计了模拟网络栈技术。通过覆写 libc 中 socket 相关函数,如 read、recv、epoll 等,直接编译或使用 LD_PRELOAD 动态链接进目标程序中,实现在用户态进行网络连接的处理。模拟网络栈的优点如下:


1. 能够准确地区分攻击者可控制的输入点,自动化地判断进行初始快照的时机(即第一次接收输入数据的时刻);

2. 避开了操作系统内核中缓慢的网络协议栈处理流程,能够高效地进行模糊测试。


增量快照

一次网络服务协议交互往往包含较长的消息序列,而模糊测试测试过程可能每次只修改其中的一部分。这导致在修改处之前的数据包需要重复发送一次,而极端情况下需要重新发送整个消息序列。


为了解决这个问题,本文提出了增量快照技术:在执行输入的一部分后,在初始快照的基础上再进行一次快照,对剩余部分消息进行变异,执行后恢复至增量快照状态。

【论文分享】Nyx-Net: 使用增量快照对网络服务程序进行模糊测试

图表 3:增量快照示意


如上图所示,在执行了 Pkt1 和 Pkt2 后进行增量快照,之后对 Pkt3 到 Pkt5 进行变异操作,产生新的输入,测试后恢复到增量快照,避免了 Pkt1 和 Pkt2 的重复执行。作者发现在运用增量快照后,部分场景的测试吞吐量提升了超过 10 倍。


针对增量快照点的选取,本文提出了两种策略。1)“平衡型”策略(balanced):该策略有 4% 的概率不进行增量快照,如果进行增量快照,则有 50% 的概率选择一个随机的下标,50% 的概率选择中点做增量快照;2)“激进型”策略(aggressive):循环所有可进行增量快照的下标,首先在输入的末尾创建增量快照,当对该快照进行 50 次模糊测试后仍未找到新的输入,则在前一个下标处创建增量快照,以此类推。


这两种选取策略的效果将在效果评估部分进行介绍。


复杂输入生成

之前介绍了 Nyx 支持用户自定义一组 opcode 以适应任意的被测对象,但并不支持使用现有的网络流量作为种子,而网络协议很难使用 Nyx 的 opcode 进行准确地描述。本文实现了将原始流量 PCAP 包转换为 Nyx 字节码输入的 Python 库。

【论文分享】Nyx-Net: 使用增量快照对网络服务程序进行模糊测试

图表 4:使用 PCAP 和图表 1 中的 opcode 定义生成的 Nyx 字节码输入


简单来说,图表 1 中的代码定义了输入中的操作(opcode),实际执行时需要使用定义的 opcode,生成如图表 4 中展示的字节码。本文实现的 Python 库能够根据 PCAP 流量包中的数据和 opcode 定义,生成如图表 4 中带有实际发送数据的 Nyx 字节码输入。


03

【效果评估】


本文将实现的 Nyx-Net 原型与其他主流的网络服务模糊测试工具相比较,最终发现 Nyx-Net 测试绝大多数目标时的表现优于其他主流模糊测试工具。


在测试的效率和覆盖率方面,使用 ProFuzzBench 测试时,Nyx-Net 达到了更高的覆盖率,同时效率平均是其他工具的 10 倍到 100 倍,有时甚至达到了 1000 倍,证明了 Nyx-Net 的高效性。


在测试结果方面,Nyx-Net 找到了 ProFuzzBench exim、proftpd 两个目标中的其他模糊测试工具未发现的漏洞,证明了 Nyx-Net 的有效性。


在实际应用方面,本文还使用 Nyx-Net 对 Lighttpd、MySQL 客户端和 Firefox IPC 进行了测试,最终发现了多个漏洞,并且得到了 Modzilla 的认可,证明了 Nyx-Net 的实际运用价值。


【论文分享】Nyx-Net: 使用增量快照对网络服务程序进行模糊测试

图表 5:AFLNET 和 Nyx-Net 测试 ProFuzzBench 10 个目标分支覆盖率中位数对比(可以看到 Nyx-Net 明显优于 AFLNET)


【论文分享】Nyx-Net: 使用增量快照对网络服务程序进行模糊测试

图表 6:Nyx-Net 与其他网络服务模糊测试工具进行 10 次 24 小时测试后分支覆盖率中位数对比


【论文分享】Nyx-Net: 使用增量快照对网络服务程序进行模糊测试

图表 7:Nyx-Net 与其他网络服务模糊测试工具进行 10 次 24 小时测试后测试吞吐量(每秒执行次数)对比


04

【总结】


为了对网络服务程序进行高效地模糊测试,本文基于虚拟机快照技术,在现有的 Nyx 研究的基础上,实现了一个模糊测试工具 Nyx-Net。Nyx-Net 主要包含模糊网络栈、增量快照和复杂输入生成三项关键技术。经过系统评估,发现 Nyx-Net 的效率和覆盖率优于主流网络服务模糊测试工具,同时在对 Lighttpd、MySQL 客户端、Firefox 进行实际测试中,找到了多个安全漏洞,得到了 Modzilla 的认可。

05

【思考与展望】


作者在总结中提到,Nyx-Net 中实现的模拟网络栈在部分更复杂的情况下还没有做到 100% 的准确模拟,比如需要同时进行多个网络连接的情况。因此,未来工作可以对模拟网络栈这一部分做进一步的完善,使其能够覆盖更多的应用场景。


笔者在阅读这篇论文后,认为在输入生成部分,直接沿用 Nyx 的 opcode 定义模式较为繁琐,同时 Nyx-Net 实现的基于 PCAP 生成字节码的 Python 库也很难覆盖被测程序支持协议的所有输入空间。在这方面可以考虑与现有的基于语法的模糊测试方案(如 NAUTILUS)相结合,基于被测程序支持协议的语法定义,生成能够覆盖更多输入空间的测试用例。


原文链接

https://arxiv.org/pdf/2111.03013.pdf

开源工具链接

https://github.com/RUB-SysSec/nyx-net

参考文献

[1] Schumilo, Sergej, et al. "Nyx-net: network fuzzing with incremental snapshots." Proceedings of the Seventeenth European Conference on Computer Systems. 2022.

[2] Van-Thuan Pham, Marcel Böhme, and Abhik Roychoudhury. AFLNET: A Greybox Fuzzer for Network Protocols. In IEEE International Conference on Software Testing, 2020.

[3] Yan Shoshitaishvili. Preeny. https://github.com/zardus/preeny. November 5, 2021.

[4] V. Pham, M. Bohme, A. E. Santosa, A. Caciulescu, and A. Roychoudhury. Smart greybox fuzzing. IEEE Transactions on Software Engineering, 47(09), 2021.

[5] Cornelius Aschermann, Tommaso Frassetto, Thorsten Holz, Patrick Jauernig, Ahmad-Reza Sadeghi, and Daniel Teuchert. Nautilus: Fishing for Deep Bugs with Grammars. In Symposium on Network and Distributed System Security (NDSS), 2019.

[6] Dokyung Song, Felicitas Hetzelt, Jonghwan Kim, Brent Byunghoon Kang, Jean-Pierre Seifert, and Michael Franz. Agamotto: Accelerating kernel driver fuzzing with lightweight virtual machine checkpoints. In USENIX Security Symposium, 2020.



编辑&审校|刘保君、张一铭



原文始发于微信公众号(NISL实验室):【论文分享】Nyx-Net: 使用增量快照对网络服务程序进行模糊测试

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年12月16日20:46:15
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【论文分享】Nyx-Net: 使用增量快照对网络服务程序进行模糊测试https://cn-sec.com/archives/1469478.html

发表评论

匿名网友 填写信息