一种基于静态分析和模糊测试相结合的并发漏洞检测方法与流程

文档序号:17443453发布日期:2019-04-17 05:08阅读:435来源:国知局
一种基于静态分析和模糊测试相结合的并发漏洞检测方法与流程

本发明属于软件安全领域,更具体地,涉及一种基于静态分析和模糊测试相结合的并发漏洞检测方法。



背景技术:

随着计算机向多核高并发计算的方向发展,利用多核的并发程序越来越多。虽然并发程序能极大地利用多核提升算力,但其自身也被由并发引起的漏洞的问题所困扰。众所周知,并发引起的漏洞不同于传统单线程下的漏洞,其具有难发现、难重复的特点,一直以来是软件漏洞检测方面的关键问题和难题。

目前几乎所有科技公司在发布软件之前都会用模糊测试或者近似的方式来测试待测软件,看其是否会在其过程中崩溃或者产生异常行为。模糊测试一直是发掘软件漏洞非常有效的手段之一。其能高效率地反复执行程序,并且不断修改执行程序时的输入,目标使得程序各部分都能被执行到。

然而,模糊测试本身由于对程序并发的线程并无感知,使得其在检测并发漏洞时十分低效,并且并发漏洞由于其自身也有难检测,难重现的特点,使其很难与模糊测试相结合。



技术实现要素:

针对现有技术的缺陷,本发明的目的在于解决现有技术中由于模糊测试对并发程序的线程调度没有感知导致在检测并发漏洞方面十分低效的技术问题。

为实现上述目的,第一方面,本发明实施例提供了一种基于静态分析和模糊测试相结合的并发漏洞检测方法,该方法包括以下步骤:

s1.静态分析并发程序源代码,在源代码中标记并发程序中与并发漏洞相关的敏感操作及敏感操作的执行顺序;

s2.编译过程中,在标记的敏感操作周围插入线程优先级强制调度代码,将插入线程优先级强制调度代码的汇编代码编译为可执行程序;

s3.在模糊测试可执行程序的过程中,利用线程优先级强制调度机制调度敏感操作按照执行顺序执行,使其触发并发漏洞;

s4.并发漏洞被触发之后,使用触发并发漏洞的输入去重新运行可执行程序,并根据此进行漏洞验证。

具体地,步骤s1包括以下子步骤:

s101.查找待检测并发程序源代码中被不同线程共享的共享变量;

s102.在所述共享变量的基础上,构建这些变量依赖关系的数据流;

s103.标记所述数据流上可能引发并发漏洞的敏感操作;

s104.根据并发关系合并数据流;

s105.将所述敏感操作根据并发漏洞的类型进行分类;

s106.对于每种类型的并发漏洞,确定触发该类型并发漏洞的敏感操作执行顺序。

具体地,在步骤s2中,还可以插入优先级随机化代码。

具体地,步骤s3包括以下子步骤:

s301.在模糊测试中,标记可执行程序中的不同线程;

s302.每当执行到某个线程时,将其优先级设置为最低或者最高,并且记录下执行的情况;

s303.根据全局所有线程优先级设置的情况,自动调整尚未被测试到的线程的优先级,并且安排相应的线程的优先级去测试那些尚未被测试到的情况。

具体地,步骤s4具体为:根据触发漏洞的程序输入,以及静态检测得到的敏感操作执行顺序,重新执行这个程序,看能否重现异常行为,若异常行为被重现,则可以确认这个漏洞的真实性,否则,则存疑。

第二方面,本发明实施例提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述第一方面所述的并发漏洞检测方法。

总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有以下有益效果:

1.本发明通过静态分析源代码,发现与并发漏洞相关的敏感操作及敏感操作的执行顺序,通过强制调度模糊测试的线程优先级,使得模糊测试中始终按照能触发并发漏洞的执行顺序执行,进而极大地增加了并发漏洞在模糊测试过程中被触发的几率。

2.本发明采取将线程的优先级随机化调度引入模糊测试的方法,使得模糊测试在测试多线程程序时,能够主动地去遍历所有的线程之间优先级的可能情况,从而使得模糊测试能够有效地探。

附图说明

图1为本发明实施例提供的一种基于静态分析和模糊测试相结合的并发漏洞检测方法流程图;

图2为本发明实施例提供的步骤s1的子步骤示意图;

图3为本发明实施例提供的线程优先级强制调度过程示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

本发明的整体思路在于,针对由并发引起的漏洞区别于一般在单线程情况下出现的漏洞,只可能在多线程程序中出现。本发明先使用静态扫描发现并发程序中潜在的并发的敏感操作,再对这些并发敏感操作按照并发漏洞类型进行分类。再利用模糊测试插桩去触发这些并发漏洞。在模糊测试阶段,本发明提出了模糊测试和线程优先级强制调度相结合的方式。具体而言,在模糊测试过程中通过随机化线程的优先级使得模糊测试能探索更多的线程优先级强制调度情况,以及在潜在漏洞点,通过强制调度线程来触发漏洞。使得模糊测试在检测并发程序方面更加高效。

如图1所示,一种基于静态分析和模糊测试相结合的并发漏洞检测方法,该方法包括以下步骤:

s1.静态分析并发程序源代码,在源代码中标记并发程序中与并发漏洞相关的敏感操作及敏感操作的执行顺序;

s2.编译过程中,在标记的敏感操作周围插入线程优先级强制调度代码,将插入线程优先级强制调度代码的汇编代码编译为可执行程序;

s3.在模糊测试可执行程序的过程中,利用线程优先级强制调度机制调度敏感操作按照执行顺序执行,使其触发并发漏洞;

s4.并发漏洞被触发之后,使用触发并发漏洞的输入去重新运行可执行程序,并根据此进行漏洞验证。

在步骤s2中,还可以插入优先级随机化代码。

优先级随机化代码可随机化线程的优先级,这样在模糊测试运行的过程中,使得不同线程的优先级随着模糊测试的进行而改变,每次执行时线程的优先级不同,从而模糊测试能探索更多的线程优先级强制调度以及在潜在漏洞点,加大了模糊测试探索线程调度的能力。

步骤s1.静态分析并发程序源代码,在源代码中标记并发程序中与并发漏洞相关的敏感操作及敏感操作的执行顺序。如图2所示,步骤s1具体包括以下子步骤:

s101.查找待检测并发程序源代码中被不同线程共享的共享变量。

利用静态分析工具提取程序控制流、数据流。对于并发程序,进行并发数据流的分析,与传统数据流分析不同的是,只关注可能被不同线程访问的共享变量的数据流。如图2所示,共享变量为:target,a,a1,b,b1。

s102.在所述共享变量的基础上,构建这些变量依赖关系的数据流。

如图2所示,可以构建两条数据流,分别是target->a->a1和target->b->b1。

s103.标记所述数据流上可能引发并发漏洞的敏感操作。

对于每个共享变量的数据流,在这些数据流上进行与漏洞相关的敏感操作的标记。如图2所示,在a1(第四行)处有一个敏感操作,即free,在b1处(第9行)有另外一个敏感操作,即printf操作,将这两个敏感操作标记在上述的数据流中,故现在这两条数据流变成了target->a->a1(free,line:4)和target->b->b1(printf,line:9)。

s104.根据并发关系合并数据流。

如图2所示,当发现这两条数据流有一个共同的父节点,target,则这两条数据流便可以合并为:a1(free,line:4)<-a<-target->b->b1(printf,line:9)。

s105.将所述敏感操作根据并发漏洞的类型进行分类。

并发漏洞存在多种类型,例如,并发缓冲区溢出,use-after-free等。如图2所示,有两个相互并发的敏感操作,且这两个敏感操作都作用于同一块共享变量(即target),其中一个是free,另外一个是printf,故造成一个并发的use-after-free漏洞。

s106.对于每种类型的并发漏洞,确定触发该类型并发漏洞的敏感操作执行顺序。

触发该类型并发漏洞的敏感操作执行顺序使得程序按照这个顺序下执行时,并发漏洞以很大概率被触发。如图2所示,若printf操作在free操作之后执行,则很大概率会触发一个use-after-free漏洞。

步骤s2.编译过程中,在标记的敏感操作周围插入线程优先级强制调度代码,将插入线程优先级强制调度代码的汇编代码编译为可执行程序。

将程序编译为可执行程序,以对其进行模糊测试。在编译过程中,这些标记的敏感操作和敏感操作的顺序、线程优先级强制调度代码会在适当的位置被插入进去,得到一个总的汇编代码,这个过程又被成为“插桩”。汇编代码进一步翻译得到可执行程序。

步骤s3.在模糊测试可执行程序的过程中,利用线程优先级强制调度机制调度敏感操作按照执行顺序执行,使其触发并发漏洞。其具体步骤如下:

s301.在模糊测试中,标记可执行程序中的不同线程。

s302.每当执行到某个线程时,将其优先级设置为最低或者最高,并且记录下执行的情况。

s303.根据全局所有线程优先级设置的情况,自动调整尚未被测试到的线程的优先级,并且安排相应的线程的优先级去测试那些尚未被测试到的情况。

在模糊测试的过程中,标记的敏感操作一定会按照既定的顺序来执行,即以很大概率去触发目标漏洞。若某个漏洞在模糊测试中被触发,主要表现为程序崩溃等异常行为。通过线程优先级强制调度的方式来增加触发这些并发漏洞的可能性。比如模糊测试的第一次执行有三个线程,其优先级分别为低低低,则当第二次执行的时候,就不会重复以这个优先级的排列方式去执行,而是会尽量去覆盖没有被执行的情况。即如果有3个线程,则是2的3次方,即8种可能。这8种可能都被覆盖到了之后,再从头开始。

如图3所示,如果有一对敏感操作a和b,只有当a先于b运行时,漏洞才可能被触发。如果程序先运行到了b时,通过将其优先级降到最低的方式来暂缓它的运行;只有当程序运行到a时,我们通过插桩的代码来恢复b的优先级使得b能够被恢复运行。反之,如果程序先运行到了a,则说明这次执行符合既定的顺序,则不必加入调度,这样就使得这些敏感操作能够按照之前静态分析所确定的顺序执行,从而总体上保证并发漏洞能够被触发。

步骤s4.并发漏洞被触发之后,使用触发并发漏洞的输入去重新运行可执行程序,并根据此进行漏洞验证。

当程序崩溃等异常行为,造成这种行为的不一定是这个漏洞。故为了严谨起见,需要利用触发漏洞后的程序的输入去重新运行,希望能重现这个异常行为,如果能重现就说明,造成异常行为的是这个漏洞,反之则不一定。

漏洞在模糊测试阶段被触发之后,会产生触发这个漏洞时的程序输入,将这个输入保留,作为验证漏洞真实性的主要依据。根据触发漏洞的程序输入,以及静态检测得到的敏感操作执行顺序,重新执行这个程序,看能否重现异常行为,若异常行为被重现,则可以确认这个漏洞的真实性,否则,则存疑。

以上,仅为本申请较佳的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应该以权利要求的保护范围为准。

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