一种支持数据间关联分析的污点分析框架及方法

文档序号:26050301发布日期:2021-07-27 15:25阅读:116来源:国知局
一种支持数据间关联分析的污点分析框架及方法

本发明属于网络和信息安全技术领域,具体涉及一种支持数据间关联分析的污点分析框架及方法。



背景技术:

污点分析是一种常用的软件分析技术,在信息安全领域已有较多的研究和应用,典型的应用包括恶意代码分析、软件脆弱性分析、网络攻击行为检测等。

污点分析是在程序分析过程中将“感兴趣”的数据标记为污点数据,通过设置污点源(source点),跟踪数据在程序执行过程中的传播路径,检测污点数据最终能否到达汇聚点(sink点)。污点分析包括三个重要内容:污点源,引入污点数据的位置,污点源是污点分析的起点,在此处通过标记污点数据,将“感兴趣”的数据指定为污点数据,作为后续跟踪分析的对象;汇聚点,即污点检测点,判断是否有受污染数据到达了汇聚点,汇聚点是污点分析的终点;污点传播,通过污点传播规则跟踪污点数据在程序执行过程中的传播过程。污点分析技术包括静态污点分析技术、动态污点分析技术。静态污点分析技术一般是指在被分析程序不运行的情况下,分析程序源码中的程序变量、数据等传播过程。动态污点分析是指在程序执行过程中分析污点数据传播过程。

现有的二进制程序动态污点分析框架大都存在两个方面的问题。

一方面,在程序一次执行的基础上,只能进行一次污点分析,不能很好地处理多污点标签、多source点、多sink点等问题,不能进行“回放”分析,如libdft、taintrabbit等。对同一程序为了进行多次污点分析,如果采用现有的污点分析框架,需要将程序执行多次,而程序每次执行可能由于加载基址、堆栈内存地址、程序执行过程等不同,从而不能很好的综合分析多次污点分析结果,这给软件分析过程带来了诸多不便。

另一方面,现有的分析技术大都专注于分析比特或者字节间的污点传播关系,这虽然在一定程度上提升了分析的准确性,但是这带来一个严重的问题——过多的性能开销。现有的几种典型污点分析框架的分析性能如下表1所示。

表1几种典型污点分析框架性能对比

其中,效率最高的taintrabbit的1.7倍性能损耗是在没有任何污点传播规则的情况下产生的,实际执行时的性能损耗会更高。这两方面问题影响了污点分析在实际软件分析中的广泛应用。



技术实现要素:

针对目前的二进制程序动态污点分析框架存在的不能处理多污点标签、多污点源、多汇聚点、不能进行回放以及性能损耗较大的缺陷和问题,本发明提供一种支持数据间关联分析的污点分析方法。

本发明解决其技术问题所采用的方案是:一种支持数据域间关联分析的污点分析框架,包括程序执行轨迹记录模块、数据流还原模块、通用污点分析模块和数据域关联分析模块;所述程序执行记录模块用于记录程序运行过程中的轨迹信息;所述数据流还原模块用于使用记录的程序运行轨迹信息还原程序完整的数据流传播过程;所述通用污点分析接口模块提供通用的污点分析接口;所述数据域关联分析模块用于对多个数据域进行污点关联分析。

本发明还提供一种支持数据域间关联分析的污点分析方法,包括以下步骤:

(1)记录程序执行轨迹:使用动态二进制插桩技术分别在被分析程序各模块加载后、新线程被创建时、基本块被分析时、基本块被执行时以及api调用前后进行插桩,记录程序各个模块加载后的镜像、线程初始上下文环境、基本块指令内容、基本块执行顺序以及api调用信息;

(2)使用记录的程序运行信息还原完整数据流传播过程:使用记录的程序各个模块镜像,根据记录的线程初始上下文环境初始化模拟执行的上下文环境,根据记录的基本块执行序列依次模拟执行每一个基本块,每个基本块首次出现时,首先反编译基本块内所有指令,然后根据指令的数据流关系生成数据流模板,使用内存hook在产生内存访问时填充数据流模板;在每个基本块模拟执行结束后,将数据流写入日志文件;

(3)根据记录的程序完整数据流,结合程序执行轨迹,使用通用的污点分析接口在记录的程序完整数据流基础上设置污点数据、污点源和汇聚点进行污点分析;

(4)通过数据域间污点关联的传递性,根据数据域在程序执行过程中出现的时机,以倒序的方式使用数据域间污点关联分析算法对数据域逐个进行分析。

上述的支持数据间关联分析的污点分析方法,所述api调用信息包括参数内容和返回值内容。

上述的支持数据间关联分析的污点分析方法,根据基本块指令的内容,按照指令执行顺序,分析每一条指令的数据流传播类型、源数据、目的数据,将每条指令的数据流传播类型、源数据、目的数据构造数据流传播模板;将能够确定的寄存器、立即数直接写入模板,将不能确定的具体内存地址暂时处于空缺状态,当基本块被执行时首先复制一个基本块模板,然后设置内存访问hook,在发生内存读写时将具体内存地址填入模板的空缺位置。

上述的支持数据域间关联分析的污点分析方法,数据流传播类型包括move、operate、exchange和clear;对数据流传播类型进行归一化处理,使其最终只有一种传播类型move,具体包括:

(1)对于原来的move类型,a->b,保持不变,即a->b;

(2)对于operate类型,a=a+b,改为(a,b)->a;

(3)对于exchange类型,a<->b,改为a->t,b->a,t->a,其中t为一个特殊标记数据,不与程序执行过程中的任何数据重复;

(4)对于clear类型,清空a,改为x->a,其中x为一个特殊标记数据,不与程序执行过程中的任何数据重复。

上述的支持数据域间关联分析的污点分析方法,所述数据域间污点关联分析算法具体过程如下:

(1)指定待分析数据域集合r={r0,r1,…ri,…rn}与数据域关联集合a={t0,t1,…tj,…tm},其中i∈[0,n],j∈[0,m];

(2)依次从集合r={r0,r1,…ri,…rn}中取数据域ri进行分析;

(3)当前数据域ri遇到一个与之存在关联的数据域tj,如果tj在数据域关联集合a中已经出现过,则删除当前数据域ri中已经被关联的元素,即r=ri-tj;如果没有出现过,则将该关联关系加入数据域关联集合a,并将tj加入r,r=ri+tj;继续进行数据流追踪;

(4)分析到当前数据域为空,或者被分析程序结束;

(5)取待分析数据域,重复步骤(3)和(4),直到待分析数据域集合r中的所有数据域都已分析过。

上述的支持数据域间关联分析的污点分析方法,对程序执行轨迹和程序流数据进行分析,分析步骤包括以下步骤:

(1)根据需要设置污点数据、污点源、汇聚点,所述污点数据的设置为任意内存和寄存器,污点源和汇聚点是任意api调用处、基本块入口或出口;

(2)从污点源开始,使用记录的程序数据流,根据数据流顺序逐条检查数据流的数据传播过程;

(3)在汇聚点处根据需要检查污点数据判断对汇聚点的数据的影响。

上述的支持数据域间关联分析的污点分析方法,在污点分析过程中还包括对所有的寄存器进行了统一编址,使其与内存一样具有统一的数字标识。

本发明的有益效果:本发明设计了一种由程序执行轨迹记录模块、数据流还原模块、通用污点分析模块和数据域关联分析模块,四个部分组成的污点分析流程,通过将程序执行过程与数据流分析过程相分离的方法,将程序执行过程中的完整数据流进行记录,为多次重复分析提供数据支撑,这样使得每次污点分析的对象都是同一组数据,在离线数据流的基础上,实现了在任意污点数据、任意source点与sink点之间的污点传播分析,以及任意的“回放”分析。

本发明的数据域间关联分析算法的设计使用了数据域间污点关联的传递性进行优化,使用数据域关联集合不断剪枝污点数据域,加速污点数据域收缩,使得污点数据域可能提前为空,使分析过程提前结束,从而实现分析效率的提升。

该方法减少了程序动态二进制分析过程中巨大的性能开销可能带来的问题;也满足了在程序一次执行的基础上,对同一组数据进行分析,避免了不必要的数据整合过程。

附图说明

图1为本发明整体设计框架图。

具体实施方式

针对目前的二进制程序动态污点分析框架存在的不能处理多污点标签、多污点源、多汇聚点、不能进行回放以及性能损耗较大的缺陷和问题,本发明提供一种针对二进制程序的支持数据间关联分析的污点分析框架和分析方法。下面结合附图和实施例对本发明进一步说明。

实施例1:本实施例提供一种针对二进制程序的支持数据间关联分析的污点分析框架,如图1所示,该框架包括4个部分,分别为程序执行轨迹记录模块、数据流还原模块、通用污点分析模块和数据域关联分析模块;其中程序执行记录模块用于记录程序运行过程中的轨迹信息;数据流还原模块用于使用记录的程序运行轨迹信息还原程序完整的数据流传播过程;通用污点分析接口模块提供通用的污点分析接口;数据域关联分析模块用于对多个数据域进行污点关联分析。以下对各模块进行详细说明。

1、程序执行记录模块:在线记录程序运行的信息内容,其中在线记录的内容包括:

程序加载的各个模块的内存镜像:记录这个内容是为了满足程序初始执行时必要的信息,

线程初始的上下文环境,为每个线程提供初始执行的基本信息

基本块指令内容,程序加载后的进程空间虽然能反映绝大多数的代码信息,但是由于在恶意代码中普遍存在shellocde、smc(selfmodifyingcode,自修改代码)、加壳等情况,因此需要在每一个基本块首次出现时记录其指令内容;

程序执行轨迹,在基本块内部,程序执行轨迹是确定的,但是在基本块之间,由于条件跳转、间接跳转等情况的存在,使得程序执行轨迹不确定,依次记录每一个被执行的基本块的首地址可以反映程序的执行轨迹;

api调用信息,记录api的调用信息,包括参数内容、返回值内容等信息。

2、数据流还原模块:使用记录的程序运行信息还原程序完整的数据流传播过程。在轻量化插桩记录提供的数据基础上,为了还原真实的数据流传播过程,本文使用记录的代码和数据,以基本块为单位,按照基本块执行顺序逐个模拟执行基本块内的代码,获取完整的数据流传播过程,具体过程如下。

(1)使用capstone反汇编基本块代码,进行指令分析,生成基本块数据流“模板”,数据流模板是基本块内,按照指令执行顺序,每条指令对应的数据传播过程构成的数据流序列。根据基本块指令的内容,分析每一条指令的数据流传播类型、源数据、目的数据,通过每条指令的这三个要素构造数据流传播模板,在模板中,对于可以确定的数据,如寄存器、立即数等,直接写入模板,对于不能确定的数据,如无法直接确定的具体内存地址,则暂时处于空缺状态。使用数据流模板避免模拟执行时指令级插桩,只需要通过内存hook在不能确定具体的地址填入相应的内存地址即可,对于无内存操作的指令,则不需要再次分析。我们将指令的数据流传播过程分为4种类型,分别为move(数据转移)、operate(数据间运算),clear(清空数据状态),exchange(数据交换),这四种传播类型基本可以涵盖x86指令集中所有指令的数据传播类型。

(2)基本块模拟执行。框架使用unicorn模拟器进行代码模拟执行,基本块模拟执行时,首先加载记录的程序镜像到内存空间指定位置;然后分配必要的堆栈空间;最后,按照记录的基本块顺序逐个基本块模拟执行,在基本块模拟执行过程中,使用内存读写hook,当产生内存读写时,按照第一步生成的数据流“模板”,逐个填充内存地址到对应的位置,在基本块模拟结束后将模拟过程中产生的数据记录到文件中。

3、通用污点分析接口模块:根据数据流还原模块记录的程序完整数据流,结合程序执行轨迹,实现了在任意位置设置污点数据、污点源、汇聚点进行污点分析的能力,以及任意次数的污点分析能力,即“回放”分析的能力,其中通用污点分析接口可以采用setsourceindex、setsinkindex、settaintmemory、doanalysis、showtaintedmemory等。回放分析功能的实现,很大程度上缓解了现有污点分析工具在程序一次执行的基础上只能进行一次污点分析的问题,有效提升了分析的实用性。

通用污点分析模块的分析过程如下:

(1)根据需要设置污点数据、污点源、汇聚点。污点数据的设置可以是任意内存和寄存器,污点源和汇聚点可以是任意api调用处、基本块入口或者出口等。

(2)从污点源开始,使用记录的程序数据流,逐条数据流检查数据传播过程,其中使用一个污点数据集合管理受污染的数据。

(3)判断程序数据流是否到达汇聚点处从而判断对汇聚点的数据的影响。

4、数据域关联分析模块:支持数据域间污点关联分析,对多个数据进行分析。

数据域是指一组内存(含寄存器)地址的集合。通常来说,在数据域内部,一般存在一定逻辑关系,否则随机选择的内存集合作为一个数据域,对其进行研究是没有实际意义的。数据域的大小根据实际需要确定,数据域可以是连续的内存,也可以是不连续的内存。

数据域可以根据实际分析对象需求进行划分,例如,数据域可以是程序的启动参数、i/o缓冲区(包括标准输入输出、文件读写、网络收发等)、api的参数及返回值等。简单来说,数据域就是我们分析程序时需要研究的一段缓冲区。

对于source数据域d0与sink数据域d1,d0与d1相关联,是指在d1中至少存在一个最小数据单元(根据污点分析粒度而定,可以是一个比特或者字节)是由d0中的某些数据经过有限次的数学或者逻辑运算得到。

数据域间的关联关系满足传递性,即如果数据域a与数据域b相关联,数据域b与数据域c相关联,则可得到数据域a与数据域c相关联。数据域间存在直接关联和间接关联两种关联关系。source数据域d0没有经过任何操作即可得到sink数据域d1为直接关联,否则为间接关联。直接关联的两个数据域间不存在一个中间数据域与它们两个都有关,显然对于直接关联的情况,在污点分析时很容易得出结果。对于间接关联的数据域进行关联分析时,则只需要找出一个与这两个数据域都有关的中间数据域即可。

在分析过程中,假设存在a->b->c这样的数据域关联关系,如果发现d与b存在关联,则可以得出d与c关联。在常规的污点分析方法中,d与b相关联,则新的污点数据域为d=d+b,如此分析下去,可能需要完整的污点分析流程。在本文的数据域关联分析中,如果b的关联关系已知,则b后续的关联不需要进行分析,此时污点数据域为d=d-b,这样的分析过程会使数据域d不断收缩,当d为空时,针对数据域d的污点分析过程即可提前结束。

实施例2:本实施例提供一种支持数据域间关联分析的污点分析方法,该方法包括以下步骤:

步骤一、记录程序执行轨迹:使用动态二进制插桩技术分别在被分析程序各模块加载后、新线程被创建时、基本块被分析时、基本块被执行时以及api调用前后进行插桩,记录程序各个模块加载后的镜像、线程初始上下文环境、基本块指令内容、基本块执行顺序以及api调用等信息。

步骤二、用记录的程序运行信息还原完整数据流传播过程:使用记录的程序各个模块镜像,根据记录的线程初始上下文环境初始化模拟执行的上下文环境,根据记录的基本块执行序列依次模拟执行每一个基本块,每个基本块首次出现时,首先反编译基本块内所有指令,然后根据指令的数据流关系生成数据流模板,使用内存hook在产生内存访问时填充数据流模板;在每个基本块模拟执行结束后,将数据流写入日志文件。

其中以基本块为单位的数据流传播“模板”,数据流模板是基本块内,按照指令执行顺序,每条指令对应的数据传播过程构成的数据流序列。根据基本块指令的内容,分析每一条指令的数据流传播类型、源数据、目的数据,通过每条指令的这三个要素构造数据流传播模板,在模板中,对于可以确定的数据,如寄存器、立即数等,直接写入模板,对于不能确定的数据,如无法直接确定的具体内存地址,则暂时处于空缺状态;在基本块被执行时,首先复制一个基本块模板,然后设置内存访问钩子(hook),在发生内存读写时,将具体的内存地址填入基本块模板的空缺位置。

在生成基本块数据流模板时,本发明整理出4种指令数据传播类型,分别是move(拷贝)、operate(运算)、exchange(交换)、clear(清空),这四种传播类型基本可以涵盖x86指令集中所有指令的数据传播类型。在进行污点分析时,对数据流传播类型进一步归一化,最终只有一种传播类型move(拷贝),具体如下。

(1)对于原来的move类型,a->b,保持不变,即a->b;

(2)对于operate类型,a=a+b,改为(a,b)->a;

(3)对于exchange类型,a<->b,改为a->t,b->a,t->a,其中t为一个特殊标记数据,不与程序执行过程中的任何数据重复;

(4)对于clear类型,清空a,改为x->a,其中x为一个特殊标记数据,不与程序执行过程中的任何数据重复。

步骤三、根据记录的程序完整数据流,结合程序执行轨迹,使用通用的污点分析接口在记录的程序完整数据流基础上设置污点数据、污点源和汇聚点进行污点分析。分析步骤为:

(1)根据需要设置污点数据、污点源、汇聚点。污点数据的设置可以是任意内存和寄存器,污点源和汇聚点可以是任意api调用处、基本块入口或者出口等。

(2)从污点源开始,使用记录的程序数据流,逐条数据流检查数据传播过程,其中使用一个污点数据集合管理受污染的数据。

(3)在汇聚点处根据需要检查污点数据是否对汇聚点的数据有影响。

其中在污点分析过程中,对所有的寄存器进行了统一编址,使其与内存一样具有统一的数字标识。以分析32位windows平台的应用程序为例,应用程序使用低2g内存,从0x00000000到0x7fffffff,寄存器编址使用高于0x80000000内存的地址,编址方案为:eax寄存器从低位到高位为依次为:0x80000000,0x80000001,0x80000002,0x80000003,可以看出al寄存器为0x80000000,ah寄存器为0x80000001,ax寄存器为0x80000000、0x80000001;根据此编址方法,对每一个寄存器内存位置间隔0x100,依次编址。如上述的t与x分别编址为0x88000000,0x89000000。

步骤四、通过数据域间污点关联的传递性,根据数据域在程序执行过程中出现的时机,以倒序的方式使用数据域间污点关联分析算法对数据域逐个进行分析。其中数据域间污点关联分析算法具体过程如下:

(1)指定待分析数据域集合r={r0,r1,…ri,…rm}与数据域关联集合a={t0,t1,…tj,…tn},其中i∈[0,m],j∈[0,n];

(2)依次从集合r={r0,r1,…ri,…rm}中取数据域ri进行分析;

(3)当前数据域ri遇到一个与之存在关联的数据域tj,如果tj在数据域关联集合a中已经出现过,则删除当前数据域ri中已经被关联的元素,即r=ri-tj;如果没有出现过,则将该关联关系加入数据域关联集合a,并将tj加入r,r=ri+tj;继续进行数据流追踪;

(4)分析到当前数据域为空,或者被分析程序结束;

(5)取待分析数据域,重复步骤(3)和(4),直到待分析数据域集合r中的所有数据域都已分析过。

程序如下:

该算法的设计使用了数据域间污点关联的传递性进行优化,使用数据域关联集合不断剪枝污点数据域,加速污点数据域收缩,使得污点数据域可能提前为空,使分析过程提前结束,从而实现分析效率的提升。

以上所述仅为本发明的较佳实施例,并不限制本发明,凡在本发明的精神和原则范围内所做的任何修改、等同替换和改进,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1