Fuzzing 技术应用介绍(一)

admin 2024年12月24日11:18:50评论11 views字数 5603阅读18分40秒阅读模式
前言

模糊测试(Fuzz Testing),起源于上世纪90 年代,又称随机测试或碰撞测试,由威斯康星大学的Barton Miller 教授在软件测试相关课程中提出,是广泛应用于软件和系统安全领域的自动化测试技术。其核心思想是准备随机、异常、边界情况的变异输入数据,在重复执行程序的情况下尝试触发异常行为,以对程序的健壮性进行测试,从而探测程序在各种非预期情况下的潜在漏洞和异常行为。在以往的文章中已经介绍过一些特定的工具和使用方法,比如Syzkaller[1],AFL[2],honggfuzz[3],使用Libfuzzer和ServiceFuzzer测试安卓服务[4],本系列文章旨在更全面地介绍Fuzzing技术的应用。

基础知识

一般来说,Fuzzing工具主要包含以下几个设计:1.用于指导测试数据(种子)选取的动态执行反馈设计;2.程序执行前的种子选取策略设计;3.对种子的变异策略设计。以最经典且使用最为广泛的AFL工具为例, 在AFL的设计中,种子的动态执行反馈用到了“边覆盖率”,指程序执行过程中所经过的基本块分支路径的数量与总路径数量的比例;种子的选取策略用到了遗传算法,利用种子产生的边覆盖率和是否产生了新覆盖来评估其测试有效性,并在每轮测试中尽量选取覆盖率高的种子;种子的变异策略用到了位翻转、字节翻转、边界数值替换、字节插入/删除、随机变异,利用经验策略和纯随机策略的结合来变异种子。在AFL的实现中,Linux fork的写时复制(Copy On Write)还被用于增加程序的执行迭代速度。大体流程如图1所示。

Fuzzing 技术应用介绍(一)

图1  AFL经典设计架构

在过去的七八年中,Fuzzing技术倍受业界学术界关注,而且出现了很多提升Fuzzing效果的研究成果,如约束求解增强、格式感知、种子(输入数据)调度,还有针对目标代码导向的增强研究。

本系列文章侧重介绍当前Fuzzing技术的应用,也会结合相关研究来分享一些Fuzzing技术。而本文的应用介绍将主要聚焦于Kernel,介绍一些Fuzzing在操作系统领域的应用和技术发展。

Kernel Fuzzing技术应用

代码量大、复杂性高、分析成本高,使得应用Fuzzing技术到Kernel成为了优选,相关研究内容也比较多。通常来说,Kernel Fuzzing和传统Fuzzing的步骤相似,也包括执行监控反馈、输入生成变异、输入选取。但针对不同的测试对象,这些步骤会各有所异,如何设计各步骤的具体实现也是应用Fuzzing到Kernel的挑战所在。

Kernel Fuzzing的输入生成变异

Kernel Fuzzing的输入生成变异:利用随机或特定的形式生成各种输入。

对Kernel进行Fuzzing所用到的输入与命令行程序不同,大部分被测的命令行程序只需要变异文件或raw bytes便可以进行测试。例如图2,对libxml2中的功能应用Fuzzing有现成的可执行文件供AFL使用,AFL的变异输入会从文件传递到xmllint。

Fuzzing 技术应用介绍(一)

图2  AFL测试命令行程序

而探索复杂的Kernel涉及多种形式的输入,根据被测Kernel的不同、被测代码所属模块的不同,输入的形式、变异方式也需要单独进行设计,相对来说此步骤的设计工作会比较多。例如,syzkaller工具为了测试Kernel与用户层之间的接口——系统调用,其输入及变异的设计主要围绕系统调用和相关参数,涉及系统调用序列的变异重组、系统调用参数的数据变异,从而探索在发生随机系统调用时Kernel的异常状态。而对于Kernel中代码量占比很大的驱动程序,由于其操作会使用ioctl命令,驱动程序的测试输入形式基本与ioctl绑定。以DIFUZE研究[5]为例(图3),DIFUZE会通过LLVM解静态分析安卓Kernel驱动的代码,尽可能找到驱动程序的命令号、参数类型、相关数据结构,还有ioctl的handler函数,从而可以自动生成更符合真实调用形式的ioctl命令作为输入,将Fuzzing技术更好地应用于安卓Kernel驱动。

Fuzzing 技术应用介绍(一)

图3  DIFUZE工作流程图

当使用Fuzzing探索Kernel文件处理系统的bug时,以JANUS[6]为例 ,输入形式的设计又转到文件image和文件操作、文件系统的状态。JANUS在系统调用Fuzzing的基础上针对文件操作指令和文件系统状态相关的变异进行了优化,并设计了一版image mutator,进一步探讨了如何有效变异image中的元数据,从而提高变异输入的有效性。

Fuzzing 技术应用介绍(一)

图4 JANUS工作流程图

对于Kernel中的条件竞争漏洞,以KRACE[7]为例,输入的形式和变异方式则特别关注系统调用间的依赖关系和潜在的数据竞争点。KRACE设计了一个用于生成、变异和合并多线程系统调用序列的进化算法,作为并发测试的输入,引导Fuzzer更有效的探索Kernel中的数据竞争。

当应用Fuzzing到闭源的商业操作系统时,SyzGen[8]通过收集分析应用程序中的执行trace,来推断macOS系统调用接口的明确依赖关系,然后将这些知识推广到其他没有trace的接口,并不断完善已有依赖,从而生成效果更好的系统调用序列作为Fuzzing输入。NTFuzz[9]则解析已知的Windows API参数文档资料推断未知的API参数类型,然后对Kernel二进制程序进行静态分析,根据控制流图、函数调用图和API文档解析的结果,推测出API的参数类型,从而更好地变异输入。

Kernel Fuzzing的执行监控

Kernel Fuzzing的执行监控:kcov或通过trace记录覆盖率,关注崩溃,记录系统信息。

对于开源软件,AFL监视程序状态常常使用Sanitizer来监控异常内存行为,并动态记录边覆盖率获取反馈。为了对Kernel应用Fuzzing,技术人员同样需要一些方法来监视Kernel的状态。在Linux开源Kernel领域同样会有Sanitizer还有覆盖率工具供使用,例如Linux的Sanitizer可以用到KASAN、KUBASAN、KMemLeak等,代码覆盖率可以用kcov。例如Syzkaller就基于kcov实现了覆盖率反馈。当面向闭源的操作系统Kernel时,TriforceAFL[10]尝试过使用QEMU模拟进行Kernel模糊测试,基于AFL QEMU-Mode进行边覆盖率记录,但执行效率很低。kAFL[11]借助Hypervisor虚拟化技术和Intel PT技术进行了优化,通过转换底层trace记录到上层(如图5),实现了一个以覆盖率为导向、支持跨操作系统的Kernel Fuzz工具。

Fuzzing 技术应用介绍(一)

图5 kAFL转换Intel PT trace到AFL bitmap流程图

除此之外,应用于不同Kernel和Kernel模块,针对不同目标漏洞类型的Fuzzing工具还会有一些针对性的反馈设计,例如一些早期的Windows驱动漏洞挖掘工具还会使用特定的系统日志作为反馈,用日志来指引Fuzzing流程。KRACE还设计了一个新的覆盖率跟踪指标——别名覆盖率,专门用于捕捉并发维度的反馈。而在系统崩溃时,大多数Fuzzing工具都会尝试获取系统信息的各种记录如调用栈,转储信息,还有如ADDFuzer[12]用到了/proc/last_kmsg来获取重启后上次的系统状态。Syzkaller还会尝试通过注释掉单个系统调用并删除无关的数据来缩小在系统信息中定位根因的范围。

Kernel Fuzzing的执行迭代

Kernel Fuzzing的执行迭代:虚拟平台上重复执行测试,CPU模拟执行。

在AFL工具中,执行迭代过程主要依赖于被测程序进程自身fork,从而使被测程序不断接收不同的输入。而Kernel的运行即操作系统自身的运行,为了保持系统启动状态的一致性,研究者往往会使用虚拟机(如QEMU、KVM等)来进行实验。以syzkaller工具为例(如图6),Kernel在完成插桩编译后会被放到虚拟机去执行,使用者则通过syz-manager界面操作syzkaller,syz-manager则通过ssh与执行起来的Kernel进行交互。从而控制Kernel在虚拟机中的执行迭代。

Fuzzing 技术应用介绍(一)

图6 syzkaller流程图

另一方面,由于Kernel的崩溃会导致整个系统的崩溃,导致Fuzzing效率低下,也没有一个工作能够直接针对某个Kernel函数进行Fuzzing。为了提升对闭源Kernel Fuzzing的执行迭代速度,UnicornFuzz[13]使用到了CPU模拟来Fuzz Kernel空间中的任意解析器,并在此技术上提供覆盖率的反馈,其实现基于AFL-Unicorn,能够支持大量的处理器架构,也简化了设置Kernel Fuzzing的流程。

总结

将Fuzzing应用于Kernel是一项充满挑战性的工作,在经典AFL Fuzzing思路的指引下,研究者们尝试了各种实现方法来将Fuzzing应用到Kernel的不同模块中,有针对性地挖掘特定类型漏洞,节省了分析人力,提高挖洞效率。同时,Kernel Fuzzing领域细分化趋势明显。现有工作都很重视某个单独方向的研究,并针对某个细节性的问题进行相应的优化处理。本文没有对所有细分方向进行展开和详细解释,但尽可能地介绍了Kernel Fuzzing的一些现有研究方向,以及将Fuzzing技术应用于Kernel时技术人员的设计、实现思路。有兴趣的读者可以沿引用的文章继续阅读相关论文,也可以搜索相关论文已开源的代码仓库进一步理解实现。

引用

[1]https://mp.weixin.qq.com/s/E5uiBKX_7I85W6Rc8rceiQ

[2]https://mp.weixin.qq.com/s/vkoGnElvC8RMDpuj-AdbfA

[3]https://mp.weixin.qq.com/s/HZ1BFtGwvf9A0pP-d5_LMw

[4]https://mp.weixin.qq.com/s/icCFCvFOOgquvw96GjXSKw

[5]Corina, Jake, et al. "Difuze: Interface aware fuzzing for kernel drivers." Proceedings of the 2017 ACM SIGSAC Conference on Computer and Communications Security. 2017.

[6]Xu, Wen, et al. "Fuzzing file systems via two-dimensional input space exploration." 2019 IEEE Symposium on Security and Privacy (SP). IEEE, 2019.

[7]Xu, Meng, et al. "Krace: Data race fuzzing for kernel file systems." 2020 IEEE Symposium on Security and Privacy (SP). IEEE, 2020.

[8]Chen, Weiteng, et al. "Syzgen: Automated generation of syscall specification of closed-source macos drivers." Proceedings of the 2021 ACM SIGSAC Conference on Computer and Communications Security. 2021.

[9]Choi, Jaeseung, et al. "NTFuzz: Enabling type-aware kernel fuzzing on windows with static binary analysis." 2021 IEEE Symposium on Security and Privacy (SP). IEEE, 2021.

[10]Pandey, Pallavi, Anupam Sarkar, and Ansuman Banerjee. "Triforce QNX Syscall Fuzzer." 2019 IEEE International Symposium on Software Reliability Engineering Workshops (ISSREW). IEEE, 2019.

[11]Schumilo, Sergej, et al. "{kAFL}:{Hardware-Assisted} feedback fuzzing for {OS} kernels." 26th USENIX security symposium (USENIX Security 17). 2017.

[12]Cui, Baojiang, Yunze Ni, and Yilun Fu. "ADDFuzzer: A New Fuzzing Framework of Android Device Drivers." 2015 10th International Conference on Broadband and Wireless Computing, Communication and Applications (BWCCA). IEEE, 2015.

[13]D. Maier, B. Radtke, and B. Harren, “Unicorefuzz: On the viability of emulation for kernelspace fuzzing,” 2019.

END

➤ 往期推荐

·Android Native内存型漏洞实例

· Android应用文件分享漏洞简介

· 首款移动智能终端机密计算系统产品获CCRC EAL4+证书

· Android Memory Tagging Extension (MTE) 的深度研究与应用

· Parcelable和Bundle的爱恨情仇(三)

原文始发于微信公众号(OPPO安珀实验室):Fuzzing 技术应用介绍(一)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月24日11:18:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Fuzzing 技术应用介绍(一)http://cn-sec.com/archives/3533684.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息