Page 105 - 《软件学报》2021年第7期
P. 105

石剑君  等:操作系统内核并发错误检测研究进展                                                         2023


                 检测出堆栈溢出、全局变量访问越界等内存错误,如 UAF 错误和 out-of-bounds(OOB)错误等.KASAN 在 Linux
                 内核中易于使用,只需在内核配置选项中简单设置即可.KASAN 通过将代码编译为内联模式,大大提高了检测
                 速度,但 KASAN 无法检测未初始化内存的错误.Kmemcheck 是一个与 KASAN 类似的 Linux 内核内存检测工
                 具.Kmemcheck 可以跟踪内存的初始化、分配和释放过程,检测出未初始化或未分配内存以及已释放内存的非
                 法访问问题.但 Kmemcheck 无法检测出栈溢出或者全局变量访问越界等问题.而且,这些工具并不是针对操作
                 系统内核并发错误检测而设计的.
                    Syzkaller 是 Google 公司开发的一款用于 Linux 内核模糊测试的工具.Syzkaller 通过输入一系列系统调用
                 序列,并利用模拟器 QEMU 监控 Linux 的执行状态,并对模糊测试的覆盖面和测试结果予以反馈,以提高模糊测
                 试的效率.利用 Syzkaller 进行并发错误检测常常通过随机输入系统调用序列实现,因此,触发 Linux 内核并发错
                 误的概率比较低,漏报率也比较高.
                    KTSAN 是一款用于 Linux 内核数据竞争的检测工具.KTSAN 的实现基于动态二进制插桩工具 Valgrind,
                 通过 Valgrind 获取内核执行过程中的访存和同步操作等信息,再利用 HB 关系分析内核运行过程中是否存在数
                 据竞争.KTSAN 的不足之处在于它必须构建起所有同步机制的先后顺序,任何疏漏都将导致大量的误报.
                 KCSAN 的实现则依赖于编译时插桩,并采用基于观察点采样的方法进行数据竞争检测.但 KTSAN 和 KCSAN
                 的检测结果都依赖于内核线程的动态执行过程,内核中没有执行的部分则无法进行检测.另外,KTSAN 也没有
                 考虑内核的中断特性,漏报率较高.
                    尽管这些针对操作系统内核错误检测的工具得到内核开发人员的广泛使用,但这些工具本身存在着漏报
                 率和误报率较高、检测效果差等问题.而且,针对操作系统内核并发错误的检测,开发人员往往需要结合多种工
                 具的分析结果才能得出结论.因此,对操作系统内核并发错误的研究仍有待进一步提高.

                 3    操作系统内核并发错误检测研究
                    为了提高操作系统内核并发错误检测的效率,很多研究人员从并发错误检测方法、检测类型、针对的内核
                 检测模块和检测效果上都进行了大量的研究,并取得了一定的研究成果.图 8 总结了最近几年研究人员针对操
                 作系统内核并发错误检测的方法,这些方法包括形式化验证方法、静态检测方法、动态检测方法和静态动态相
                 结合的检测方法.其中,形式化验证方法包括定理证明和模型检验等,静态检测方法包括流分析、符号执行、代
                 码注释等,动态检测包括动态二进制插桩、系统化测试等方法.为了提高检测效率,研究人员还提出了动态静态
                 相结合的检测方法,如 Razzer     [45] 结合了指向分析和模糊测试技术,以检测操作系统内核的数据竞争错误.




















                                    Fig.8    Approaches for concurrency bug detection in OS kernels
                                             图 8   操作系统内核并发错误检测方法

                    静态检测是指在不运行程序的情况下,对程序的源代码、编译过程中生成的中间代码等进行分析,报告所
   100   101   102   103   104   105   106   107   108   109   110