一种基于污点不变集的污点分析方法

文档序号:6549868阅读:663来源:国知局
一种基于污点不变集的污点分析方法
【专利摘要】一种基于污点不变集的污点分析方法,包括如下步骤,步骤1:通过污点分析方法,获得原始污点数据original_set;步骤2:获得污点不变集invariable_set;步骤3:获得最终污点数据taint_set,最终污点数据taint_set=原始污点数据original_set-污点不变集invariable_set。步骤4:制定污点数据结构;步骤5:跟踪污点传播,提出了一种轻量级的污点传播跟踪方法。步骤6:跟踪污点指针,为了实现对污点指针的跟踪,当间接寻址的地址或者寄存器是污点数据时,目的操作数也被标记为污点。步骤7:制定漏洞检测规则,直接对内存函数进行插桩,在内存函数被调用前,检测函数参数是否被污点标记,如果是,则检测到了内存函数漏洞。
【专利说明】一种基于污点不变集的污点分析方法
【技术领域】
[0001]本发明提出的基于污点不变集的污点分析方法用于解决传统污点分析中高误报率的问题,属于计算机软件安全测试领域。
【背景技术】
[0002]代码审计、软件验证和软件测试都是保证软件可靠性和安全性的关键技术,而软件测试是验证软件质量最通用的技术。高质量的软件产品需求,促使软件测试在软件开发周期中占据越来越重要的地位。近期调查显示,软件测试占软件开发成本的比例从50%提高到了 80%。污点分析技术于1998年被提出,2005年后成为研究热点,是由于其具有多种优势和广泛的应用前景,包括:软件保护、软件缺陷发现和软件缺陷分析等。
[0003]污点分析技术通过定位污点源(taint source)、跟踪污点传播(taintpropagation)和漏洞检测规则来发掘软件漏洞。基本思想是将可能被攻击者直接操作的数据标记为污点,被视为不可信(污点)的数据源通常包括:磁盘文件、网络通信、键盘鼠标操作等。跟踪污点数据的传播情况,当污点数据传播到关键操作时,就检测到了漏洞。这种检测方法的原理是:污点数据只能用作非控制用途,而控制数据,例如:代码指针、脚本、命令等都应该是非污点数据。本质上,污点分析是一种细粒度的信息流跟踪技术,能够跟踪不可
的息流向。
[0004]国外的学者针对污点分析技术展开了深入的研究并取得了一些成果。Lam和Chiueh提出了基于污点标记和追踪的方法来监控代码,该方法有两个缺点:一个是适用性低,因为需要重新编译代码;另一个是污点分析不全面,主要是由于不支持控制流的数据处理。Newsome和Song提出了使用动态数据流分析技术来检测缓冲区溢出漏洞的方法,该方法也不支持控制流的数据处理。污点分析技术的发展主要分为两个阶段:2005年-2008年主要集中在污点技术本身的研究,这一时期出现了完善污点分析理论的TaintCheck,LIFT和Dytan等工具;2008年后关注点集中在污点分析方法和其他技术的融合,这一阶段中较为著名的分析工具有buzzfuzz等。
[0005]目前污点传播技术可以分为两类:一个是静态分析(staticanalysis),另一个是动态分析(dynamic analysis)。静态污点分析是将污点传播过程嵌入类型中不需要执行程序,Livshits等在Java下实现了污染数据的静态处理;Shankar等提出了一种针对C程序中格式化串漏洞的检测方法,该方法效率低下并且会出现大量误报;伯克利大学在2002年开发的主要用于检测C语言的脆弱性的Cqual以及在2006年开发的Cqual的扩展版本Oink,在大多情况下都是流不敏感的;ARCHER和IPSSA采用路径敏感分析方法降低了模型的检测精度。而动态污点分析则在程序执行时即时检测数据是否来自外部的非可信输入,该方法存在面临路径爆炸,Perl脚本语言实现了 “污点模式(taint model) ”安全机制;Newsome等使用了影子内存(shadow memory)技术。2009年,MIT的Vijay Ganesh等首次提出将污点跟踪技术和fuzzing测试技术相结合的白盒fuzzing测试,仍然需要依赖源码的依赖性。2010年Tielei Wang等提出利用污点信息在黑盒下生成测试用例的方法,该方法提高了代码覆盖率。
[0006]动态污点分析是软件分析的关键技术之一,经常被用于发掘软件漏洞、分析软件行为、生成漏洞特征、隐私信息保护等。由于能够进行细粒度的信息流跟踪,动态污点分析能够对不同类型的软件漏洞进行发掘,例如:内存破坏、格式化字符串、SQL注入和命令注入、跨站脚本攻击。其中,污点传播直接影响了整个污点分析的效果。例如:如果在传播过程中标记了过多无需标记的数据,则会影响污点分析的速度,同时也会带来过高的误报率;相反的,如果漏掉了部分应该标记为污点的数据,则会带来漏报,其直接结果是无法发现软件缺陷、无法发现恶意攻击等。
[0007]Newsome等人在2005年开发的TaintCheck除了能够检测攻击,还能够产生攻击特征码。Clause等人实现的Dytan系统除了能够对由数据流引起的污点传播进行跟踪,还能对由控制流引起的污点传播进行跟踪。Yin和Song提出了 TEMU系统,它基于开源虚拟机QEMU。TEMU是一个全系统(whole-system)的动态污点分析系统,它最适合对低级别(low-level)的污点传播进行跟踪,例如磁盘文件、内核代码、网络通信,但这种全系统的污点分析会造成更严重的资源开销。
[0008]Kang等人提出的DTA++基于TEMU开发,由于只考虑了部分控制流,所以降低了控制流污点分析的误报率。Wang等人提出的STILL则是基于静态污点分析技术,这是一种不实际执行被测试程序的污点分析技术。动态污点分析也被应用于对Web应用程序的保护。Halfond提出正向(positive)污点分析技术来保护Web应用程序。所谓正向污点指的是可信的输入,相对的,负向(negative)污点指的是可疑输入。其他所有的污点分析都是采用的负向污点分析技术。Python程序也提供了污点分析模式。
[0009]一些动态污点分析系统直接在硬件基础上构建,例如:LIFT,这种硬件级的动态污点分析技术能够极大的提高系统运行速度。但硬件级的动态污点分析通常只能检测低级别的软件漏洞,例如缓冲区溢出,并且硬件级的技术扩展性也很差。此外,污点分析可以运行在源码级或者中间表达形式级。例如=Xu等人提出了一个基于CIL的源码级污点分析软件;Chin和Wagner实现了针对Java程序的基于JVM字节码插桩的污点分析软件。
[0010]传统污点分析是指数据流污点分析,即污点从源操作数传播到目的操作数,例如:y=x+5,该语句执行前,若X是污点数据,则该语句执行后I也被标记为污点数据。现有的研究发现:传统污点分析在某些情况下会产生漏报,这基本上是由控制流引起的,即控制流也能够传播污点,但数据流分析无法捕捉到控制流污点传播。
[0011]通过分析现有的文献资料我们发现,现有的技术大都是基于控制流的污点分析,不支持数据流的污点分析。目前还没有研究机构对污点分析的误报问题开展系统的研究,但实际上,误报也会带来严重的问题。当误报率高的时候,研究人员或分析人员将会耗费大量的精力去区分哪些污点数据是真实的,哪些污点数据是虚假的。当被分析软件的规模加大时,污点分析的误报问题就会越发严重。甚至可以这样说,误报率过高的污点分析技术难以在实际中给予应用。针对传统污点分析的漏报问题,当前已有一些研究提出了一些解决方法。本发明不对传统污点分析的漏报进行研究,而是针对污点分析的误报展开研究。
[0012]就传统污点分析的误报问题开展研究,提出新的污点标记规则,即不应该标记污点不变集。其核心方法就是寻找污点不变集,从传统污点分析这结果中过滤掉污点不变集,达到降低误报率的效果。
【发明内容】

[0013]本方案主要针对传统污点分析技术的高误报率问题进行研究,拟提出一种基于污点不变集的污点分析方法,降低污点分析技术的高误报率。涉及到的具体技术问题包括以下两个方面:
(I)重新定义污点标记规则,即重新定义哪些变量(内存或寄存器)应该被标记为污点,而哪些变量不应该被标记为污点。按照传统的定义,只要源操作数是污点,那么目的操作数就应该被标记为污点,这是一种典型的数据流分析方法。例如:y=x+5,当X为污点数据,该语句执行完后I也是污点数据。这就带来了实际中大量的误报问题,比如:y=x-x、y=x/x>y=x (异或)X等,y的值并不与X相关,因此,如果将y标记为污点,对于后续的基于污点分析的各种软件分析技术而言,都会带来不利的结果。因此,本发明拟解决污点标记规则的定义问题,提出更准确的污点标记定义。
[0014](2)寻找污点不变集。污点不变集是污点不变量的集合,而污点不变量是指由污点数据计算而来,但它的值并不受污点数据的影响。如上面的例子:y=X-X、y=X/X、y=X (异或)X等,X是污点数据,则I就是污点不变量。在这些简单地例子中,寻找污点不变量可以由编译器在编译的时候自动处理,因为编译器会将这些例子自动优化为y=0、y=Uy=0等。但编译器优化这种静态方式只能针对简单的计算表达式,如果I = f(x),这里的f是一个复杂的算术表达式,静态方法就无法确定f(x)的值,自然也无法找到污点不变集。本发明拟采取一种动态的方法寻找污点不变集,降低污点分析的误报率。
[0015]为了实现上述目的本发明采用以下技术方案:
一种基于污点不变集的污点分析方法,包括如下步骤:
步骤1:通过污点分析方法,获得原始污点数据original_set ;
步骤2:获得污点不变集invariable_set ;
步骤2.1:执行输入是input的程序p,得到程序P的所有变量及其值的集合var_set,其中input是指对外部接受的输入的赋值集合;
步骤2.2:初始化循环次数为O ;
步骤2.3:当循环次数小于threshold时,进入步骤2.4 ;否则进入步骤3 ;
步骤2.4:改变输入获得新的输入new_input ;
步骤2.5:执行输入是new_input的程序P,得到程序p的所有变量及其值的集合res_
set ;
步骤2.6:比较集合var—set与集合res—set不同的项,产生集合diff—set ;
步骤2.7:从集合var_set中过滤掉集合diff_set,即保留在不同输入情况下变量没有变化的变量及其值的集合,进入步骤2.3;
步骤3:获得最终污点数据taint_set,最终污点数据taint_set =原始污点数据original_set —污点不变集 invariable_set ;
步骤4:制定污点数据结构;
步骤5:跟踪污点传播;
步骤6:跟踪污点指针,为了实现对污点指针的跟踪,当间接寻址的地址或者寄存器是污点数据时,目的操作数也被标记为污点;步骤7:制定漏洞检测规则,直接对内存函数进行插桩,在内存函数被调用前,检测函数参数是否被污点标记,如果是,则检测到了内存函数漏洞。
[0016]步骤5使用了一种轻量级的污点传播跟踪方法,具体包括如下步骤:
步骤1:初始化存有内存地址和宽度信息、寄存器、指令操作码、指令类型的临时数据结构;
步骤2:查找临时数据结构中所有被读取的寄存器和内存地址;
步骤3:查询污点数据结构中所有被读取的寄存器和内存地址;
步骤4:判断所有被读取的寄存器和内存地址中存储的数据是否是污点数据,如果不是污点数据则进入步骤5,否则进入步骤6 ;
步骤5:删除那些记录在临时数据结构里被修改的寄存器和内存地址的污点信息; 步骤6:标记记录在临时数据结构里的那些被修改的寄存器和内存地址为污点。
[0017]因为本发明采用了以上技术方案,所以具备以下有益效果:
本发明降低传统污点分析的误报率问题,是在现有符号执行方案基础上进行的改进。本发明提出新的污点标记规则,即不应该标记污点不变集,其核心方法就是寻找污点不变集,从传统污点分析这结果中过滤掉污点不变集,达到降低误报率的效果。与其它优化技术相比,本发明有非常明显的效果。其一,通过识别污点不变集,降低污点分析误报率;而在现有的污点分析研究中,还没有研究机构提出针对污点分析误报的有效方法。另一方面,高效率,本发明方法识别污点不变集,采用变异输入,实际执行的方式,对资源消耗低。因此,本方法能够在短时间内找到污点不变集。
【专利附图】

【附图说明】
[0018]图1为本发明的基于污点不变集的污点分析方法的流程图;
图2为本发明的获取污点不变集的方法的流程图;
图3为本发明的轻量级的污点传播跟踪方法的流程图。
【具体实施方式】
[0019]利用新的污点标记定义来寻找污点不变量,从而获得污点不变集。所谓污点不变量,即通过污点数据计算得来,但按照新定义不应该标记为污点的变量。比如I = x/x的变量y。本方法的核心就是从传统污点数据中过滤掉污点不变集,从而达到降低误报率的效果。基于污点不变集的污点分析算法如下:
begin:
1original_set = getTaintset(p, input);
2invariable_set = getNonTaintset(p, input);
3taint_set = original_set — invariable_set;
end:
算法分析:语句1,通过传统污点分析方法,获得原始污点数据original_set ;语句2,获得污点不变集invariable_set ;语句3,获得最终污点数据taint_set。
[0020]获得原始污点数据,本发明采用现有技术获得污点不变集是本发明的创新点。获取污点不变集的算法如下:begin:
1var_set = execute(p,input);
2num =O;
3while (num< threshold);
{
4new—input = mutate(input);
5res_set = execute (p,new—input);
6diff—set = getDiff (var—set,res—set);
7var—set — = diff—set;
8num ++;
}
end
算法分析:语句1,执行程序P,输入是input,得到所有变量及其值的集合var_set ;语句2,初始化循环次数为O ;语句3,当循环次数小于threshold时,进入循环体;语句4,改变输入获得新的输入new_input ;语句5,执行程序P,输入是new_input,得到所有变量及其值的集合res_set ;语句6,比较然后获得var_set, res_set不同的项,产生集合diff_set ;语句7,从var_set中过滤掉diff_set,即保留那些值没有变化的变量;语句8,递增循环次数。
[0021]实施例1
步骤1:通过传统污点分析方法,获得原始污点数据original_set。其中传统污点分析方法是针对常见的污点源进行标记,以磁盘文件为例。通过Pin提供的API对操作系统函数进行插桩,如:open、read、mmap等,因为对磁盘文件的操作一般通过这些函数。需要说明的是,不同的操作系统,需要插桩的函数不同,以Windows为例,需要插桩的函数则是OpenFiIe> ReadFile 等。
[0022]步骤2:获得污点不变集invariable_set。
[0023]步骤2.1:执行输入是input的程序P,得到所有变量及其值的集合var_set,其中input是指对外部接受的输入的赋值集合;
步骤2.2:初始化循环次数为O ;
步骤2.3:当循环次数小于threshold时,进入步骤2.4 ;否则进入步骤3 ;
步骤2.4:改变输入获得新的输入new_input ;
步骤2.5:执行输入是new_input的程序P,得到所有变量及其值的集合res_set ; 步骤2.6:比较集合var_set与集合res_set不同的项,产生集合diff_set ;
步骤2.7:从集合var_set中过滤掉集合diff_set,即保留在不同输入情况下变量没有变化的变量及其值的集合,进入步骤2.3;
步骤3:获得最终污点数据 taint_set:taint_set = original_set — invariable_set。
[0024]步骤4:制定污点数据结构。污点数据的读取和修改是污点分析中最频繁的操作,污点数据读取是指读取一个地址或者寄存器的污点信息,而污点数据修改是指给一个地址或者寄存器赋以新的污点信息。如果需要存储更多的污点信息可以采用Dytan提出的多污点标记(multi taint mark),例如:数据属于哪一个污点源。如果不需要这样多的污点信息,可以采用二进制级的污点分析技术最常见的分析粒度---字节级的分析粒度,只用I位来存储每个字节的污点信息,O表示不是污点,I表示是污点。
[0025]步骤5:跟踪污点传播。污点信息会随着指令执行而传播,简单来讲:污点信息会从源操作数传播到目的操作数。例如:指令moveax, ecx,在执行前寄存器ecx是污点数据,执行后寄存器eax也应该被标记为污点数据。可以将x86指令转换为更容易处理的中间表达形式,这些中间表达形式实际上类似于精简指令集,只有少量的语句类型。也可以采用轻量级的污点传播跟踪方法,而不依赖于中间表达形式,直接对x86指令进行分析。
[0026]步骤6:跟踪污点指针。步骤5能够处理显式(explicit)的污点传播,除此以外,对由污点指针引起的隐式(implicit)的污点传播进行了跟踪。例如:指令moveax, [ecx +0x20],当寄存器ecx是污点数据时,则寄存器eax在执行后也应该被标记为污点。
[0027]跟踪由污点指针引起的污点传播非常重要,因为实际软件经常使用污点指针进行查表操作。如果没有跟踪污点指针,很可能造成误报。为了实现对污点指针的跟踪,对所有指令的间接寻址方式进行了特殊处理。具体而言,当间接寻址的地址或者寄存器是污点数据时,目的操作数也被标记为污点。
[0028]步骤7:制定漏洞检测规则。如果是针对低级别的软件漏洞,典型的做法是检测是否有跳转指令被污点标记,如果是,则检测到了漏洞。这种方式的原理是认为所有漏洞都会导致被攻击程序控制流的转移,但实际上存在许多攻击并不会改变程序控制流,例如针对函数参数的攻击。如果针对高级别的软件漏洞,直接对内存函数进行插桩,在内存函数被调用前,检测函数参数是否被污点标记,如果是,则检测到了内存函数漏洞。监控的内存函数包括内存分配函数,如:malloc、alloc、realloc,内存操作函数,如:memcpy、memmove,字符串操作函数,如:strncpy、strcat。
【权利要求】
1.一种基于污点不变集的污点分析方法,其特征在于包括如下步骤: 步骤1:通过污点分析方法,获得原始污点数据original_set ; 步骤2:获得污点不变集invariable_set ; 步骤2.1:执行输入是input的程序P,得到程序P的所有变量及其值的集合var_set ; 步骤2.2:初始化循环次数为O ; 步骤2.3:当循环次数小于threshold时,进入步骤2.4 ;否则进入步骤3 ; 步骤2.4:改变输入获得新的输入new_input ; 步骤2.5:执行输入是new_input的程序P,得到程序p的所有变量及其值的集合res_set ; 步骤2.6:比较集合var—set与集合res—set不同的项,产生集合diff—set ; 步骤2.7:从集合var_set中过滤掉集合diff_set,即保留在不同输入情况下变量没有变化的变量及其值的集合,进入步骤2.3; 步骤3:获得最终污点数据taint_set,最终污点数据taint_set =原始污点数据original_set —污点不变集 invariable_set ; 步骤4:制定污点数据结构; 步骤5:跟踪污点传播; 步骤6:跟踪污点指针,为了实现对污点指针的跟踪,当间接寻址的地址或者寄存器是污点数据时,目的操作数也被标记为污点; 步骤7:制定漏洞检测规则,直接对内存函数进行插桩,在内存函数被调用前,检测函数参数是否被污点标记,如果是,则检测到了内存函数漏洞。
2.根据权利要求1所述的一种基于污点不变集的污点分析方法,其特征在于:步骤5使用了一种轻量级的污点传播跟踪方法,具体包括如下步骤: 步骤1:初始化存有内存地址和宽度信息、寄存器、指令操作码、指令类型的临时数据结构; 步骤2:查找临时数据结构中所有被读取的寄存器和内存地址; 步骤3:查询污点数据结构中所有被读取的寄存器和内存地址; 步骤4:判断所有被读取的寄存器和内存地址中存储的数据是否是污点数据,如果不是污点数据则进入步骤5,否则进入步骤6 ; 步骤5:删除那些记录在临时数据结构里被修改的寄存器和内存地址的污点信息; 步骤6:标记记录在临时数据结构里的那些被修改的寄存器和内存地址为污点。
【文档编号】G06F11/36GK103995782SQ201410269574
【公开日】2014年8月20日 申请日期:2014年6月17日 优先权日:2014年6月17日
【发明者】牛伟纳, 张小松, 赖特, 陈瑞东, 王东, 陈厅, 冀风宇, 李 杰 申请人:电子科技大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1