头图

编者按:高校是开源社区参与的重要力量。在 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% 左右的提升。


龙蜥社区
40 声望12 粉丝

OpenAnolis龙蜥社区由国内外头部企业联合建立的操作系统开源社区。