一种数据流跟踪方法

文档序号:6525919阅读:283来源:国知局
一种数据流跟踪方法
【专利摘要】本发明公开了一种数据流跟踪方法,包括三个阶段:客户操作系统指令静态反汇编,根据静态的客户机x86指令生成对应的污点传播指令,进行污点数据传播更新操作,对于在静态反汇编时不能获取的内存操作数物理地址,通过采用共享缓存的方式在动态执行过程中获取;编译产生宿主机执行代码,根据上一阶段的污点指令生成宿主机上的可执行代码,以处理函数的形式进行生成,方便下一阶段的执行;开启新的执行线程,执行污点指令,逐条取出污点指令,调用其处理函数。本发明方法通过将污点跟踪操作和模拟器动态二进制翻译执行模块分离,实现基于x86指令级的污点语义翻译和并行化的污点传播更新,减少无用的污点跟踪操作,提高系统和用户的交互体验。
【专利说明】一种数据流跟踪方法
【技术领域】
[0001]本发明属于计算机安全领域,更具体地说,本发明涉及一种数据流跟踪方法。
【背景技术】
[0002]数据流跟踪技术是一种在信息安全领域被广泛使用的安全技术。采用字节级的污点标记对低级的机器状态(CPU寄存器、物理内存、磁盘块等等)进行污点标记,同时拦截和分析系统指令流,分析出指令流对污点标记的影响从而更新和维护污点标记。为了获得数据流跟踪所需的细粒度分析能力,污点跟踪系统需要采用动态二进制插桩技术对目标应用程序进行插桩或者通过模拟器运行目标系统。
[0003]基于动态二进制插桩技术实现的污点跟踪系统由于需要获得被目标程序更高的权限级,因此通常只适用于应用层的应用程序的插桩。基于模拟器的污点跟踪系统通过在模拟器比如QEMU中运行整个目标系统环境,能够对内核级的代码进行跟踪。但是,当前基于模拟器实现的污点跟踪系统比如TEMU、Arg0S等,都存在性能开销过大的问题。
[0004]QEMU模拟器在对CPU进行模拟运行目标系统时,首先通过对目标系统的二进制代码块进行反汇编,翻译成一种类似精简指令集计算机(Reduced Instruction SetComputer, RISC)的平台无关的中间指令,然后进一步将这些中间指令编译成能够运行于宿主操作系统上的指令运行。传统的基于QEMU的污点跟踪系统在实现时都是在中间指令级进行修改,然而一条x86指令往往会被翻译成多条中间指令,比如对于pUSh%ebX这条x86指令,QEMU会将其翻译成对应的5条中间指令:Id_i32tmp0, env, $0xc; ld_i32tmp2, env, $0x10;movi_i32tmpl4, $0xfffffffc;add_i32tmp2, tmp2, tmpl4;qemu_st32tmp0, tmp2, $0x0; st_i32tmp2, env, $0x10。因此对于一条 x86 指令,原本只需要进行一次污点更新操作,基于中间指令实现,将会产生对应的多次污点传播更新操作,而其中大部分操作都是对QEMU内部变量进行的跟踪更新,是无用的操作。基于中间指令实现的污点跟踪系统,实现简单直接,却存在大量无用的操作,导致性能开销比较大。

【发明内容】

[0005]针对现有技术的以上缺陷或改进需求,本发明提供了一种数据流跟踪方法,该方法基于模拟器进行数据流跟踪的优化,包括对客户操作系统指令进行反汇编的阶段、编译产生宿主机执行代码的阶段和最终代码执行的阶段,其中:
[0006]在对客户操作系统指令进行反汇编的阶段,模拟器对客户操作系统指令进行反汇编的同时产生污点指令,污点指令为特定的编码形式,固定大小为4个字节,包括操作码(opcode)、源操作数、目的操作数以及ArgLogPos字段;
[0007]在编译产生宿主机执行代码的阶段,对之前产生的污点指令进行编译产生宿主机上运行的指令,每一个污点指令对应于一个处理函数,用于执行该污点指令代表的污点更新操作;
[0008]在最终代码执行阶段,开启新的线程执行污点指令,进行污点跟踪的操作,执行的过程就是逐条取出污点指令并调用污点指令处理函数。
[0009]进一步优选地,所述污点指令固定大小为4个字节,其中包括操作码(opcode),占4个bit位;源操作数和目的操作数,分别占6个bit位,以及ArgLogPos字段,占16个bit位,ArgLogPos字段指定了内存操作数地址在共享缓存ArgLog的位置。
[0010]进一步优选地,在所述客户操作系统指令进行反汇编的阶段,具体进行如下操作:
[0011](1-1)取出客户操作系统的一条指令进行反汇编;
[0012](1-2)判断当前客户操作系统的指令是否会产生污点传播;如果不会产生污点传播,则转入步骤(1-6);
[0013](1-3)判断当前客户操作系统的指令是否包括内存操作数,即是否需要动态获取内存操作数的地址;如果没有包括内存操作数,则转入步骤(5);
[0014](1-4)在ArgLog共享缓存中分配一块空间,用于后面保存动态获取的内存操作数地址,将该空间在ArgLog中的地址写入污点指令的ArgLogPos字段中;
[0015](1-5)分析客户操作系统的指令,编码污点指令的opcode,源操作数和目的操作数字段;
[0016](1-6)判断当前客户操作是否还有指令需要进行翻译;如果还有指令需要进行翻译,则转入步骤(1-1)。
[0017]进一步优选地,在编译产生宿主机执行代码的阶段,具体进行如下操作:
[0018](2-1)从第一阶段生成的污点指令缓存中取出一条污点指令;
[0019](2-2)判断当前污点指令是否存在处理函数;如果已经存在处理函数,则转入步骤(2-6);
[0020](2-3)判断当前污点指令是否需要动态获取内存操作数地址;如果不需要,则转入步骤(2-5);
[0021](2-4)通知模拟器后端编译TCG模块,在运行过程中动态获取需要的内存操作数地址写入ArgLog指定的共享内存中;
[0022](2-5)在处理函数代码缓存中为污点指令编译对应的处理函数;
[0023](2-6)判断是否还有污点指令需要进行处理;如果有,则转入步骤(2-1)。
[0024]进一步优选地,在最终代码执行阶段,具体进行如下操作:
[0025](3-1)创建新的线程,调用污点跟踪执行函数去执行污点跟踪指令;
[0026](3-2)线程在执行过程中,从污点指令缓存中取出一条污点指令,已污点指令为下标在处理函数缓存中寻址到对应的处理函数并调用执行;
[0027](3-3)判断当前污点指令需要的内存操作数地址是否已经在ArgLog缓存中;如果已经写入,则转入步骤(3-5);
[0028](3-4)等待模拟器执行主线程将动态获取的内存操作数地址写入ArgLog缓存中;
[0029](3-5)判断污点指令是否执行完毕;如果没有执行完毕,则转入步骤(3-2);
[0030](3-6)撤销线程。
[0031]总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有以下有益效果:
[0032]( I)模块化的污点跟踪系统实现[0033]本发明相对于传统的污点跟踪系统,将污点更新操作和模拟器本身的动态二进制翻译执行过程视为独立的两个过程,从而在实现过程中可以以完全独立的模块进行实现,传统的污点跟踪系统需要对模拟器的内部函数进行大量修改,耦合性太强。
[0034](2)闻效的污点跟踪系统性能
[0035]本发明设计了一套独立的污点跟踪指令,在对客户机指令进行反汇编的时候就产生对应的污点指令,从而能够基于x86指令级进行污点更新操作,传统的污点跟踪系统在中间指令级进行污点更新操作,导致大量无用的操作过程,因此本发明的污点跟踪系统能够获取非常闻的污点跟踪性能。
[0036](3)提闻目标系统和用户交互体验
[0037]污点指令的执行是由独立的线程进行执行,达到和目标系统运行的主线程并行执行的效果,可以提高在模拟器中运行的系统对用户的交互体验。传统的污点跟踪系统污点传播的代码和主线程的执行代码混合,将会严重影响系统运行时和用户的交互。。
【专利附图】

【附图说明】
[0038]图1为本发明对模拟器动态二进制翻译过程的扩展流程示意图;
[0039]图2为本发明设计的污点指令格式示意图;
[0040]图3为本发明反汇编客户操作系统指令生成污点指令的流程图;
[0041]图4为本发明编译污点指令生成宿主机执行代码的流程图;
[0042]图5为本发明执行污点指令的流程图。
【具体实施方式】
[0043]为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
[0044]本发明针对x86指令和污点跟踪操作设计了一套简单的污点跟踪指令集,同时修改模拟器的动态二进制翻译流程,在对客户操作系统进行动态二进制翻译生成宿主机代码执行的过程中同步生成一套虚拟的污点跟踪指令集并执行,用以完成污点跟踪操作。本发明将污点跟踪操作视为一个独立的过程,和模拟器的动态二进制翻译过程独立,最终在执行的过程中和模拟器原本的执行过程也是完全独立,可以在不同的线程上执行,从而进一步提高污点跟踪系统的性能。整个过程如图1所示,图中右边部分为模拟器本身的翻译过程,首先对客户操作系统的代码块(x86)进行反汇编生成中间指令(TCG),然后将中间指令进一步编译成宿主机上运行的指令(x86),最后由QEMU的执行线程去执行最终翻译好的指令块。在这个过程中,本发明添加了图中左边所示的流程,在模拟器反汇编客户操作系统生成中间指令的同时,本发明针对客户操作系统的x86指令生成污点跟踪指令(taintinstruction),这些污点跟踪指令的功能是负责进行对应的污点更新操作。然后对生成的污点跟踪指令进行编译生成宿主机执行的代码,最后通过开辟新的线程去执行生成的宿主机代码完成污点跟踪操作。
[0045]下面详细讲述本发明针对x86指令设计的用于完成污点更新操作的污点指令。污点更新操作是数据流跟踪系统的关键操作,通过对系统执行过程中的指令流进行分析,能够知道污点标记在系统中的传播过程,比如对于x86指令mov%ebx, %eax,这条指令将会导致eax寄存器的污点标志传播到ebx寄存器中。污点更新操作就是完成污点标志更新的过程。对于x86指令集,污点更新操作可以总结为两种,一种是设置(set)操作,另一种是合并(merge)操作。Set操作把目的操作数的污点标记设置成源操作数的污点标记,比如对于上面的这条mov指令,就是属于set操作,即Set (dst=ebx, src=eax)。Merge操作将会合并源操作数的污点标记和目的操作数的污点标记。比如对于add%eax, %ebx指令。同时在x86指令集中存在大量条件指令和REP指令,因此总结taint opcode有6种操作。分别为设置(Set)、合并(Merge)、条件设置(CondSet)、条件合并(CondMerge)、重复设置(RepSet)、重复合并(RepMerge),对于这6种操作,在污点指令中通过OxOO到0x05进行编码。
[0046]除了 opcode之外,污点指令还包括需要进行污点标记更新的源操作数和目的操作数,污点指令格式如图2所示。Opcode占4个bit,源操作数和目的操作数分别占6个bit。最后还有一个16个bit的ArgLogPos字段。
[0047]对于x86中的涉及到内存寻址的指令,在静态反汇编的过程中无法获取到内存操作数的地址,比如push%ebX指令,这条指令将ebx寄存器压入内存堆栈中,对于污点更新操作来说,需要更新由esp指定的堆栈内存的污点标记为ebx寄存器的污点标记,但是在静态反汇编过程中,是不能得到esp寄存器中的值,也就是在静态反汇编过程中获取不到堆栈内存的地址。本发明通过在污点指令中添加ArgLogPos字段解决这个问题。首先修改模拟器的动态二进制翻译执行模块,在系统运行过程中动态获取到esp寄存器的值,然后预先开辟一块共享缓冲区ArgLog,动态获取的esp寄存器值写入该共享缓冲区中,当污点指令在执行时,从该共享缓冲区中就能够获取到之前保存的esp寄存器的值,污点指令中的ArgLogPos用于指定当前污点指令需要的动态获取的参数在共享缓冲区中的地址。
[0048]每一条污点跟踪指令固定为4个字节,在执行时从翻译好的指令缓存中逐条读取出污点指令,调用对应的处理函数进行污点指令的“执行”,由单独的线程负责污点跟踪指令的执行,从而完成污点更新操作。
[0049]本发明采用一种优化的数据流跟踪机制提高基于模拟器的数据流跟踪系统的性能,通过对模拟器的动态二进制翻译执行过程进行面向数据流跟踪的优化和修改实现。主要体现在三个阶段:1、对客户操作系统指令进行反汇编的阶段2、编译产生宿主机执行代码的阶段3、最终代码执行的阶段。
[0050]对于第一阶段,如图3所示,主要步骤如下:
[0051](1-1)取出客户操作系统的一条指令进行反汇编。
[0052](1-2)判断当前客户操作系统的指令是否会产生污点传播。如果不会产生污点传播,则转入步骤(1-6)。
[0053](1-3)判断当前客户操作系统的指令是否包括内存操作数,即是否需要动态获取内存操作数的地址。如果没有包括内存操作数,则转入步骤(5)。
[0054](1-4)在ArgLog共享缓存中分配一块空间,用于后面保存动态获取的内存操作数地址,将该空间在ArgLog中的地址写入污点指令的ArgLogPos字段中。
[0055](1-5)分析客户操作系统的指令,编码污点指令的opcode,源操作数和目的操作数字段。[0056](1-6)判断当前客户操作是否还有指令需要进行翻译。如果还有指令需要进行翻译,则转入步骤(1-1)。
[0057](1-7)结束。
[0058]本阶段在模拟器对客户操作系统x86指令进行反汇编的同时,产生对应的污点指令,每一条污点指令固定编码为4个字节,包含了需要进行的污点更新操作。通过这种方式,一方面实现在x86指令级进行污点跟踪,避免在中间指令级进行带来的大量无用污点跟踪操作;另一方面,通过开辟新线程执行污点指令,实现污点更新操作和模拟器主线程的分离,达到并行化地执行污点更新。
[0059]对于第二阶段,如图4所示,主要步骤如下:
[0060](2-1)从第一阶段生成的污点指令缓存中取出一条污点指令。
[0061](2-2)判断当前污点指令是否存在处理函数。如果已经存在处理函数,则转入步骤(2-6)。
[0062](2-3)判断当前污点指令是否需要动态获取内存操作数地址。如果不需要,则转入步骤(2-5)。
[0063](2-4)通知模拟器后端编译TCG模块,在运行过程中动态获取需要的内存操作数地址写入ArgLog指定的共享内存中。
[0064](2-5)在处理函数代码缓存中为污点指令编译对应的处理函数
[0065](2-6)判断是否还有污点指令需要进行处理。如果有,则转入步骤(2-1)。
[0066](2-7)结束。
[0067]本步骤在模拟器对中间指令进行编译产生宿主机指令的同时,对污点指令也进行编译,取出每一条污点指令,检查污点指令是否有对应的污点指令处理函数,如果没有,在污点指令处理函数缓存中动态为其生成。通过采用动态生成和缓存的方式对污点指令进行编译生成对应的处理函数,能够对系统的空间和时间要求进行平衡。如果采用静态为所有污点指令编写对应处理函数的方式,污点指令处理函数代码将会占用系统可执行文件空间,同时运行时加载进内存占用系统内存空间。另一方面,动态生成处理函数,能够减小最终可执行文件大小和减少运行时对系统的内存要求,系统在运行时并非所有的污点指令都会产生,只有产生的污点指令才需要有对应的处理函数。但是动态生成会带来额外的生成开销,通过采用缓存的方式,能够避免重复地生成相同的污点指令处理函数。
[0068]对于第三阶段,如图5所示,主要步骤如下:
[0069](3-1)创建新的线程,调用污点跟踪执行函数去执行污点跟踪指令。
[0070](3-2)线程在执行过程中,从污点指令缓存中取出一条污点指令,已污点指令为下标在处理函数缓存中寻址到对应的处理函数并调用执行。
[0071](3-3)判断当前污点指令需要的内存操作数地址是否已经在ArgLog缓存中。如果已经写入,则转入步骤(3-5)。
[0072](3-4)等待模拟器执行主线程将动态获取的内存操作数地址写入ArgLog缓存中。
[0073](3-5)判断污点指令是否执行完毕。如果没有执行完毕,则转入步骤(3-2)。
[0074](3-6)撤销线程。
[0075](3-7)结束。
[0076]本阶段在模拟器执行动态翻译过后的代码的同时,开辟新的执行线程,去执行污点指令,污点指令的执行过程,即逐条取出污点指令,调用对应的污点指令处理函数。因为污点指令为固定大小的4个字节,因此预先分配一块内存数组,记录所有污点指令的污点处理函数地址,只需要以污点指令为下标,就能够在这个数组中快速定位到对应的污点处理函数地址并调用。数组中的处理函数地址由上一阶段生成处理函数时进行填入。采用新的线程执行污点指令,能够和模拟器主线程并行执行,由于污点指令执行过程中进行污点传播更新操作,而这些更新操作往往会占用大量的CPU运行时间。因此和模拟器主线程并行处理时,不会影响主线程和用户交互的体验,同时在多核系统中,新的线程在独立的CPU中运行,达到真正的并行执行,性能会更进一步提升。
[0077]本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种数据流跟踪方法,其特征在于,该方法基于模拟器进行数据流跟踪的优化,包括对客户操作系统指令进行反汇编的阶段、编译产生宿主机执行代码的阶段和最终代码执行的阶段,其中: 在对客户操作系统指令进行反汇编的阶段,模拟器对客户操作系统指令进行反汇编的同时产生污点指令,污点指令为特定的编码形式,固定大小为4个字节,包括操作码(opcode)、源操作数、目的操作数以及ArgLogPos字段; 在编译产生宿主机执行代码的阶段,对之前产生的污点指令进行编译产生宿主机上运行的指令,每一个污点指令对应于一个处理函数,用于执行该污点指令代表的污点更新操作; 在最终代码执行阶段,开启新的线程执行污点指令,进行污点跟踪的操作,执行的过程就是逐条取出污点指令并调用污点指令处理函数。
2.根据权利要求1所述的数据流跟踪方法,其特征在于,在所述客户操作系统指令进行反汇编的阶段,具体进行如下操作: (1-1)取出客户操作系统的一条指令进行反汇编; (1-2)判断当前客户操作系统的指令是否会产生污点传播;如果不会产生污点传播,则转入步骤(1-6); (1-3)判断当前客户操作系统的指令是否包括内存操作数,即是否需要动态获取内存操作数的地址;如果没有包括内存操作数,则转入步骤(5); (1-4)在ArgLog共享缓存中分配一块空间,用于后面保存动态获取的内存操作数地址,将该空间在ArgLog中的地址写入污点指令的ArgLogPos字段中; (1-5)分析客户操作系统的指令,编`码污点指令的opcode,源操作数和目的操作数字段; (1-6)判断当前客户操作是否还有指令需要进行翻译;如果还有指令需要进行翻译,则转入步骤(1-1)。
3.根据权利要求1或2所述的数据流跟踪方法,其特征在于,在编译产生宿主机执行代码的阶段,具体进行如下操作: (2-1)从第一阶段生成的污点指令缓存中取出一条污点指令; (2-2)判断当前污点指令是否存在处理函数;如果已经存在处理函数,则转入步骤(2-6); (2-3)判断当前污点指令是否需要动态获取内存操作数地址;如果不需要,则转入步骤(2-5); (2-4)通知模拟器后端编译TCG模块,在运行过程中动态获取需要的内存操作数地址写入ArgLog指定的共享内存中; (2-5)在处理函数代码缓存中为污点指令编译对应的处理函数; (2-6)判断是否还有污点指令需要进行处理;如果有,则转入步骤(2-1)。
4.根据权利要求1至3任一项所述的数据流跟踪方法,其特征在于,在编译产生宿主机执行代码的阶段,具体进行如下操作: (3-1)创建新的线程,调用污点跟踪执行函数去执行污点跟踪指令; (3-2)线程在执行过程中,从污点指令缓存中取出一条污点指令,已污点指令为下标在处理函数缓存中寻址到对应的处理函数并调用执行; (3-3)判断当前污点指令需要的内存操作数地址是否已经在ArgLog缓存中;如果已经写入,则转入步骤(3-5); (3-4)等待模拟器执行主线程将动态获取的内存操作数地址写入ArgLog缓存中; (3-5)判断 污点指令是否执行完毕;如果没有执行完毕,则转入步骤(3-2); (3-6)撤销线程。
【文档编号】G06F21/52GK103714288SQ201310733715
【公开日】2014年4月9日 申请日期:2013年12月26日 优先权日:2013年12月26日
【发明者】邹德清, 金海 , 袁劲枫 申请人:华中科技大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1