基于可执行代码的反污点分析方法研究

您所在的位置:网站首页 污点的位置判断方法 基于可执行代码的反污点分析方法研究

基于可执行代码的反污点分析方法研究

2023-07-30 02:47| 来源: 网络整理| 查看: 265

污点分析通过追踪程序中敏感数据来获取数据流信息,作为一种追踪程序中数据生命周期的方法被提出[1],Schwartz等从各个方面对污点分析技术进行了分析和总结[2]。污点分析被应用于各个方面,包括软件安全[3-5]、软件测试[6]、恶意软件分析[7-8]、反混淆[9]中。污点分析作为一种动态分析方法被应用于程序分析。攻击者可以通过污点分析获取良性商用软件的数据流信息,进一步的用于反混淆,最终获取程序的核心算法。然而现在软件面临诸多安全问题,如盗版、篡改、重打包等,污点分析被应用于程序的反混淆中[9-10],作为一种软件逆向技术,使得程序中更多的敏感信息暴漏在攻击者面前,这无疑增加了程序被攻击的风险。

反污点分析作为一种抵抗污点分析的方法,可以有效地阻止攻击者使用污点分析获取程序内敏感数据以及数据流信息[11-12]。文献[11]提出了很多反污点分析的方法, 如基于控制依赖关系的污点消除方法、基于指针的污点消除方法、基于隐式流的污点分析方法等。这些方法可以从一定程度上达到反污点分析的效果,但是这些方法都是基于源代码实现的,而在很多情况下,待保护的软件往往只能以可执行文件的形式提供给保护方,如此便需要一种行之有效的方法在可执行文件上进行反污点分析。

本文提出了一种基于可执行代码的反污点分析方法(binary code anti-taint analysis,BATA),在程序的可执行代码上进行反污点保护,在可执行文件中定位到敏感数据,然后替换相应代码去掉污点标记。由于x86指令的复杂性,要实现上述方法存在以下挑战:1)程序的数据流变化复杂,如何在代码变化复杂的可执行文件中定位到反污点分析保护应该施加的位置,以备进一步的反污点分析保护;2)面对复杂的x86指令,在缺乏已有反污点分析保护技术的情况下设计合适的反污点分析技术;3)在攻击技术日新月异的情况下,保证保护系统的可扩展性。

针对以上问题和挑战,展开讨论,解决反污点保护位置确定的问题以及在可执行代码上的反污点分析保护方法的具体的反污点分析技术。通过理论验证的方式分析了BATA的有效性,通过实验对比了本文提出的反污点分析方法与传统反污点分析方法的性能,实验表明,在可执行文件上进行的反污点分析保护造成的性能损耗相对于在源代码上造成的性能损耗是可以接受的。

1 BATA方法的基本原理

BATA通过多种反污点分析技术对待保护的程序进行反污点分析,该方法可以在未获取待保护程序源代码的情况下对程序进行保护。图 1为BATA方法的反污点分析保护过程。

图1(Fig. 1) 图1 BATA方法反污点分析保护过程 Fig. 1 Anti-taint analysis process of BATA

由图 1可见,BATA主要有5部分:文件结构分析、敏感代码定位、反污点处理、文件内容处理以及PE文件组装组成。BATA的处理对象是Windows平台上原生的PE文件(portable executable file),保护后结果是加入了反污点分析方法且功能保持不变的新的PE文件,新的PE文件具有反污点分析能力,可以抵抗逆向过程中的污点分析。简要介绍BATA的保护过程:

Step 1:根据Windows平台上PE文件固有结构分析PE文件,获取文件内容处理过程中需要用到的信息(节表信息、文件大小等)以备后用;

Step 2:结合源代码中的标记定位需要反污点分析的代码位置;

Step 3:对待保护代码使用反污点分析方法进行反污点保护;

Step 4:修改PE文件的节表、关键代码跳向反污点代码地址、文件大小等信息;

Step 5:使用修改后的文件和反污点分析后得到的代码组成新的PE文件。

在敏感代码定位过程中需要确定待保护代码的位置,根据此步骤提供的位置进行反污点分析保护。由于本文需要在可执行代码上进行反污点分析保护,所以必须有相应的反污点分析方法,针对x86平台PE文件提出了循环转移,控制依赖转移和栈指针转移的反污点分析方法,这些方法可以完成在可执行文件中进行反污点分析,通过实验可以证明相对于源代码级别的反污点分析有着近似或更优的执行效率。

2 BATA中的关键技术 2.1 关键代码定位

要进行反污点分析保护有两种保护思路,一种是对程序中所有的数据进行反污点保护,另一种是对部分关键数据进行保护。第1种方法会造成不可接受的程序运行效率下降问题,并且保护后的文件存在着明显的痕迹,所以本文采用了第2种方法,对部分数据进行反污点分析保护。对部分数据进行反污点分析保护首要面临的问题就是对哪部分数据进行保护,如何在可执行文件中定位到要保护的数据,BATA只需要获得待保护代码的起始和结束地址即可进行保护。针对此问题, 主要提出了两种定位保护位置的方法,标志定位法和地址定位法,分别由开发者和保护者来指定需要保护的内容。

2.1.1 标志定位

标志定位是指开发者在开发过程中通过内联汇编的方式在源代码需要保护的关键代码前后加入特殊的汇编指令,需要保护的关键代码位于汇编指令标志之间,在编译生成可执行文件后,BATA的关键代码定位部分通过查找标记的方法确定需要保护的关键代码部分。

这种方法保证了代码的保护过程对于保护方和被保护方都是一个黑盒的过程。保护方不会过多的获取被保护软件的隐私信息,被保护方不会获取实施保护方保护方法的技术细节,这样有利于保护方法在工业生产中的应用。保护的数据为开发者指定的数据,如此也可以方便满足被保护方提出指定自己需要保护的数据。

2.1.2 地址定位

地址定位指的是直接输入要保护代码的地址。这种方法是为了补充在程序开发完成后有新的保护需求。由于此时已经过了开发阶段再加入新的标记会造成较大的消耗,此时使用关键代码的位置以用于保护。获取关键代码的位置需要有一定软件分析技术,对于未经保护的程序得到其关键代码位置是较容易实现的。图 2为关键代码定位部分的流程图。

图2(Fig. 2) 图2 关键代码定位流程图 Fig. 2 Flow chart of key code location

图 2是关键代码定位的流程图,如图 2所示,有两种方式获得关键代码所在的位置。一种是直接输入的方式,这种方式对于时间要求比较宽松,可以在软件开发的任何时段进行保护。另一种是标志定位,这种方法成本低,可行性高,是BATA所推荐的一种常用的关键代码定位方法。

2.2 反污点分析方法

污点分析通过一个被污染的数据X传播污点到另一个未被污染的数据Y来监控程序的数据流,达到污点分析的目的。反污点分析所做的刚好与之相反,当一个数据X被污染的时候,反污点分析保护要阻断污点传播的过程,阻止X传播到其他数据,尤其是关键数据。

阻断污点数据传播的关键是去污点标记,其具体的实施方法一般是将一个污点标记的数据X通过一些特殊的方法传给变量Y同时保证Y不被污点标记。文献[11-12]提出了一些反污点分析方法,如基于控制依赖关系的反污点分析方法、基于间接指针的反污点分析方法、基于时序的反污点分析方法以及基于隐式流的反污点分析方法等。这些方法需要在程序的源代码上做处理,有着较多的限制。本文结合x86指令的特点提出了简单值转移、控制依赖转移和栈指针间接转移3种反污点分析方法,这3种方法均在程序的二进制文件上进行反污点分析保护,不需要获取程序的源代码,前两种方法的实现原理与源代码中反污点分析方法的原理类似也是利用数据操作中的技巧将污点标记的数据传送到没有被污点标记的变量中,第3种方法则是根据x86系统特有的栈操作设计,完成对数据的反污点分析操作,对于其有效性分析在第3节中予以论证,以下是这3种方法的具体介绍。

2.2.1 简单值转移

表 1左侧是一段简单的汇编代码片段,其功能是判断B加上9之后是否在10到20之间, 若对其使用污点分析,将B标记为污点数据,污点将会通过MOV AX, B传播到AX。如表 1第2列所示,与AX有关的指令都会被污点标记,成为追踪对象。图 3中的数据流将被污点完整标记到,分析者就可以根据污点标记得到程序的数据流图。

表1(Tab. 1) 表1 代码污点标记举例 Tab. 1 Example of taint code 表1 代码污点标记举例 Tab. 1 Example of taint code 原指令 标记后指令 MOV AX, B MOV AX, B ADD AX, 9 ADD AX, 9 CMP AX, ’10’ CMP AX, ’10’ JB EXIT JB EXIT CMP AX, ’20’ CMP AX, ’20’ JA EXIT JA EXIT 图3(Fig. 3) 图3 例子的数据流图 Fig. 3 Data flow graph of the example

使用简单值转移方法就是要将污点标记数据B的值转移到AX中并且不会导致污点传播。如下所示对B不断进行减法操作,对AX不断进行加法操作,当B中的值减为0时,AX中的值变从0增加到B。如此便可以完B到AX的值转移且不会导致AX称为污点数据。具体的首先需要保存当前环境,然后进行反污点分析保护,最后进行环境复原。对于简单值转移方法其方法如图 4所示。

图4(Fig. 4) 图4 简单值转移保护方法 Fig. 4 Plain anti-taint analysis

图 4为简单值转移反污点保护的基本原理,图 4左边是表 1中的编代码,右边是反污点代码,对于污点标记数据AX, 将其通过简单值转移的方法传到bx中,再将其赋给AX,如此完成对污点数据的反污点操作,表 1中的被标记指令将不会被标记,攻击者无法追踪污点数据,便无法获得图 3中的数据流图,程序的安全性便得到了提高。

2.2.2 控制依赖转移

在简单值转移方法中已经展现了反污点分析技术所实现的功能以及达到的效果。控制依赖转移采用了控制依赖转移的方法实现反污点分析。其可以满足反污点分析核心方法多样性的要求。对于一组污点标记的数据,要将其进行反污点处理,可以通过将未被污点标记的数据直接赋值给污点标记的数据来洗白污点数据。该过程需要污点数据和未被标记的数据进行匹配,以保反证污点分析不会影响到数据的正确性。如图 5所示,内置数据是可以构成所有污点数据的一个集合,污点数据通过映射关系,找到其对应的内置数据,然后完成赋值操作,如此完成对污点数据的洗白。

图5(Fig. 5) 图5 控制依赖转移保护方法 Fig. 5 Anti-taint based on control dependence

控制依赖转移方法存在一个问题,内置数据需要包含所有的污点数据,对于值较小的数据可以直接映射,但是对于值较大的数据也直接映射的话会导致内置数据集合非常庞大且在组织映射关系的过程中也会出现效率低下的问题。本文采用了对一个值进行多次映射的方法来解决这个问题,在实验所用的32位系统中,一个寄存器为32位,由8个16进制数组成,对于一个污点标记的寄存器值可以用过两次映射来完成,如图 6所示,寄存器eax为一个8位的16进制数据,左侧为其进行单次映射所对应的数据量,右侧为其对高位和低位分别映射的数据量,可以明显看出单次映射的数据集合大小是两次映射数据集合大小的平方。

图6(Fig. 6) 图6 单次映射和两次映射方法比较 Fig. 6 Single mapping vs. double mapping

这样便可以解决内置数据集过于臃肿的问题。对于其造成的时间效率问题,在第4节中实验表明,其并不会使程序运行速率明显下降。

2.2.3 栈指针间接转移

第2.2.1和2.2.2节分别介绍了简单值转移和控制依赖转移的反污点分析方法,这两种方法在源代码中也有所应用,与前两种方法不同的是栈指针间接转移的反污点分析方法是x86平台可执行代码级别所独有的反污点分析方法。其利用了栈的工作原理,来完成反污点分析。要完成污点数据的反污点分析工作首先需要将一组未被污点的数据压入栈中,然后通过栈数据地址指针来访问站内数据的方式用栈中的数据替代污点标记的数据来完成反污点分析,如图 7所示。

图7(Fig. 7) 图7 栈指针间接转移保护方法 Fig. 7 Anti-taint based on stack pointer

图 7是栈指针间接转移的示意图,从污点数据到栈中数据的映射采用ebp寻址的方式,如图栈中是0到255顺序压入的数据,对于污点数据1,其对应的值1在栈底向上第1个位置,取地址[ebp-1*4]处的值付给原数据完成污点数据的洗白过程。使用ebp寻址的好处在于在寻址过程中栈顶的位置不会发生改变,可以提高其栈使用的安全性,降低栈溢出攻击的风险,同时可以更容易地恢复到程序正常运行的栈环境。与控制依赖转移一样,该方法也面临着对于大数据难以处理的问题,此处可以使用同样的方法,同过多次映射来完成污点数据的洗白操作。

上述主要介绍了3种可执行代码上的反污点分析技术及其原理,研究并利用x86平台可执行代码的特性,通过污点数据洗白的方法在可执行代码上进行反污点分析,对于其反污点分析的可行性和效率问题将分别在第3节和第4节进一步分析。

3 有效性分析

为了增加本文反污点分析方法的可信度,从原理上对其正确性进行分析。

污点分析是通过标记污点数据的方式来获取程序的信息,而反污点分析则需要阻止其获取程序信息,主要方式是通过洗白其污点标记的数据,使得污点数据无法正常传播来达到反污点分析的效果。

要证明反污点分析的可行性,首先需要了解污点分析的机制,对污点分析的一些定义和解释:

O表示污点集合。

M(n)表示将一个数据标记为污点数据,即将数据n加入污点集合。

U(n)表示去除一个污点数据的污点标记,即将数据n从污点集合中去除。

污点分析过程中将一个污点值赋值给另一个变量n的时候需要执行M(n)操作,将n标记为污点值;如果将一个常量或一个未被污点标记的值赋给一个污点值n的时候则需要执行U(n)操作,将n从污点集合中去除,如此来保证污点数据的有效传播,以达到对程序数据进行跟踪的目的。

对于反污点分析方法,如果其可以使M(n)和U(n)操作无效,即污点分析无法有效的传播污点数据,则说明反污点分析是有效的。

对于本文提出的3种反污点分析核心方法,将一一证明,首先是简单值转移反污点分析方法,如图 4中对于bx无论其是否在污点集合内,当运行指令mov bx,0后,bx必不在污点集合内。当运行指令mov ax, bx后需要执行U(ax)操作,将ax从污点集合中去除。由此可见经过简单值转移反污点分析后,污点分析方法将执行U(ax)操作,将污点数据ax从污点集合中去除,同时ax的值没有发生变化,污点分析没有有效的传播污点数据,则证明此反污点分析方法是有效的。同理对于控制依赖转移方法,当一个将一个没有被污点标记的值付给污点值n的时候也会执行U(n)操作,使得污点无法有效的传播,所以控制依赖转移的反污点分析方法同样有效。

对于栈指针间接转移与以上两种方法的作用原理不同。它在进行反污点的过程中使用将污点值所指向的目标地址的值赋给污点值的方法来完成反污点分析。要证明此方法的有效性,只需要证明污点分析方法无法有效地将污点标记从地址传播到内容即可。如图 8所示,左边为4条指令,右边为指令操作的所对应的栈。对于第2条指令它将栈中的第4条数据赋给了ax,第4条指令将栈中的第6条数据赋给了bx。这里ax和bx同为污点数据。首先假设污点分析会对它们所指向地址的内容同时进行污点标记,即ax和bx仍是污点数据,但实际上bx已经完成了一个常量对其的赋值过程,值从0变为9,在污点分析过程中应该被移出污点集合,显然污点传播过程中没能正确的将一个无关数据移出污点集合。其次假设污点分析不会对污点值所指向地址的内容进行污点标记,则执行完第2条和第4条指令后ax和bx均被移出污点集合,虽然ax经历了常量赋值的过程,但其值与污点值有着一定的关系,可以被利用来代替污原污点数据ax完成程序运行的功能。由此可见该情况下污点值无法有效地传播,则说明栈指针间接转移的反污点分析方法是有效的。

图8(Fig. 8) 图8 栈指针间转移有效性分析 Fig. 8 Analysis of anti-taint based on stack pointer

根据以上分析可得,本文提出的反污点分析方法是有效的。但是在可执行代码上做的保护往往会使程序的运行效率大幅度下降,如虚拟机保护,其保护后的程序在时间消耗上比原程序有着明显的增加。针对这个问题,在第4节用实验的方法进行了进一步讨论和验证。

4 性能分析

由于对BATA方法在PE文件上添加了新节,程序的运行时间效果会有一定的增加。通过与源代码上的反污点分析方法[11-12]的比较,发现BATA有着与源代码级别反污点分析近似的运行效率,在部分程序上甚至存在比在源代码上反污点分析更好的运行效率,且不存在运行效率大幅度降低的问题。

实验环境:Win 7 Service Pack 1操作系统,3.3 GHz处理器,4 G内存,VS2013开发环境。

实验对象:由于反污点分析过程中的主要影响因素是程序中需要反污点分析数据的数据量,程序的结构复杂度并不会对反污点分析方法运行效果造成较大影响,本文选取了4种排序算法进行试验。在与源代码级别的反污点分析方法对比时排序算法需要处理的是1 000个随机数,反污点分析则需要对这1 000个数据进行反污点分析保护。

下面是对BATA方法的负载分析。

实验分别使用源代码级别的反污点分析方法[11-12]和BATA方法对程序进行保护。在保护后程序运行期间采集其运行时间数据,每种排序算法通过100次试验分别采集源代码级别反污点保护和BATA方法保护后程序运行数据各100组。如图 7所示,由上到下分别是堆排序、希尔排序、快速排序和冒泡排序使用源代码反污点分析和BATA方法后排序消耗时间对比图,其中,横轴表示第N次试验,纵轴表示每次试验中两种方法保护后程序运行所需的时间。

由图 9(a)~(c)可见,BATA有着较低的运行时间消耗,在堆排序和希尔排序中BATA保护方法比源代码上反污点方法少近1 ms的时间消耗,快速排序是2 ms,冒泡排序中,两种方法所用时间非常近似。

图9(Fig. 9) 图9 源代码反污点和BATA反污点效率比较 Fig. 9 Comparison of source code protect and BATA protect

以上实验结果表明,BATA反污点分析方法并不会造成程序性能的大幅度下降,同时相比原代码级别的反污点分析方法[11-12]有着相似或更低的性能消耗,是可以应用到程序的反污点分析保护中的。

5 总结与展望

提出了BATA反污点分析方法,用以应对自动化污点分析分析窃取程序关键信息的问题。并根据x86平台提出了适合的反污点分析核心技术用于完成BATA方法中的反污点处理。从原理上分析了本文提出的反污点处理技术的有效性,分析表明,BATA所采用的反污点处理技术可以有效地扰乱污点数据的传播,使得污点分析无法有效地传播污点数据,且其结构存在很好的扩展性,可以实时添加新的反污点分析技术。最后,通过实验深入分析BATA所造成的性能损耗,实验表明,与原有的反污点分析方法相比较BATA方法存在近似或更少的性能损耗。从多方面表明了BATA在反污点分析中的优势和意义。然而由于本文是针对x86平台可执行文件设计的反污点分析方法,对与其他平台的软件不适用,在其扩展性方面还存在一定问题。因此,在下一步工作中,需要继续对方法进行升级,使其适应更多的平台。总的来说,本文提出的反污点分析方法对于应对自动化的污点分析技术是很有意义的,它在未增加消耗的情况下完成了可执行程序的反污点分析,对程序保护有着重要的意义。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3