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

简介: 清华大学软件学院对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 龙蜥】,回复“龙蜥课件”获取。


—— 完 ——

相关文章
|
3天前
|
敏捷开发 人工智能 Devops
探索自动化测试的高效策略与实践###
当今软件开发生命周期中,自动化测试已成为提升效率、保障质量的关键工具。本文深入剖析了自动化测试的核心价值,探讨了一系列高效策略,包括选择合适的自动化框架、设计可维护的测试脚本、集成持续集成/持续部署(CI/CD)流程,以及有效管理和维护测试用例库。通过具体案例分析,揭示了这些策略在实际应用中的成效,为软件测试人员提供了宝贵的经验分享和实践指导。 ###
|
3天前
|
人工智能 前端开发 测试技术
探索软件测试中的自动化框架选择与优化策略####
本文深入剖析了当前主流的自动化测试框架,通过对比分析各自的优势、局限性及适用场景,为读者提供了一套系统性的选择与优化指南。文章首先概述了自动化测试的重要性及其在软件开发生命周期中的位置,接着逐一探讨了Selenium、Appium、Cypress等热门框架的特点,并通过实际案例展示了如何根据项目需求灵活选用与配置框架,以提升测试效率和质量。最后,文章还分享了若干最佳实践和未来趋势预测,旨在帮助测试工程师更好地应对复杂多变的测试环境。 ####
14 4
|
3天前
|
机器学习/深度学习 人工智能 jenkins
软件测试中的自动化与持续集成实践
在快速迭代的软件开发过程中,自动化测试和持续集成(CI)是确保代码质量和加速产品上市的关键。本文探讨了自动化测试的重要性、常见的自动化测试工具以及如何将自动化测试整合到持续集成流程中,以提高软件测试的效率和可靠性。通过案例分析,展示了自动化测试和持续集成在实际项目中的应用效果,并提供了实施建议。
|
3天前
|
Java 测试技术 持续交付
探索自动化测试在软件开发中的关键作用与实践
在现代软件开发流程中,自动化测试已成为提升产品质量、加速交付速度的不可或缺的一环。本文深入探讨了自动化测试的重要性,分析了其在不同阶段的应用价值,并结合实际案例阐述了如何有效实施自动化测试策略,以期为读者提供一套可操作的实践指南。
|
8天前
|
机器学习/深度学习 前端开发 测试技术
探索软件测试中的自动化测试框架选择与优化策略####
本文深入探讨了在当前软件开发生命周期中,自动化测试框架的选择对于提升测试效率、保障产品质量的重要性。通过分析市场上主流的自动化测试工具,如Selenium、Appium、Jest等,结合具体项目需求,提出了一套系统化的选型与优化策略。文章首先概述了自动化测试的基本原理及其在现代软件开发中的角色变迁,随后详细对比了各主流框架的功能特点、适用场景及优缺点,最后基于实际案例,阐述了如何根据项目特性量身定制自动化测试解决方案,并给出了持续集成/持续部署(CI/CD)环境下的最佳实践建议。 --- ####
|
3天前
|
Web App开发 敏捷开发 测试技术
探索自动化测试的奥秘:从理论到实践
【10月更文挑战第39天】在软件质量保障的战场上,自动化测试是提升效率和准确性的利器。本文将深入浅出地介绍自动化测试的基本概念、必要性以及如何实施自动化测试。我们将通过一个实际案例,展示如何利用流行的自动化测试工具Selenium进行网页测试,并分享一些实用的技巧和最佳实践。无论你是新手还是有经验的测试工程师,这篇文章都将为你提供宝贵的知识,帮助你在自动化测试的道路上更进一步。
|
3天前
|
敏捷开发 Java 测试技术
探索自动化测试:从理论到实践
【10月更文挑战第39天】在软件开发的海洋中,自动化测试是一艘能够带领团队高效航行的船只。本文将作为你的航海图,指引你理解自动化测试的核心概念,并分享一段实际的代码旅程,让你领略自动化测试的魅力和力量。准备好了吗?让我们启航!
|
8天前
|
测试技术 API Android开发
探索软件测试中的自动化框架选择与实践####
本文深入探讨了软件测试领域内,面对众多自动化测试框架时,如何依据项目特性和团队需求做出明智选择,并分享了实践中的有效策略与技巧。不同于传统摘要的概述方式,本文将直接以一段实践指南的形式,简述在选择自动化测试框架时应考虑的核心要素及推荐路径,旨在为读者提供即时可用的参考。 ####
|
8天前
|
缓存 监控 测试技术
全网最全压测指南!教你如何测试和优化系统极限性能
大家好,我是小米。本文将介绍如何在实际项目中进行性能压测和优化,包括单台服务器和集群压测、使用JMeter、监控CPU和内存使用率、优化Tomcat和数据库配置等方面的内容,帮助你在高并发场景下提升系统性能。希望这些实战经验能助你一臂之力!
22 3
|
6天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
34 3