协议模糊测试相关技术梳理
一、协议模糊测试梳理
1. 协议模糊测试特殊在哪?
协议规范(protocol specification)定义了网络报文的格式(format)和报文序列的发送顺序(order)。其中,格式包括了两部分内容,一是语法(syntax),语法定义了一个报文的字段划分、字段长度、以及其中的数据类型;另一个是语义(semantic),语义定义了字段值的功能,比如是作为keyword标记报文类型、或是payload作为数据载体等。报文发送顺序一般由有限状态机描述(FSM),对于有状态协议而言,需要按照协议规定的顺序发送报文才能使协议实现正常运行。
图1.协议报文的格式[1]
图2.状态机[1]
网络协议模糊测试可以分为两大部分内容(图3),一部分是协议规范的推断,另一部分是模糊测试方面的提升。由于协议规范的定义,网络协议程序具有大量的格式和状态检查操作,所以传统的文件模糊测试方法是不适用的,需要在一定程度上获取协议规范的知识,在此基础上设计模糊测试工具才能达到更高的覆盖率。
图3.网络协议模糊测试
2. 协议模糊测试工具的分类
为了更好地分析协议模糊测试相关工作所采用的技术,协议模糊测试的工具可以按以下三大类指标进行分类。
(1) 获取协议规范的技术手段
图4.按技术手段分类
(2) 目标协议
图5.按目标协议分类
(3)模糊测试方法
···· 图6.按模糊测试方法分类
3. 协议推断技术手段的重点探讨
因为业内的研究重点多在协议规范的推断方面,所以我基于其技术手段,总结了41个相关论文和工具。其中采用人工描述协议规范的工作有15个,采用收集流量利用静态方法进行推断的工作有21个,采用目标程序的动态分析的工作15个,有的工作利用了以上两种或三种技术的结合。
(1) 人工描述协议规范
这种方法是通过人工获取公开的协议规范,并且利用描述语言(xml, BNF表达式, 自定义描述语言)的方法让模糊测试器了解协议规范的知识。该方法直白、可以获得的基础覆盖率较高,但是存在着人力消耗大、自动化程度低、易出错等致命问题。其中比较经典的工作有peachfuzz、boofuzz等。 如图7是peachfuzz的描述文件,该文件通过xml结构化描述了字段指的类型、长度等信息。图8是FTP协议报文的boofuzz的描述文件,boofuzz的描述语言为python实现的函数,在此基础上可以描述目标报文的格式和测试报文发送顺序。
图7.peachfuzz的描述文件peach-pit
图8. boofuzz的描述文件
(2) 收集流量利用静态方法进行推断
这种方法首先会通过在服务器和客户端之间收集大量的需要测试的协议的报文,然后采用聚类、序列对齐、机器学习等方法进行协议格式或状态机的获取。这类核心思想是利用统计的方法对大量的数据静态分析,提取出模板。
AFLNET也是属于这种类型的模糊测试工具,该工具是2020年ICST会议上发表的为测试网络协议而结合AFL设计的最新工作,系统的框架图如图9所示。
首先,用户通过wireshark等抓包工具收集到网络报文,在aflnet.c中实现request sequence parser的函数后,parser对报文流进行划分,放入初始种子池,并建立初始状态机(状态机的每个状态是由对应的相应报文的状态码标识)。每轮测试时,从状态机中选择一个目标状态,基于此从种子池中选取其前序的报文序列和后续报文序列,只对目标状态的报文进行变异。变异在原先AFL的以覆盖率为反馈的基础上,添加了以状态为反馈的机制,即可以在状态机中更新状态,便认为当前的变异是值得的。
该工作的创新点在于:
i.在原先的边覆盖率反馈基础上,增加了状态覆盖率反馈
ii.可以进行有状态的fuzzing(对目标状态建立前序、后续报文序列)
但也存在一些局限性:
i.变异策略比较单一
ii.需要对目标协议有一定的知识(在aflnet.c中实现函数)
图9. AFLNET框架图
(3) 目标程序的动态分析
这种方法主要是针对有目标协议程序的代码基础上进行的,主要使用的技术有污点分析、符号化执行、差分分析等。其中最常用的方法是污点分析,核心思想是将报文作为程序的输入并标记,追踪污点传播的过程,记录指令流、函数调用等信息,进而分析报文的格式。同时,该方法还可以通过识别出特定的系统调用从而推断出某些字段的语义信息。特别的是,一些工作通过分析指令流的特征,发现加密等操作发生时,算数、位移指令的比例会大幅度上升,基于此方法去追踪解密后的明文区域。
(4) 方法的对比
4.协议难点
(1)encode问题(加密、压缩、hash等)
• 现在的方案:加密前和解密后从内存取得、模拟target program的加密方法
(2)一些报文间依赖的语义解释
(3)生成报文的有效性(维持格式、状态)
(4)自动化程度与可扩展性
5.未来方向
(1)技术方向
i.协议推断:协议的报文就是一种有语义的序列, field之间本身就具有很多的特征可以学习,可以思考结合NLP等人工智能的方法,能够提升测试的自动化程度。
ii.模糊测试:协议测试的变异策略设计还存在着发展空间,现如今的工具大多只使用了单一的传统的变异方法,而少有考虑到基于协议本身的特性,去设计变异策略。比如,可以进行混合变异,以及考虑到改变时间、配置等环境因素,这些也都会很大程度影响一个协议程序的运行。
(3) 评价方向
从George[2]的《evaluating fuzz testing》一文中得到启发,为了提升模糊测试评估的合理性,应当具备统一合理的的衡量标准以及具有长度适当、漏洞位置明确的测试集支撑。
i.现在使用的评价标准繁杂、缺乏统一标准
比如注重协议规范推断方向的会着重考虑划分准确率召回率、推断状态机的状态覆盖率、状态机简洁程度,生成时间等因素。
注重模糊测试效果的会评估漏洞数量,生成报文的有效性(通过语法语义检查、保持状态的报文数量)对目标程序的覆盖率, 效率等因素。
还有一些工作会对特定漏洞的发现条件,进行探究。
然而,这些工作因为缺乏一个统一的评价标准,所以无法进行测试效果的衡量。
ii.协议模糊测试的工作缺乏一些标准的测试集
像传统模糊测试工具的LAVA、CGC、google suite等测试集,协议测试集的设计也是一个可以考虑的方向。
二、综述写作的心得
自之前的综述投稿经历后,审稿人给我的反馈是从[3]这篇文章中获取一些进行系统性综述的方法。一个系统性的综述写作过程可以参考图10.
参考文献
[1]15s
[2] evaluating fuzz testing
[3] 综述
图10 综述写作流程参考[3]
写作伊始,我们要明白这次写作的目标是什么,能够促进该领域怎样的发展。之后,提出本篇文章研究的问题,这也是整个写作过程的灵魂。研究的问题可以从下图11这几大类里选择。然而,许多人在进行综述写作的时候提出的问题会陷入前两大类“exploratory”和”base-rate”,写作的重点都放在了描述和分类领域内的技术上,这样导致的后果是单纯地列举技术,而缺乏一个具有逻辑性梳理的过程。本文提出希望综述作者们将目光多多投向另外的三类,去分析技术之间潜在的一些关联,以及去思考达到为了达到发展该领域的目标该去进行一些怎样的设计。这样,整篇的写作才能自底向上地总结和升华。
图11 综述写作流程参考[3]
[1] Narayan J , Shukla S K , Clancy T C . A Survey of Automatic Protocol Reverse Engineering Tools[J]. ACM Computing Surveys, 2015, 48(3):1-26.
[2] G. Klees, A. Ruef, B. Cooper, S. Wei, and M. Hicks, “Evaluating fuzz testing,” Proc. ACM Conf. Comput. Commun. Secur., pp. 2123–2138, 2018, doi: 10.1145/3243734.3243804.
[3] Garousi V , Felderer M , Mika V. Mäntylä. Guidelines for including grey literature and conducting multivocal literature reviews in software engineering[J]. Information & Software Technology, 2019, 106(FEB.):101-121.