Demystifying the Dependency Challenge in Kernel Fuzzing
作者:Yu Hao, Hang Zhang, Guoren Li, Xingyun Du, Zhiyun Qian, Ardalan Amiri Sani 会议:ICSE’ 22
关键词:Kernel Dependency, Fuzzing
背景介绍
在软件测试领域,模糊测试(Fuzz Testing)已经成为一种流行且有效的方法,用于发现程序中的错误和安全漏洞。尽管模糊测试技术不断进步,但对于复杂的状态相关软件(例如操作系统内核)进行模糊测试仍然是一个巨大的挑战。尤其是内核代码中的许多部分只有在特定的内核状态下才能被执行,这使得现有的内核模糊测试工具难以有效探索如此庞大的状态空间。在本文中,我们将介绍《Demystifying the Dependency Challenge in Kernel Fuzzing》该论文深入探讨了内核模糊测试中的“依赖性挑战”,并提出了新的研究方向。
技术设计
为了系统地理解依赖性挑战,作者们开展了大量的测量研究。他们首先开发了一个包含自动化组件(模糊测试和静态分析)的测量流程,并通过手动调查来确定未解决依赖(Unresolved Dependencies, UDs)的根本原因。
测量流程
-
收集覆盖率数据:使用模糊测试工具对特定的内核模块进行长时间的测试,收集测试用例和相应的代码覆盖率数据。 -
确定未解决的依赖:通过静态污点分析(Static Taint Analysis),确定哪些未执行的分支是由于依赖性问题而未被执行。 -
识别影响依赖的写入语句:使用静态分析来识别可能影响依赖条件的全局内存写入语句。 -
分析根原因:手动检查每个依赖,确定为什么模糊测试工具未能解决这些依赖。
结果
通过深入的测量研究,作者们发现即使在经过充分模糊测试的内核模块中,未解决的依赖性问题仍然占据了未覆盖分支的59% – 88%。这一发现表明,依赖性挑战普遍存在,并且是限制模糊测试覆盖率的主要障碍。
此外,作者们还发现,依赖性挑战只是问题的表象,而非根本原因。他们通过分析,提出了多种可能的解决方案,并指出了未来研究的新方向。
根原因分析
根原因分析 作者们将未解决的依赖性问题归结为以下几个根本原因:
-
死代码:一些代码路径由于永远不会被执行,因此无法通过模糊测试覆盖。 -
环境依赖:某些依赖性问题需要特定的硬件环境或配置才能解决。 -
未观察到的依赖:有些依赖性问题在模块初始化或退出时被解决,但模糊测试工具并未观察到这些情况。 -
模板不完整:模糊测试工具使用的模板不完整或不准确,导致无法生成正确的测试用例。 -
特殊的搜索:某些依赖性问题需要特殊的搜索算法或策略才能解决。
原文始发于微信公众号(COMPASS Lab):Demystifying the Dependency Challenge in Kernel Fuzzing