论文部分内容阅读
分层理论是计算机发展的基础,而层级间交互的部分通常是系统的薄弱环节,容易存在安全缺陷。本文基于计算机系统的分层现状,提出系统交界面的概念,并进一步抽象出了线程间的并行交界面,内核与用户间的权限交界面,以及操作系统与外围设备间的硬件交界面。针对系统交界面的安全性问题,本文具体对并行交界面中的原子性违例缺陷、权限交界面中的double fetch缺陷、以及硬件交界面中的硬件double fetch缺陷展开下列研究。(1)基于预测的高效原子性违例缺陷检测。线程间的原子性违例缺陷是最常见的一类并发缺陷。线程调度引入的不确定性使得同一原子性违例缺陷可能对应多个能够触发该缺陷的线程交织,因此难检测、难复现、难修复。本文提出了一种基于预测技术的高效检测和复现方法,基于所提形式化定义和候选交织理论,该方法能够暴露同一原子性违例缺陷的所有可能缺陷交织,从而帮助开发者彻底的修复缺陷。本文还实现了原型工具AVPredictor,实验评测证明,AVPredictor能够有效检测到测试用例中所有的已知缺陷以及一个未知缺陷。AVPredictor的运行时间开销适度(监控器为18x,线程控制器为31x),低于同类工作(AVIO,Maple等)。AVPredictor所采用的分组策略可以避免最多66.7%的无效执行。AVPredictor相比于现有工作Maple,效率平均提高了5.8x。(2)基于多污点并行追踪的double fetch缺陷检测。针对内核与用户空间之间的double fetch缺陷,本文提出了一种基于多污点并行追踪的检测方法。该方法首次将污点追踪技术应用到double fetch缺陷检测上。所提方法结合了double fetch缺陷特点,将访存顺序的时间维度映射到了污点传播的空间维度上,避免了线程调度对符号化执行中状态空间爆炸的加剧。本文基于所提方法实现了一个原型工具DFTracker。DFTracker具有路径覆盖率高、时间开销低等优点。实验评测证明,DFTracker能有效检测出测试集中的double fetch缺陷,没有漏报,只有少量误报,单文件测试的时间开销为2x左右。将DFTracker应用到Linux内核3.18分析,其发现了一个新的double fetch缺陷,全路径覆盖分析完整内核的时间开销为9x。(3)基于静态模式匹配的double fetch缺陷检测。针对驱动程序中缺陷的动态检测需要特定硬件支持、且路径覆盖率低的问题,本文提出了一种基于模式匹配的静态方法来检测double fetch缺陷。该方法能够在一次执行中覆盖完整Linux内核(包括所有驱动程序)。将所提方法应用到Linux,FreeBSD及Android,共发掘6个未知double fetch漏洞。此外,本文还抽象了三种double fetch情况容易发生的典型场景,基于CVE-2016-6516实现了double fetch漏洞利用的PoC,并提出了double fetch缺陷的预防策略。目前,所有发现的漏洞已经汇报给内核开发者团队并得到确认和修复。所提方法已经被Coccinelle团队采用并被集成到Linux内核补丁的审计中。(4)针对I/O内存中硬件double fetch缺陷的研究。操作系统通过读写映射到I/O内存中的设备寄存器和设备内存来控制外围设备。由于缺乏有效的验证机制,恶意硬件可能在两次操作系统读取之间篡改数据,对操作系统造成破坏。本文首次提出并定义了操作系统和外围设备之间存在的硬件double fetch缺陷,并基于静态模式匹配的方法从Linux内核中识别到361个硬件double fetch情况。然后根据I/O内存特性对匹配到的硬件double fetch情况进行分类,并分析了每一类引发缺陷的可能。最终从中发现了4个未知硬件double fetch漏洞,目前已被内核开发团队确认并修复。本工作将double fetch问题的范围扩展到操作系统与外围设备之间,为double fetch问题的研究开辟了新的视角。