提升龙蜥内核测试能力!探究持续性模糊测试优化实践

简介: 清华大学软件学院对Anolis OS使用靶向模糊测试方法将测试工作引向修改的代码,进而提高对业务代码的测试能力。

编者按:高校是开源社区参与的重要力量。在 2023 龙蜥操作系统大会全面繁荣开发者生态分论坛上,清华大学软件工程博士沈煜恒从模糊测试的角度解释了如何将操作系统内核质量提升一个新高度,也分享了面向龙蜥操作系统的内核所提出的模糊测试。以下为分享原文:

(图/清华大学软件工程博士沈煜恒)


内核模糊测试

什么是模糊测试?模糊测试是一种常用的漏洞性方法,使用随机生成 input 来测试程序中的异常行为,常见 Linux、Windows 等部署了模糊测试,并且将模糊测试集中在 CI 流程中。


对于 Linux 操作系统,使用 kcov 工具来对 Linux 做覆盖率插装,使用系统调用描述 Syscall SPEC 作为系统调用描述的输入。在执行测试过程中,将 SPEC 实例化为待测的程序。根据反馈情况,如覆盖率和崩溃率对 SPEC 做编译操作,进一步测试内核,相对应的内核会在测试过程中不断的执行生成的程序,对覆盖率和崩溃情况进行收集。


基于任务的OS模糊测试


传统的内核模糊测试在测龙蜥操作系统时会遇到很多问题,现在广泛采用的系统调用描述的方法不足以充分表达业务系统的逻辑,且无法传达执行时的状态信息。同时,目前的执行方式也存在一些问题,如目前的模糊测试器每次只能启动一个执行器,每次只能执行一个测试用例,无法充分传达执行时的逻辑,导致一些深层漏洞难以暴露。



针对以上问题,清华大学软件学院做了相关工作,提出了相关业务代码的感知、以任务作为测试输入,同时做到进程间的任务状态感知和维护,最后提出了使用多线程的执行方式



首先在测试时,使用任务格式输入,定义一个任务,任务中包括多个待执行的程序,程序中包括对应的优先级。我们提出任务间的状态感知和修复,通过字典查询的方式去维护每个任务的状态。其次构造一个字典,在执行时遍历每个任务中程序的系统调用来维护每个任务的执行状态,保证在测试中不会出现挂起等情况。同时,对可能导致挂起行为的程序做提前修复,保证在执行时的稳定情况。最后引入一个并行的 fuzz,尽可能多触发实时操作、相关业务逻辑等,对业务逻辑进行多并发的执行,在执行时会启动多个执行器,根据任务中定义的优先级,为每个执行器分配一个优先级,将任务分配执行器。在执行后异步收集执行的数据,同步到本地的模糊测试器中。



测试结果表示在 6 个版本的 Linux 上取得了大约 20% 覆盖率的提升,说明可以测到 Linux 内部更深的代码逻辑。同时,修复策略可以极大降低任务挂起的数量,也在 6 个版本的 Linux 上发现了 50 个 bug,其中 25 个为 prevision unknown 的 bug 被开发者所确认。


基于靶向的OS模糊测试


我们发现,虽然内核主线 Linux 经过了大量测试,但由于龙蜥操作系统自己维护的版本可能会对业务逻辑做经常修改,这些代码通常缺乏与上游内核相同级别的测试。同时在工业环境中,测试会受到严格的时间和计算资源限制。因此我们提出,可以使用靶向模糊测试方法(定向模糊测试方法)将测试工作引向修改的代码,即特定的目标代码段,进而提高对业务代码的测试能力。

上述工作基于两方面展开:第一静态调用图的抽取第二基于调用图的模糊测试。调用图的抽取通过 Clang 抽取出整个内核的调用流图,基于调用流图生成加权的调用流图,进一步将生成的调用流图传给 Syzkaller 内核模糊测试器,通过距离计算、函数抽取等方式来增强 Syzkaller 的靶向模糊测试能力。该工作目前已经集成到阿里云的 ABACI 机器人中,能够实现业务模块的持续性模糊测试。对应的该工具目前在 Linux 内核发现了 11 个未知的漏洞,龙蜥社区也已经对其进行了修复,覆盖率对比于 Syzkaller,实现了 24.7% 左右的提升。


精彩视频回放、课件获取:

2023 龙蜥操作系统大会直播回放及技术 PPT上线啦,欢迎点击下方链接或文末”阅读原文“观看~

回放链接:https://openanolis.cn/openanolisconference

技术 PPT :关注龙蜥公众号【OpenAnolis 龙蜥】,回复“龙蜥课件”获取。


—— 完 ——

相关文章
|
12天前
|
Java 测试技术 开发者
初学者入门:掌握单元测试的基础与实践
【10月更文挑战第14天】单元测试是一种软件测试方法,它验证软件中的最小可测试单元——通常是单独的函数或类——是否按预期工作。单元测试的目标是确保每个模块在其自身范围内正确无误地运行。这些测试应该独立于其他模块,并且应该能够反复执行而不受外部环境的影响。
36 2
|
17天前
|
测试技术 UED
软件测试的艺术与实践
【10月更文挑战第9天】 在数字时代的浪潮中,软件成为了我们生活和工作不可或缺的一部分。然而,高质量的软件背后,是无数测试工程师的默默付出。本文将通过深入浅出的方式,探讨如何进行高效的软件测试,确保软件产品的质量与稳定性。我们将一起揭开软件测试的神秘面纱,从基础理论到实际操作,一步步走进这个充满挑战与创造的世界。
|
17天前
|
运维
【运维基础知识】用dos批处理批量替换文件中的某个字符串(本地单元测试通过,部分功能有待优化,欢迎指正)
该脚本用于将C盘test目录下所有以t开头的txt文件中的字符串“123”批量替换为“abc”。通过创建批处理文件并运行,可实现自动化文本替换,适合初学者学习批处理脚本的基础操作与逻辑控制。
111 56
|
3天前
|
机器学习/深度学习 人工智能 自然语言处理
探索软件测试的边界:从基础到高级的实践之旅
【10月更文挑战第21天】 在当今数字化时代,软件已成为我们生活和工作中不可或缺的一部分。随着技术的快速发展,对软件质量的要求也日益提高。本文旨在通过深入浅出的方式,带领读者踏上一场从基础到高级的软件测试实践之旅。我们将探讨软件测试的基本概念、重要性以及如何有效地进行测试规划和执行。通过具体案例分析,揭示常见错误及其解决方案,同时展望未来软件测试领域的发展趋势。无论你是软件开发新手还是经验丰富的测试工程师,这篇文章都将为你提供宝贵的见解和启发。
19 8
|
2天前
|
监控 安全 jenkins
探索软件测试的奥秘:自动化测试框架的搭建与实践
【10月更文挑战第24天】在软件开发的海洋里,测试是确保航行安全的灯塔。本文将带领读者揭开软件测试的神秘面纱,深入探讨如何从零开始搭建一个自动化测试框架,并配以代码示例。我们将一起航行在自动化测试的浪潮之上,体验从理论到实践的转变,最终达到提高测试效率和质量的彼岸。
|
5天前
|
测试技术 C# 数据库
C# 一分钟浅谈:测试驱动开发 (TDD) 实践
【10月更文挑战第18天】测试驱动开发(TDD)是一种软件开发方法论,强调先编写测试代码再编写功能代码,以确保代码质量和可维护性。本文从 TDD 的基本概念入手,详细介绍了其核心步骤——编写测试、运行测试并失败、编写代码使测试通过,以及“红绿重构”循环。文章还探讨了 TDD 的优势,包括提高代码质量、促进设计思考、减少调试时间和文档化。此外,文中分析了常见问题及解决方案,如测试覆盖率不足、测试代码过于复杂、忽视重构和测试依赖过多,并通过一个简单的计算器类的代码案例,展示了 TDD 的实际应用过程。
13 1
|
12天前
|
机器学习/深度学习 人工智能 自然语言处理
探索AI在软件测试中的创新应用与实践###
本文旨在探讨人工智能(AI)技术如何革新软件测试领域,提升测试效率、质量与覆盖范围。通过深入分析AI驱动的自动化测试工具、智能化缺陷预测模型及持续集成/持续部署(CI/CD)流程优化等关键方面,本研究揭示了AI技术在解决传统软件测试痛点中的潜力与价值。文章首先概述了软件测试的重要性和当前面临的挑战,随后详细介绍了AI技术在测试用例生成、执行、结果分析及维护中的应用实例,并展望了未来AI与软件测试深度融合的趋势,强调了技术伦理与质量控制的重要性。本文为软件开发与测试团队提供了关于如何有效利用AI技术提升测试效能的实践指南。 ###
|
2天前
|
测试技术 Python
软件测试的艺术:从理论到实践的探索
【10月更文挑战第23天】在软件开发的世界中,测试是确保产品质量的关键步骤。本文将深入探讨软件测试的核心理念、方法和实践,揭示如何通过精心设计和执行测试来提高软件质量。我们将一起探索测试的不同阶段,包括单元测试、集成测试、系统测试和验收测试,以及它们如何相互补充,共同构建起一个坚实的质量保证体系。文章旨在启发读者思考如何在自己的项目中实施有效的测试策略,从而提升软件的可靠性和性能。
|
17天前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
29 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
2月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
191 7
Jmeter实现WebSocket协议的接口测试方法