一种基于qemu的内核级代码重用型攻击检测方法

文档序号:9506466阅读:369来源:国知局
一种基于qemu的内核级代码重用型攻击检测方法
【技术领域】
[0001]本发明属于计算机科学与技术领域,涉及恶意软件的防护,具体是一种基于QEMU的内核级代码重用型攻击检测方法。
【背景技术】
[0002]作为一种当代新型的攻击方法,内核级代码重用型攻击不需要注入任何新的代码,仅仅利用(或重用)内核中已有的(合法)代码就能构造完整攻击并从根本上颠覆整个操作系统,它能够逃过内核代码完整性保护机制的防护,给用户计算机系统安全带来了巨大威胁。
[0003]代码重用型攻击需要两步来完成:(I)攻击者精心选择可用的指令片段,并将它们通过特定的指令(比如ret)串接起来;(2)改变系统原有的执行流程(通过篡改内核执行中的某个控制数据,比如函数指针或函数返回地址),跳转到攻击者选择的首个指令片段,实施攻击。
[0004]最早的代码重用型攻击是ROP (return-oriented programming)攻击。由于它精心选择的指令片段都以ret指令结尾,其构造的工具集会包含许多ret指令,这在正常的系统中是不合理的。由此,Chen等人[ICISS 2009]提出了一种通过检测系统指令执行流程中ret指令调用的频繁程度,从而发现ROP攻击的技术方法。北卡州立大学的Li等人[ACMEuroSys 2010]通过修改编译器,去除内核中所有的ret指令操作码字节,使攻击者无法找到可用的指令片段构造攻击。而最新的代码重用型攻击变种已经不再依赖于ret指令,而是改为利用类似的跳转指令(比如间接jmp或“pop+jmp”指令)来串接指令片段,更加难以对付。为此,北卡州立大学的Li等人[IEEE TIFS 2011]提出了一种基于编译器的方法,通过修改内核相关指令(比如间接call和ret指令)保护内核中的控制数据(包括函数指针和函数返回地址)来防止代码重用型攻击。EPFL的Kuznetsov等人[0SDI2014]同样提出了一种基于编译器方法,他们对程序中所有的code-pointer进行保护,从而抵御代码重用型攻击。
[0005]应该说,当前的研究成果对代码重用型攻击的检测已经有一定的效果。但是,已有检测方法大都有技术限制。它们要么需要额外的硬件支持,要么需要修改内核源代码。前者会增加硬件成本且可扩展性较差,而后者对于非开源操作系统内核(比如Windows)则不适用。
[0006]本发明提出的检测方法是基于QEMU虚拟机管理器完成的。QEMU是一款快速、便捷的动态二进制翻译器,它可以启动虚拟机并支持多种不同的CPU架构。由于QEMU以二进制指令翻译的形式执行,它能够对虚拟机内核执行的每一条指令进行干涉(或介入)。而代码重用型攻击均需要改变系统原有的执行流程(第二步),本发明通过对改变内核执行流程的指令(和地点)进行监测,就可以有效检测和发现攻击。并且,现有检测方法中都没有提供对内核中断流程的检测,而攻击者同样能够通过改变内核中断处理中的流程实施攻击。本发明提供了对于内核中断流程的检测和验证。

【发明内容】

[0007]为了弥补现有技术的不足,本发明提出了一种基于QEMU的内核级代码重用型攻击检测方法,该方法用以检测各种内核级代码重用型攻击(及其变种)的行为,保护操作系统的安全。
[0008]为了实现上述目的,本发明所采用的技术方案包括以下步骤:
[0009]1)预处理
[0010]1.1)创建一个空的临时文件temp_file,并将操作系统内核镜像文件中的内容输出到临时文件temp_file中;
[0011]1.2)创建一个记录内核中函数入口地址的文件func_addr_file,从temp_file文件中依次取得内核所有函数的入口地址,并将这些地址写入func_addr_file文件中;
[0012]1.3)创建一个记录内核中函数返回地址的文件ret_addr_file,从temp_file文件中依次取得系统中所有有效的函数返回地址,并将这些地址写入re t_addr_f i 1 e文件中;
[0013]2)基于QEMU的跳转指令目标地址的记录和中断流程验证
[0014]3)跳转指令目标地址验证
[0015]在指令翻译的同时,对QEMU记录的跳转指令的目标地址进行验证,检测是否发生了攻击。
[0016]本发明进一步的改进在于:
[0017]所述步骤2)中,基于QEMU的跳转指令目标地址的记录和中断流程验证的具体方法如下:
[0018]2.1)使用QEMU启动虚拟机内核;
[0019]2.2)在QEMU的从客户机指令到主机指令的翻译阶段,取得内核指令中的一条指令I ;
[0020]2.3)在对指令I进行翻译之前,首先判断是否发生了中断事件,如果发生了中断,则跳转到步骤2.7);
[0021]2.4)判断指令I的类型:如果I是间接call指令,则跳转到步骤2.5);如果I是ret指令,则跳转到步骤2.6);否则跳转到步骤2.8);
[0022]2.5)对间接call指令I进行如下操作:
[0023]2.5a)若文件call_addr.0ut不存在,则创建记录间接call指令目标地址的文件call_addr.0ut ;
[0024]2.5b)在翻译间接call指令I时,对其标志call_flag赋值为1 ;
[0025]2.5c)若此时发生中断,进入中断处理函数时判断call_flag是否为1,若是,则记录中断处理时压栈的返回地址到call_addr.0ut文件中,然后将call_flag赋值为0,跳转到步骤2.5e);
[0026]2.5d) QEMU跳转到间接cal 1指令的目标地址进行翻译,在翻译之前判断标志call_flag是否为1,若是,则记录翻译块首地址到call_addr.0ut文件中,即为间接call指令的目标地址,然后将call_flag赋值为0 ;
[0027]2.5e)跳转到步骤 2.8);
[0028]2.6)对ret指令I进行如下操作:
[0029]2.6a)若文件ret_addr.0ut不存在,则创建记录ret指令的目标地址的文件ret_addr.0ut ;
[0030]2.6b)在翻译ret指令I时,对其标志ret_flag赋值为1 ;
[0031]2.6c)若此时发生中断,进入中断处理函数时判断ret_flag是否为1,若是,则记录中断处理时压桟的返回地址到ret_addr.0ut文件中,然后将ret_flag赋值为0,跳转到步骤2.6e);
[0032]2.6d) QEMU跳转到ret指令的目标地址进行翻译,在翻译之前判断ret_f lag是否为1,若是,则记录翻译块首地址到:ret_addr.0ut文件中,即为ret指令的目标地址,然后将ret_flag 赋值为 0 ;
[0033]2.6e)跳转到步骤 2.8);
[0034]2.7)对中断进行如下操作:
[0035]2.7a)若int_addr.0ut文件不存在,贝丨彳仓ll建记录中断信息的文件int_addr.0ut ;
[0036]2.7b)若无自定义桟,则初始化桟int_addr,桟顶指针指向第一个位置;
[0037]2.7c)在QEMU处理中断的函数中将系统压栈的返回地址同时压入自定义栈int_addr 中;
[0038]2.7d)当QEMU执行中断程序完毕后,调用中断返回指令时,将自定义栈int_addr中的返回地址出栈,与中断返回指令的返回地址相比较,如果二者不同,则报告发生了攻击,并将对比结果不同的返回地址记录到int_addr.0ut文件中;
[0039]2.7e)跳转到步骤 2.4);
[0040]2.8)如果操作系统内核还有未处理的指令,返回步骤2.2),开始下一条指令的处理;否则结束。
[0041]所述步骤2.4)中,指令I的类型是QEMU通过识别二进制指令的操作码进行判断的。
[0042]所述步骤3)中,跳转指令目标地址验证步骤具体如下:
[0043]3.1)读取call_addr.0ut中的每个新增的目标地址,验证其是否是func_addr_file文件中的函数入口地址,如果不是,则报告发生了攻击;
[0044]3.2)读取ret_addr.0ut中的每个新增的目标地址,验证其是否是ret_addr_f ile文件中的有效函数返回地址,如果不是,则报告发生了攻击;
[0045]3.3)返回到 3.1)。
[0046]本发明与现
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1