2018-可编程模糊测试技术

摘 要: 模糊测试是一种有效的漏洞挖掘技术.为了改善模糊测试因盲目变异而导致的效率低下的问题,需要围绕输入特征、变异策略、种子样本筛选、异常样本发现与分析等方面不断定制模糊测试器,从而花费了大量的定制成本.针对通用型模糊测试器(即支持多类输入格式及目标软件的模糊测试器)的低成本定制和高可扩展性需求,提出了一种可编程模糊测试框架,基于该框架,漏洞挖掘人员仅需编写模糊测试制导程序即可完成定制化模糊测试,在不降低模糊测试效果的基础上,可大幅提高模糊测试器开发效率.该框架包含一组涉及变异、监控、反馈等环节的模糊测试原语,作为制导程序的基本语句;还包含一套编程规范(FDS)及 FDS 解析器,支持制导程序的编写、解析和模糊测试器的生成.基于实现的可编程模糊测试框架原型Puzzer,在26个模糊测试原语的支持下,漏洞挖掘人员平均编写 54 行代码即可实现当前主流的 5 款万级代码模糊测试器的核心功能,并可覆盖总计 87.8%的基本操作.基于Puzzer 实现的 AFL 等价模糊测试器,仅用 51 行代码即可达到与 AFL 相当的模糊测试效果,具有良好的有效性.
1 研究动机
1.1 模糊测试器复杂度高
1.2 模糊测试器相似度高
1.3 定制模糊测试器成本高
1.4 可编程模糊测试框架
基于以上分析,为了从快速构建契合目标程序的模糊测试器这一新的角度来实现模糊测试器的全流程定制,本文提出了可编程模糊测试技术并实现可编程模糊测试框架,使用该框架可实现以下功能.
(1) 针对通用型黑/灰盒模糊测试器,基于制导程序实现模糊测试流程中各个环节间的全流程、快速、定制化构建;
(2) 基于可编程接口,实现模糊测试原语库的扩展;
(3) 基于 FDS 解析器,支持制导程序的容错和调试,实现模糊测试全流程的监控,辅助漏洞挖掘人员优化模糊测试器.
2 可编程模糊测试技术
2.1 方法概述
传统的模糊测试器构建方式如图 2(a)所示,漏洞挖掘人员使用 C,C++,Python 等编程语言实现模糊测试器.采用传统方式,由于测试需求的不同,漏洞挖掘人员需要花费大量的精力在模糊测试器代码编写以及先进方法集成的过程中.而本文所提出的可编程模糊测试技术构建方式如图 2(b)所示,漏洞挖掘人员通过模糊测试器制导程序编程规范编写程序,使用 FDS 解析器(FDS parser,简称 FDSP)解析程序,最终快速生成基于 Python 代码的模糊测试器.此外,该技术还支持对模糊测试技术方法的灵活、便捷扩展.
在这里插入图片描述
可编程模糊测试技术对传统的模糊测试实现过程进行高层次抽象,将模糊测试各环节抽象为不同的模糊测试原语(fuzzing primitive,简称 FP),使用 FP 编写符合 FDS 规范的程序以达到降低编写模糊测试器的门槛、加快构建速度以及实现技术方法扩展集成的目的.本文首先提出了一种基于模糊测试原语的模糊测试器编写语法规范,使用该规范编写出制导程序(prog);然后,通过 FDS 解析器中的预处理器(preprocessor)对制导程序进行解析,生成模糊测试抽象语法树(fuzzing abstract syntax tree,简称 FAST);模糊测试引擎(fuzzing engine,简称 FE)通过遍历语法树并与模糊测试原语库(fuzzing primitives library)进行交互,最终生成一个基于 Python 语言的模糊测试器.该过程如图 3 所示.
在这里插入图片描述
2.2 语法规范及模糊测试原语
2.3 FDS解析器
FDS 解析器(FDSP)中包含 3 个组件:预处理器、模糊测试引擎以及模糊测试原语库.为了能够将基于 FDS的制导程序 Prog 映射到基于 Python 语言的模糊测试器,并实现对 Prog 的语法检查以及无效语句过滤,本文中使用模糊测试抽象语法树作为中间表示.FDS 解析器的 3 个组件相互调用实现以下 3 个过程:(1) 通过预处理器解析基于 FDS 编写的制导程序,生成模糊测试抽象语法树;(2) 通过模糊测试器引擎遍历语法树,依据语法树在原语库中匹配模糊测试原语;(3) 通过模糊测试引擎模块化整合原语方法,生成基于 Python 语言的定制模糊测试器.
2.3.1 预处理器
2.3.2 模糊测试引擎
本文从中选取了 52 个开源模糊测试器,按照模糊测试器测试的目标程序类型的不同,可将模糊
测试器分为文件类、协议类、浏览器类、库(API、内核)、生成测试用例、测试特定语言、测试命令行、其他.文件类、协议类的模糊测试器占据总数的 52%,本文设计了 3 种模糊测试引擎来支持可编程模糊测试技术在这些类别软件的模糊测试中的应用,分别为描述类测试引擎、非描述类测试引擎以及状态控制引擎.在之后的工作中,还将扩展其他测试引擎来支持其他类别软件的模糊测试需求.
2.3.3 模糊测试原语库
在这里插入图片描述
2.4 基础原语设计
2.4.1 变异基础原语
本文对上述测试目标为文件类、协议类、浏览器类以及 API 类的 38 款模糊测试器所使用的变异方法进行详细的分析统计,其中涉及了 32 种变异基本操作,根据每种方法的特性及作用效果,本文将这 32 种基本操作归纳为 16 种变异原语,归纳出的变异原语如下:确定长度翻转(FlipDeter)、随机长度翻转(FlipRand)、任意字节加减(Arithmetic)、数字字节加减(ArithmeticDigit)、随机值替换(ReplaceRand)、特殊值替换(ReplaceSpec)、随机值插入(InsertRand)、特殊值插入(InsertSpec)、随机长度删除(DeleteRand)、确定长度删除(DeleteDeter)、置乱(Shuffle)、交换(Swap)、重置大小(ChangeSize)、行变换(ChangeLine)、重复(Repeat)、拼接(Splicing).
在这里插入图片描述
2.4.2 监控基础原语
本文同时兼顾这 3 个角度,分析了测试目标为文件类、协议类、浏览器类以及 API 类的 38 款模糊测试器,总结出 10 种监控基本操作,监控基本操作在各模糊测试器中的选用比例,如图 9 所示.其中,58%的模糊测试器选用了监控进程返回值(process exit code)的方法,以该方式进行监控无法获取栈、寄存器等信息,属于粗粒度监控. 16%的模糊测试器使用了 Sanitizer(如 ASAN[22,23]等)这样的编译器提供的监控缺陷的方式,但这种方式只适用于可以修改编译参数的开源目标程序.是否能够进行细粒度监控,决定了是否可以获取更多的程序缺陷信息,同时也影响了是否能够对监控到的缺陷进行有效去重.这些因素将直接影响漏洞挖掘人员分析软件缺陷的效率.除此之外,在 38个模糊测试器中,有 32%的模糊测试器可以进行远程监控,支持远程监控的模糊测试器几乎都使用于协议类目标程序的测试.是否能够进行远程监控,对于协议、服务类型的软件有重大影响.
根据上述分析,本文将监控原语归纳为如表 6 所示的 6 种原语:Windows 本地监控(WinLocal)、Windows 远程监控(WinRemote)、Windows 网络监控(WinNet)、Linux 本地监控(LinLocal)、Linux 远程监控(LinRemote)、Linux 网络监控(LinNet).
在这里插入图片描述
2.4.3 反馈基础原语
在这里插入图片描述
3 原型框架的实现
Puzzer 实现了如图 12 所示的 FDS 解析器:(1) 解析制导程序生成抽象模糊测试语法树;(2) 遍历语法树、调用模糊测试原语库中定义的方法;(3) 对调用的原语方法进行模块化整合,生成基于 python 语言的定制模糊测试器.
在这里插入图片描述
4 实验验证
本文从原语覆盖完整度、模糊测试器构建复杂度、模糊测试器扩展能力、漏洞发现能力这 4 个角度评价可编程模糊测试技术.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值