论文部分内容阅读
当前的软件攻击通常建立在破坏机器码执行的漏洞上。实施基本安全属性检查,执行流完整性检查(CFI)可以防止此类攻击行为。由于CFI实施起来较为简单,因此它很实用;另外它与现有主流软件平台兼容,可以通过对该平台上的程序代码进行改写,达到在该平台上实施CFI的目的。CFI还为实施进一步的安全策略提供了有用的基础。实现CFI的过程中,在执行跳转(jmp)或者调用(call) 一个寄存器(或者使用寄存器间接寻址)的时候,有时需要动态地获得目的地址,这样改写的开销很大,给CFI的实际应用造成了一定的困难。为了解决上述的研究难题,本文在基于执行流完整性检查的防护应用中采用了 CFG技术。CFG就是执行流保护技术,它是一种编译器和操作系统相结合的防护手段,目的在于防止不可信的间接调用。在程序运行时对内存进行攻击,例如基于缓冲区溢出的堆栈砸碎和代码重用攻击,在嵌入式系统中是常见的。执行流完整性检查(CFI)已被公认为一种有希望的方法来防止这种运行时攻击。然而,以前的CFI实现有粒度粗的问题(因此可以被高级攻击模型规避)和开销大的问题。为了在执行流检查技术中融入执行流保护技术(CFI+CFG),论文首先提出了一种在基本块级别实施细粒度CFI的方法,称为基本块CFI (BB-CFI)方法,它可以防御上述攻击。关键思想是验证可以由对手修改的执行流指令(CFIN)(例如,call, ret和jmp)的目标地址(TA)。BB-CFI包含两个阶段:1)通过对程序的离线剖析来提取执行流信息;2)并在程序运行的同时进行执行流检查,以达到利用提取的执行流信息验证CFIN的TA的目的。本文还对复杂二进制文件中发现的异常情况(例如,多线程,C++异常和longjump)进行了针对性的处理。另外,本文提出了执行流检查器(CFC)的架构,在这个架构下,执行流检查器可以在程序运行时实时监视程序执行,并可以同时强制执行BB-CFI。为了验证方法的可行性,本文在Linux平台上实现CFC和CFG的结合。本文的方法不需要修改源代码或指令集架构。实验结果表明BB-CFI对于运行时攻击是有效的,具有100%的验证准确性。