一种安卓应用并发漏洞检测系统的制作方法

文档序号:12123343阅读:277来源:国知局
一种安卓应用并发漏洞检测系统的制作方法与工艺

本发明涉及一种漏洞检测系统,特别是一种安卓应用并发漏洞检测系统。



背景技术:

由于安卓移动操作系统是一个开源的平台,它吸引了众多的应用开发者,使得近年来安卓系统在移动设备市场中占据了极大的份额。并发对于安卓应用是一个非常关键的功能,当应用在处理后台任务时,它也应当能够迅速响应输入的事件。但是,并发程序变得越来越难以开发、测试和调试。基于这个原因,安卓官方提供了一系列的约束规则以避免并发漏洞,比如UI操作必须在主线程中完成。不幸的是,由于应用变得越来越复杂,开发者无法正确地理解应用的行为,导致应用的发布版本中存在着大量的并发漏洞。

当前的并发漏洞检测技术通过扩展传统程序中的数据竞争到事件驱动的应用中来定位并发漏洞。这些方法根据已有的测试用例得到执行路径,并以此建立happens-before图。最后在happens-before图中寻找可能的并发漏洞。因此,这些方法的检测结果严重依赖传入的测试用例。进一步地,传入的测试用例中的非交换的事件可能根本不会导致并发漏洞,使得许多并发漏洞无法被检测到。而且这些方法不会验证所得到的检测结果,导致得到的检测结果存在较高的假阳性。



技术实现要素:

本发明所要解决的技术问题是提供一种安卓应用并发漏洞检测系统,它检测结果准确高效。

为解决上述技术问题,本发明所采用的技术方案是:

一种安卓应用并发漏洞检测系统,其特征在于:包含并发漏洞分析模块、应用插装模块和应用执行模块;所述并发漏洞分析模块用于分析应用中的潜在并发漏洞,并传递给应用插装模块;应用插装模块根据并发漏洞分析模块的检测结果,在疑似数据竞争代码处插入能够改变线程调度的语句,在后台线程入口方法处插入能够阻塞线程运行的控制代码,同时插入获取应用运行时刻状态信息的后台服务;应用执行模块会运行被插装过的应用,并产生成对的疑似事件发送给应用以触发潜在的并发漏洞。

进一步地,所述并发漏洞分析模块由静态分析部分和动态分析部分组成,静态分析部分直接分析应用的安装文件,找到所有可能的程序任务中的疑似数据竞争作为潜在并发漏洞;动态分析部分首先需要按照深度优先搜索的方式运行被测应用,同时记录所有程序任务的程序执行事件,包括全局的资源访问和方法调用,最后找到任务中的潜在疑似数据竞争作为潜在并发漏洞。

进一步地,所述并发漏洞分析模块静态分析部分的工作流程为,并发漏洞分析模块的静态分析部分通过分析应用的安装文件,找到疑似数据竞争,并报告给下一个模块。

进一步地,所述并发漏洞分析模块静态分析部分的工作流程具体为,并发漏洞分析模块首先读入应用的安装文件,然后解析得到所有的程序任务,即事件处理方法和后台线程,以及它们的入口方法;该模块会对每一个程序任务进行单独处理,计算出它们的方法调用图,这里采用了深度优先遍历的方法,首先将入口方法压入栈内,判断当前的栈是否为空,如果为空,则结束遍历;否则,取出栈顶的方法,并标记该方法,并解析得到该方法调用的所有其它方法,将没有被标记过的方法压入栈内,接着回到之前判断栈是否为空的步骤继续执行;当为所有的程序任务生成了方法调用图后,解析出它们的方法调用图中的每一个方法对资源的访问的指令,接着处理所有的程序任务对,即将程序任务两两组合以进一步分析,对于每一对程序任务,将两者所有的资源访问指令配对进行比较,如果两条指令访问的是同一个共享资源,且至少一个是写操作,则标记为疑似的数据竞争;最后,当处理完了所有的程序任务对后,为所有的疑似数据竞争生成报告,并结束该流程。

进一步地,所述并发漏洞分析模块动态分析部分的工作流程为,发漏洞分析模块的动态分析部分通过运行被测的应用,收集运行时刻每个程序任务的程序事件,并分析得到疑似的数据竞争。

进一步地,所述运行被测应用的算法流程为,采用深度优先搜索的方式遍历程序状态,当程序运行时,首先获取程序当前的状态,并解析得到所有的GUI部件以及可以触发的事件;对每一个GUI部件进行处理,产生相应的事件发送给应用,如果到达了一个曾经未遍历过的程序状态,则递归的调用该过程,当递归调用结束并返回后,处理下一个GUI部件;需要在程序运行时刻通过安卓虚拟机收集程序任务的程序事件,并记录在一个日志文件中。

进一步地,分析得到疑似的数据竞争的算法流程为,首先解析日志文件中的程序事件得到每个程序任务对资源的访问指令,然后处理所有的程序任务对,即将程序任务两两组合,并进一步分析,对于每一对程序任务,将两者所有的资源访问指令配对进行比较,如果两条指令访问的是同一个共享资源,且至少一个是写操作,则标记为疑似的数据竞争,最后,当处理完了所有的程序任务对后,为所有的疑似数据竞争生成报告,并结束该流程。

进一步地,所述应用插装模块的算法工作流程为,首先读入应用的安装文件和并发漏洞分析模块的检测结果,解析得到所有的疑似数据竞争指令的具体信息,即所在位置;在所有的疑似数据竞争指令前插入能够改变线程调度的语句,接下来解析出所有的程序任务,并对每一个程序任务进行如下处理;判断程序任务是否是可疑程序任务,如果是,判断是否是后台线程程序任务,如果依然成立,则在该程序任务的入口处插入能够阻塞线程运行的语句,当处理完了所有的程序任务后,向应用插入能够获取应用运行时刻的程序状态信息的后台服务,并结束整个流程。

进一步地,所述应用执行模块会运行被插装过的应用,通过获取到的应用运行时刻的状态信息,产生可疑事件对并发送给应用,应用执行模块会按照深度优先的顺序遍历应用的状态;如果在此过程中,出现了应用的崩溃或者其它不符合预期的行为,则可能发生了并发漏洞;应用执行模块会记录导致该漏洞发生的事件序列,以重复整个过程。

进一步地,所述应用执行模块执行流程为,首先获取程序当前的运行时刻的程序状态信息,并解析出所有的GUI部件及相对应的可以触发的事件;根据并发漏洞分析模块的报告得到其中的可疑事件,进一步得到可能造成数据竞争的可疑事件对,对每一对可疑事件对进行如下的处理:

1) 同时向应用发送两个可疑事件,一定时间后恢复至上一个状态;

2) 发送可疑事件对的第一个事件,并阻塞所有新建的后台线程程序任务;发送可疑事件对的第二个事件,并阻塞所有新建的后台线程程序任务;先解阻塞第二个事件引发的后台线程程序任务,然后解阻塞第一个事件引发的后台线程程序任务,完成上述操作后恢复至上一个状态;

接着该模块对所有单个的事件进行处理:发送单个事件,获取事件发送后程序的状态,判断是否是探索过的状态,如果是曾经未遍历过的状态,则递归调用该模块的全部过程,否则恢复至上一个状态,当所有的单个事件处理完毕后,结束整个过程。

本发明与现有技术相比,具有以下优点和效果:能分析并自动执行一个安卓应用,产生一系列的事件序列并传递给应用进行相应的处理,同时改变访问了共享资源的可能会导致并发漏洞的线程的调度,并按照深度优先遍历应用的状态空间,触发潜在的并发漏洞并将之捕获。最后得到的检测结果是正确的和高效的,上述所有的过程都是自动化的,不需要用户的额外参与。

附图说明

图1是本发明的安卓应用并发漏洞检测系统的系统结构图。

图2是并发漏洞分析模块静态分析部分的工作流程图。

图3是并发漏洞分析模块动态分析部分的工作流程图。

图4是应用插装模块的算法工作流程图。

图5是应用执行模块的执行流程图。

具体实施方式

为了更清楚的对发明进行说明,首先,对一些用词进行解释。

安卓应用是指一个可以在安卓移动设备上的安装并运行的应用,当明确对之进行操作时特指这个应用的资源文件和字节码文件。

Java应用是指一个可以在装有JVM的计算机上运行的由Java语言编写的应用。

安卓应用的字节码是安卓应用的本质,它由若干个类文件组成,这些类中各自包含若干方法,这些类中的方法通过合作,共同实现特定的功能。

安卓虚拟机是指安卓运用运行时的执行器,是一种特殊的JVM,专门用于解释执行安卓应用的字节码指令。

安卓应用GUI部件是指应用在运行过程中能够显示在屏幕上的部分,从应用的资源文件中解析得到应用初始时刻的GUI部件,当应用运行后,GUI部件可能会动态变化。

安卓应用事件是指由安卓系统或者用户产生的行为和动作,通过产生这样一系列的操作使用安卓应用,安卓应用通过响应这样一系列的操作为用户提供服务。

安卓应用事件处理方法是指应用中定义的用于响应事件的回调函数,当产生了事件后,安卓系统会自动调用注册过的对应的事件处理方法进行处理。

事件处理过程是指从调用事件处理方法开始,到事件处理方法返回结束,这包含所有由事件处理方法直接或间接创建的工作线程结束。

后台线程是指应用创建的线程,需要显示启动并运行于后台的线程。

程序任务是指应用的事件处理的整个过程和后台线程的整个执行周期。

共享资源是指全局变量、数据库、文件系统等。

并发漏洞是指由数据竞争所导致的程序执行不符合预期的一种行为。

数据竞争是指存在两个不同的执行路径,对同一个共享资源进行了操作,并且至少存在一个操作是写操作。

Happens-before关系是指两个事件直接存在着确定的先后发生顺序的关系,这种关系保证了后发生的事件能够得知先发生事件的结果。

Happens-before图是指所有的事件作为点,如果两个事件之间具有Happens-before关系,则添加一条从先发生事件到后发生事件的边。

可疑程序任务是指会执行潜在数据竞争语句的程序任务。

可疑程序任务对是指一对程序任务,它们的操作之间存在着潜在的数据竞争。

可疑事件是指用安卓系统或用户产生的行为和动作,并且会触发可疑程序任务。

可疑事件对是指一对安卓系统或用户产生的行为和动作,并且会触发可疑的程序任务对。

入口函数是指程序任务的第一个执行方法,包括所有的时间处理方法和后台线程的run方法。

方法调用图是指给定入口函数,所有能够被入口函数直接或者间接调用到的方法组成点、调用关系组成边而构成的图。

静态分析是指通过分析应用安装文件的所有可能的程序任务的程序调用图,得到其中所有的潜在数据竞争。

程序执行事件是指对全局变量访问的指令操作和方法调用与返回。

事件收集器是指会在应用执行期间记录所有执行事件,并将它们存储在文件中的模块。

动态分析是指用深度优先算法运行被测应用,同时记录所有发生了的程序任务的程序执行事件,并根据这些事件分析得到潜在的数据竞争。

程序插装是指在应用的字节码文件中,插入新的字节码,当应用执行时,这些被插入的字节码会被调用执行。

应用执行控制器是指可以向应用发送特定的事件,以及改变应用内部的变量的值。

程序状态是指安卓应用所处于的一种状态,此时程序具有特定的GUI界面,包括特定的按钮、文字和输入框等。

线程调度是指将线程按照不同顺序安排到处理上执行的过程。

改变线程调度是指在应用中插入能够暂停线程执行的语句,如Thread.sleep方法和Thread.yield方法等。

线程阻塞是指通过在应用中插入对信号量的获取操作而暂停当前线程的执行,并调度其它的线程执行。

线程解阻塞是指将对应的信号量执行释放操作,从而恢复对应的线程的执行。

下面结合附图并通过实施例对本发明作进一步的详细说明,以下实施例是对本发明的解释而本发明并不局限于以下实施例。

如图1所示,本发明的针对安卓应用并发漏洞的分析与检测系统,由并发漏洞分析模块,应用插装模块和应用执行模块构成,三个模块依次连接,构成一个统一的系统。并发漏洞分析模块用于分析应用中的潜在并发漏洞,并由静态分析和动态分析两个部分所组成。静态分析部分直接分析应用的安装文件,找到所有可能的程序任务中的疑似数据竞争作为潜在并发漏洞;动态分析部分首先需要按照深度优先搜索的方式运行被测应用,同时记录所有程序任务的程序执行事件,包括全局的资源访问和方法调用,最后找到任务中的潜在疑似数据竞争作为潜在并发漏洞。并发漏洞分析模块会综合这两个部分的分析结果,一并传递给应用插装模块。应用插装模块会在疑似的数据竞争代码位置处插入改变线程调度的语句,使得应用在执行这些疑似数据竞争代码时,发生线程调度。应用插装模块还会在所有后台线程的入口方法处插入控制语句以阻塞和解阻塞该线程的执行。此外,应用插装模块还会插入后台服务以获取应用运行时刻的程序状态信息。最后,应用执行模块会运行被插装过的应用,通过获取到的应用运行时刻的状态信息,产生可疑事件对并发送给应用。最后,应用执行模块会按照深度优先的顺序遍历应用的状态。如果在此过程中,出现了应用的崩溃或者其它不符合预期的行为,则可能发生了并发漏洞。应用执行模块会记录导致该漏洞发生的事件序列,以重复整个过程。

图2描述了并发漏洞分析模块静态分析的工作流程。并发漏洞分析模块的静态分析通过分析应用的安装文件,找到疑似数据竞争,并报告给下一个模块。

该模块首先读入应用的安装文件,然后解析得到所有的程序任务,即事件处理方法和后台线程,以及它们的入口方法。该模块会对每一个程序任务进行单独处理,计算出它们的方法调用图。这里采用了深度优先遍历的方法,首先将入口方法压入栈内。判断当前的栈是否为空,如果为空,则结束遍历;否则,取出栈顶的方法,并标记该方法,并解析得到该方法调用的所有其它方法,将没有被标记过的方法压入栈内,接着回到之前判断栈是否为空的步骤继续执行。当为所有的程序任务生成了方法调用图后,解析出它们的方法调用图中的每一个方法对资源的访问的指令。接着处理所有的程序任务对,即将程序任务两两组合以进一步分析。对于每一对程序任务,将两者所有的资源访问指令配对进行比较。如果两条指令访问的是同一个共享资源,且至少一个是写操作,则标记为疑似的数据竞争。最后,当处理完了所有的程序任务对后,为所有的疑似数据竞争生成报告,并结束该流程。

图3描述了并发漏洞分析模块动态分析的工作流程。并发漏洞分析模块的动态分析通过运行被测的应用,收集运行时刻每个程序任务的程序事件,并分析得到疑似的数据竞争。

图3左边是运行被测应用的算法流程,这里采用的是深度优先搜索的方式遍历程序状态。当程序运行时,首先获取程序当前的状态,并解析得到所有的GUI部件以及可以触发的事件。对每一个GUI部件进行如下处理,产生相应的事件发送给应用。如果到达了一个曾经未遍历过的程序状态,则递归的调用该过程。当递归调用结束并返回后,处理下一个GUI部件。需要在程序运行时刻通过安卓虚拟机收集程序任务的程序事件,并记录在一个日志文件中。

图3的右边为动态分析中解析疑似数据竞争的算法流程图。首先解析日志文件中的程序事件得到每个程序任务对资源的访问指令。然后处理所有的程序任务对,即将程序任务两两组合,并进一步分析。对于每一对程序任务,将两者所有的资源访问指令配对进行比较。如果两条指令访问的是同一个共享资源,且至少一个是写操作,则标记为疑似的数据竞争。最后,当处理完了所有的程序任务对后,为所有的疑似数据竞争生成报告,并结束该流程。

图4描述了应用插装模块的算法工作流程。应用插装模块根据并发漏洞分析模块的检测结果,在疑似数据竞争代码处插入能够改变线程调度的语句,在后台线程入口方法处插入能够阻塞线程运行的控制代码,同时插入获取应用运行时刻状态信息的后台服务。

首先读入应用的安装文件和并发漏洞分析模块的检测结果,解析得到所有的疑似数据竞争指令的具体信息,即所在位置。在所有的疑似数据竞争指令前插入能够改变线程调度的语句,比如Thread.sleep方法和Thread.yield方法。接下来解析出所有的程序任务,并对每一个程序任务进行如下处理。判断程序任务是否是可疑程序任务,即是否包含了疑似数据竞争指令。如果是,判断是否是后台线程程序任务。如果依然成立,则在该程序任务的入口处插入能够阻塞线程运行的语句,如信号量的获取语句。当处理完了所有的程序任务后,向应用插入能够获取应用运行时刻的程序状态信息的后台服务,并结束整个流程。

图5描述了应用执行模块的执行流程。应用执行模块会运行被插装过的应用,并产生成对的疑似事件发送给应用以触发潜在的并发漏洞。

该模块首先会获取程序当前的运行时刻的程序状态信息,并解析出所有的GUI部件及相对应的可以触发的事件。根据并发漏洞分析模块的报告得到其中的可疑事件,进一步得到可能造成数据竞争的可疑事件对,对每一对可疑事件对进行如下的处理:

1) 同时向应用发送两个可疑事件,一定时间后恢复至上一个状态。

2) 发送可疑事件对的第一个事件,并阻塞所有新建的后台线程程序任务;发送可疑事件对的第二个事件,并阻塞所有新建的后台线程程序任务;先解阻塞第二个事件引发的后台线程程序任务,然后解阻塞第一个事件引发的后台线程程序任务,完成上述操作后恢复至上一个状态。

接着该模块对所有单个的事件进行处理,即按照任何一种遍历技术探索发送相应事件后的状态,这里用深度优先的方式进行说明:发送单个事件,获取事件发送后程序的状态,判断是否是探索过的状态,如果是曾经未遍历过的状态,则递归调用该模块的全部过程,否则恢复至上一个状态。当所有的单个事件处理完毕后,结束整个过程。

本说明书中所描述的以上内容仅仅是对本发明所作的举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种修改或补充或采用类似的方式替代,只要不偏离本发明说明书的内容或者超越本权利要求书所定义的范围,均应属于本发明的保护范围。

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