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

2026                                     Journal of Software  软件学报 Vol.32, No.7,  July 2021

                 告,其中 53 个被确认为真正的数据竞争错误.然而在进行过滤之前,RELAY 的准确率只有 11%,误报率较高                            [20] .
                    3)  基于操作系统内核特性的检测
                    基于操作系统内核中断、同步机制以及并发接口设计等特性,研究人员也提出了一系列检测并发错误的方
                 法.aComment [66] 提出了中断相关的内核代码注释方法,用以检测内核中存在的并发错误.相比于传统的通过代
                 码注释进行代码漏洞的检测方法,该方法重点检测操作系统内核中由于中断导致的并发错误.aComment 首先
                 采用启发式的方法提取内核代码中所有关于与中断有关的注释,并对相应的函数进行注释的标记;根据已经收
                 集的代码注释,通过函数调用图,采用自底向上的方法,推断并对所有函数进行注释标记.最后,根据函数的注释
                 标记,如果该函数的中断前置条件和后置条件相互冲突,则报告该函数中可能存在错误.最终,该方法报告了 12
                 个并发错误,其中有 9 个是真正的并发错误.aComment 是一个专门针对操作系统内核中断相关的并发错误检测
                 方法,可以在短时间内分析大量的代码,但 aComment 只能用于特定情况下的中断代码注释和分析,如只能分析
                 无前置或者后置条件的中断,而且在中断提取阶段需要大量的人工分析和确认中断相关的注释,一旦代码注释
                 发生改变或者失效,该方法则无法得出正确的分析结果.Breuer 等人                   [67] 提出了一种针对 Linux 内核中 spinlock
                 死锁相关的并发错误检测的静态分析方法.该方法主要针对 Linux 内核中自 spinlock 加锁之后,由于线程调度而
                 再次调用睡眠函数而导致的死锁问题.通过扫描源代码,设计针对程序语句的符号分析规则,检测出 Linux 内核
                 中存在的死锁问题.文献[67]中还给出了一个 Linux 内核网络适配器模块中检测出来的死锁错误.该方法只是一
                 个简单的原型设计,并没有对实际的 Linux 内核代码进行检测,而且,该方法只能用于 spin_lock 相关的死锁检测,
                 无法检测出其他类型的并发错误.Bai 等人            [25] 提出了一个静态的用于检测 Linux 驱动程序中的 CUAF 错误的方
                 法 DCUAF.他们称经过统计分析,Linux 内核提交的用于修复 UAF 错误有 42%涉及到驱动程序的并发,而且几
                 乎所有的错误是经过手动检查或者运行时发现的.因此,他们提出了一种有效的静态分析方法,可以覆盖到尽可
                 能多的代码,检测出尽可能多的 CUAF 错误.根据 Linux 驱动程序模块的特点,所有的驱动程序代码实现都要继
                 承统一的驱动程序接口,他们提出了从局部到全局的并发函数对提取的方法.首先通过局部分析得到本地并发
                 函数对,然后通过全局分析得到整个驱动程序模块的并发函数接口对.再利用基于摘要的锁集算法检测 Linux
                 内核驱动程序中的 UAF 错误.最终发现了 640 个真正的 UAF 错误,作者随机选取了 130 个错误提交给了 Linux
                 内核开发人员,其中有 95 个得到最终确认.虽然 DCUAF 在检测驱动程序的 UAF 错误上取得了不错的效果,但
                 仍有一些不足之处.如 DCUAF 无法处理中断相关的 UAF 错误,且只能检测到锁相关的 UAF 错误,因此漏报率
                 较高.此外,DCUAF 没有处理函数指针的问题导致无法构建所有驱动程序代码的函数调用图,造成一定程度的
                 漏报.
                    4)  其他
                    其他静态检测方法还包括基于模式匹配的检测方法和基于操作系统内存模型的检测方法等.文献[68]提出
                 基于模式匹配的操作系统并发错误静态检测框架 COBET.该框架需要用户自己设定并发错误的模式,并采用语
                 义分析引擎,通过调用路径分析、锁集分析以及别名分析等方法,帮助用户分析和检测出符合模式规则的并发
                 错误.该文将该框架分别用于文件系统、设备驱动程序和网络模块的并发错误检测,并检测出了 10 个新的并发
                 错误.该方法的不足在于用户需要根据代码的具体语义、同步机制等设计出检测模式,可扩展性较差.另外,用户
                 只能检测出预定义匹配模式相关的并发错误,导致漏报率也较高.Andrianov 等人                      [69] 设计了一种轻量级的 Linux
                 内核数据竞争检测方法.该方法的实现基于可配置程序分析(CPA)的思想,因此称为 CPALockator.该方法采用了
                 一个简单的内存模型,分析程序中的共享变量,得到一个共享变量访问的集合;然后,进行锁集分析、线程分析和
                 预测分析得到潜在的数据竞争报告,再利用优化分析的方法对每个潜在的数据竞争执行进行分析,排除掉那些
                 不可达路径上的伪数据竞争.该方法被用于 Linux 内核 4.5-rc1 中的 drivers/net/wireless 模块,最终检测出 32 个
                 数据竞争错误,其中有部分被开发人员确认.虽然该方法可以在分析效率和准确率之间进行灵活调整,但限于内
                 存模型的设计,无法处理 RCU 等内核同步机制相关的数据竞争,因此,漏报率和误报率仍较高.
                    综上,静态检测方法的优点是在不运行程序的情况下可以实现对代码的分析和检查,同时可以尽可能地覆
                 盖到所有的程序调用路径,大大降低了漏报率.但是采用静态分析的方法对操作系统内核进行并发错误检测仍
   103   104   105   106   107   108   109   110   111   112   113