论文部分内容阅读
现代操作系统面临着各种攻击威胁,其中一种重要的攻击方式就是ROP(Return-Oriented Programming)攻击。通过篡改操作系统内核中的某个控制数据(比如函数指针或返回地址),ROP攻击者能够将系统正常的执行流程(或控制流程)重定向到它自己所“精心”选择的合法指令片段,通过特定的连接指令(如ret指令)将这些指令片段串接起来进行执行,达到恶意攻击的目的。如果能够对操作系统内核控制流程提供保护,阻止系统正常的执行流被恶意更改,就可以消除(或缓解)这一类攻击的威胁。获取一个完整的内核控制流程图是进行内核控制流程保护的前提,为此,论文首先设计并实现了一种基于编译器中间代码的细粒度内核控制流程图获取方法。该方法通过扩展编译器,在其中间代码表示阶段,增加一个专用的数据结构分析模块,对于中间指令间接call的目标进行提取,获得内核控制流程图的关键路径。该模块将函数指针的传递过程分解成保存函数地址过程和读取使用函数地址过程;在函数具体调用分析之前,通过静态分析将内核中结构体、数组及单独的函数指针中的间接调用函数信息统一存储在基于类型设计的临时结构中,之后遍历分析每个函数中动态存储的函数指针信息。在完成存储步骤后,分析每一次进行函数间接调用时,通过读取之前的分析结果,获取其具体的跳转目标。最后再结合基于反汇编代码的静态分析,提取出整个操作系统的细粒度内核控制流程图。在获得细粒度内核控制流程图后,系统通过“控制数据索引”技术来实现对操作系统内核中控制流程的保护。该技术通过修改编译器,将系统内核中的控制数据(包括函数指针和返回地址)收集到集中存放的跳转表格中并转换成索引;之后对内核中相关指令进行替换,使编译生成的新内核支持利用索引在函数表和返回地址表中进行寻址和取项。函数跳转和返回时将首先获得关于目标地址的索引,通过索引查询对应的表格获取真实的跳转地址,完成一次控制流程的转换。论文基于GCC/LLVM编译器开发了原型系统,实现了对Linux-3.11.1内核控制流程的细粒度保护,并对原型系统进行了攻击和性能测试。测试结果证明了论文方法的有效性和高效性。