论文部分内容阅读
代码复用攻击(Code-Reuse Attacks)是当前存储错误漏洞利用的最新技术。这类攻击在不注入恶意代码的情况下,通过复用应用中合法代码片段挟持应用控制流。因此,这类攻击可以绕过当前系统所采用的防御机制,如:数据执行保护(DEP)与栈保护(StackGuard)。控制流完整性(Control-Flow Integrity,CFI)被认为是防御代码复用攻击的有效方法。CFI将程序的控制流限制在预先定义的控制流图(CFG)的边上。由间接跳转或间接函数调用引起的控制流改变称为前向控制流,由函数返回引起的控制流改变称为后向控制流。后向控制流完整性通常用影子栈检查返回地址的完整性实现。前向控制流完整性通过插入代码检查控制流改变目标地址是否属于静态分析得到的目标地址集。虽然这些方法提高了攻击难度,但是仍存在不足。第一,基于硬件的影子栈并没有完全与系统软件隔离;第二,前向控制流完整性实现无状态的安全检查,经验丰富的攻击者仍有可乘之机;第三,影子存储是实现各种安全机制的关键技术,但当前影子存储存在安全隐患。 针对控制流完整性实施过程中存在的问题,本文提出了基于硬件的前向与后向控制流完整性机制,并提出基于硬件的安全影子存储机制。本文的主要贡献如下: 1.与系统软件隔离的基于信息校验码的后向控制流完整性机制RAGuard。RAGuard通过为每个返回地址绑定一个信息校验码来验证返回地址的完整性。为了将返回地址完整性验证与系统中软件隔离,采用物理不可克隆函数以进程为单位管理计算信息校验码的密钥,并由硬件自动完成返回地址完整性的验证。基于叶节点函数,提出了一种运行时性能优化方法。通过监测call-ret指令序列,RAGuard动态识别叶节点函数,将叶结点函数的返回地址与芯片上存储的值直接比较。评估结果表明,当应用中叶节点函数的占比达到70%以上时,RAGuard的性能开销可忽略。 2.基于Intel存储保护扩展(MPX)的有状态前向控制流完整性机制。本文将控制改变相关的指针备份在影子存储区间。当这类指针被引用时,利用指针的备份验证指针的完整性。为了方便对指针备份的管理,使用MPX的指令完成备份的保存与读取。用一个LLVM pass识别需要保护的指针,并插入指针存储与完整性验证的代码。在支持MPX的商用Skylake机器上评估机制的有效性与性能开销。评估结果表明保护机制以可接受的性能代价保证前向控制流完整性。 3.提出将SGX构建安全执行环境的方法用于创建基于硬件隔离的安全影子存储区间的机制SSMEM(Secure Shadow Memory)。SSMEM将应用实施安全规则的标签(或运行时信息)保存在数据enclave中,并用特定指令ETAGST与ETAGLD存取标签。数据enclave的中的标签由系统软件管理,按MPX管理边界表的方式将标签保存在标签表中。标签表被映射到EPC(Enclave Page Cache)页面,并按SGX2动态存储管理协议动态添加。指令ETAGST与ETAGLD执行时的存储安全检查将影子存储与其它系统软件隔离开。