一种对安卓应用程序的漏洞检测方法以及设备与流程

文档序号:19129699发布日期:2019-11-13 02:30阅读:207来源:国知局
一种对安卓应用程序的漏洞检测方法以及设备与流程

本申请涉及应用程序安全领域,尤其涉及一种对安卓应用程序的漏洞检测方法以及设备。



背景技术:

在安卓(android)系统中,应用程序的不同组件是相互隔离的。不同组件之间传输的具体数据信息,需要使用安卓的软件开发工具包(softwaredevelopmentkit,sdk)提供的组件间的通信框架,通过特定的对象(intent)完成。

在组件的通信过程中,容易产生“安卓本地拒绝服务漏洞”。“安卓本地拒绝服务漏洞”的产生主要是因为接收方的组件在处理输入数据时,没有对输入数据的有效性进行校验,以使得在若输入数据为异常数据,应用程序可能会发生崩溃,以至于无法正常提供服务,严重影响用户体验。

目前,主要通过静态分析的方式寻找“安卓本地拒绝服务漏洞”。即对组件进行反编译,得到代码以后,对代码进行分析。但是由于并不运行应用程序,在缺乏运行时上下文信息,无法分析出组件之间的信息流传递过程,因而存在比较高的误报率。



技术实现要素:

本申请实施例第一方面提供了一种对安卓应用程序的漏洞检测方法,用于对组件进行漏洞检测,包括:

确定暴露的接收额外数据的目标组件;对所述目标组件进行污点分析,得到目标键;将与所述目标键配对目标值设置为异常数据,得到目标异常键值对;向所述目标组件发送所述目标异常键值对;若所述目标组件发生崩溃,则记录所述异常键值对以及所述崩溃的信息。

在一些可行的实施例中,所述对所述目标组件进行污点分析,得到目标键包括:

确定作为污点的目标字符串;确定所述目标字符串作为源的污点传播规则;根据所述污点传播规则确定所述目标字符串的槽;获取所述槽的值,作为所述目标键。

在一些可行的实施例中,所述确定暴露的接收额外数据的目标组件包括:

使用反编译工具获取暴露的组件的目标组件信息;根据所述目标组件信息确定接收额外类型数据的所述目标组件。

在一些可行的实施例中,所述目标组件信息包括组件名、组件类型或意图过滤器。

在一些可行的实施例中,所述异常数据包括空数据、异常数据值或异常数据类型中的至少一种。

本申请实施例第二方面提供了一种对安卓应用程序的漏洞检测设备,包括:

静态分析模块,用于确定暴露的接收额外数据的目标组件;污点分析模块,用于对所述目标组件进行污点分析,得到目标键;处理模块,用于将与所述目标键配对目标值设置为异常数据,得到目标异常键值对;发送模块,用于向所述目标组件发送所述目标异常键值对;记录模块,用于若所述目标组件发生崩溃,则记录所述异常键值对以及所述崩溃的信息。

在一些可行的实施例中,所述污点分析模块具体用于:

确定作为污点的目标字符串;确定所述目标字符串作为源的污点传播规则;根据所述污点传播规则确定所述目标字符串的槽;获取所述槽的值,作为所述目标键。

在一些可行的实施例中,所述静态分析模块具体用于:

使用反编译工具获取暴露的组件的目标组件信息;根据所述目标组件信息确定接收额外类型数据的所述目标组件。

在一些可行的实施例中,所述设备运行时实现如上各方面所述的对安卓应用程序的漏洞检测方法。

从以上技术方案可以看出,本申请实施例具有以下优点:

对于接收的数据类型为额外数据的目标组件,由于通过污点分析得到目标键,针对性的生成异常数据,得到目标异常键值对,当向所述目标组件发送所述目标异常键值对时,可以提高寻找安卓本地拒绝服务漏洞的效率。

附图说明

图1一种对安卓应用程序的漏洞检测方法的实施例示意图;

图2一种对安卓应用程序的漏洞检测设备的实施例示意图。

具体实施方式

本申请实施例提供了一种对安卓应用程序的漏洞检测方法,用于对组件进行漏洞检测。

本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

在安卓系统中,应用程序的不同组件是相互隔离的。不同组件之间传输的具体数据信息,需要使用安卓的sdk提供的组件间的通信框架,通过特定的对象完成。

在组件的通信过程中,容易产生“安卓本地拒绝服务漏洞”。“安卓本地拒绝服务漏洞”的产生主要是因为接收方的组件在处理输入数据时,没有对输入数据的有效性进行校验,以使得在若输入数据为异常数据,应用程序可能会发生崩溃,以至于无法正常提供服务,严重影响用户体验。

目前,主要通过静态分析的方式寻找“安卓本地拒绝服务漏洞”。即对组件进行反编译,得到代码以后,对代码进行分析。但是由于并不运行应用程序,在缺乏运行时上下文信息,无法分析出组件之间的信息流传递过程,因而存在比较高的误报率。

为此本申请提出了一种对安卓应用程序的漏洞检测方法,对于接收的数据类型为额外数据的目标组件,通过污点分析得到目标键,针对性的生成异常数据,得到目标异常键值对,当向所述目标组件发送所述目标异常键值对时,可以提高寻找安卓本地拒绝服务漏洞的效率。

为此,请参考图1,本申请提供了一种对安卓应用程序的漏洞检测方法,包括:

101、确定暴露的接收额外数据的目标组件。

需要说明描述的是,在安卓系统中,组件是应用程序的基本构建基块,每个应用程序包括多个不同的组件,每个组件都以独立实体形式存在,并发挥特定作用。

在安卓系统的应用程序中,有但不限于四种基本的组件,分别为页面(activity)、服务(service)、内容提供程序(contentprovider)和广播接收器(broadcastreceiver)。其中,页面(activity)表示具有用户界面、提供单一屏幕的组件,用于与用户进行人机交互;服务(service)是一种在后台运行的组件,用于执行长时间运行的操作或为远程进程执行作业;内容提供程序(contentprovider)用于管理共享的应用数据;广播接收器(broadcastreceiver)是一种用于响应系统范围广播通知的组件。

需要说明的是,所谓“暴露的”组件,为可以被第三方应用程序调用的组件。如电子邮件,需要暴露的组件,用于与应用程序之外的其他应用程序收发信息,因此电子邮件作为应用程序,必须具有暴露的组件。但是暴露的组件可能会发生敏感信息泄露、拒绝服务、权限提升绕过、界面劫持、远程代码执行等安全漏洞问题。为此,在本申请实施例中,为暴露的组件提供了一种漏洞检测方法。

在本申请实施例中,可以通过静态分析的方式确定应用程序中暴露的组件。具体的,可以使用反编译工具获取各个组件的组件信息,从而判断哪些是暴露的组件。具体的,组件信息可以包括组件名(android:name)、组件类型以及对应的意图过滤器(intentfilter)等。需要说明的是,反编译工具可以为androguard,或者其他开源静态分析工具,此处不做限定。

安卓系统的组件的注册中,可以有静态注册和动态注册两种方式,因此,对组件信息的手机可以有两个主要来源:静态注册和动态注册。其中,通过静态注册的组件信息在描述文件(manifest)中,通过动态注册的组件信息在广播接收器(broadcastreceiver)中。

以静态注册的组件为例,在manifest中注册信息中,存在以下组件:

可知,上述代码中解析对象的方式为:

stringteststring=intent.getstringextra("test");

可知,该组件的组件类型为activity,组件名为:

com.example.project.composeemailactivity

意图过滤器数据为:

action="android.intent.action.send",data="*/*",category="android.intent.category.default"

额外数据键名为:

test

以此,则获得了一个组件的组件信息,即确定了一个暴露的组件。

在本申请实施例中,还可以确定组件是否接收额外(extra)数据。在本申请实施例中,如果组件就会有额外数据键名,那么该组件就是接收额外数据的组件。需要说明的是,额外数据键名指的是目标组件所接收的键值对数据中的键(key)。

通过以上所述的方式,即可确定应用程序中暴露的接收额外数据的目标组件。

102、对所述目标组件进行污点分析,得到目标键。

在本申请实施例中,当确定了暴露的接收额外数据的目标组件后,可以通过模糊测试生成异常数据,并将异常数据发送给目标组件,以观察应用程序是否崩溃,这样的做法称为动态测试。在本申请实施例中,异常数据可以为空数据、异常数据值和异常数据类型。

其中,空数据指的是能够通过对象过滤器或者符合组件的处理规则的对象,该对象中不存在任何数据;异常数据类型指的是能够通过对象过滤器,或者符合组件的处理规则的对象,但是该对象被设置为错误的数据类型;异常数据值指的是能够通过对象过滤器的,或者符合该组件的处理规则的对象,该对象被设置了一些异常的数据值,比如超长数据,特殊值数据等。

需要说明的是,对于异常数据值的测试数据,可以来自预先准备的特殊值数据库,也可以随机产生。在一些可能的实现方式,还可以通过预设一定的规则随机产生,此处不做限定。

例如,对于以下组件:

com.test.app/com.example.project.composeemailactivity

可以生成如下一条空测试数据以测试是否会使得该应用程序崩溃:

adbshellamstart-aandroid.intent.action.send--esn-ncom.test.app/com.example.project.composeemailactivity

该测试数据使用安卓调试桥(androiddebugbridge,adb)工具生成,命令中“shell”代表通过命令交互的方式与测试手机通信,“am”是adb提供的一种向应用程序发送测试对象(intent)的工具,“start”是“am”的具体操作,具体功能是开启页面组件。“-a”参数是“action”数据,该数据从意图过滤器中获得;“-esn”参数指的是向组件发送空的string;“-n”参数提供的是具体的组件名。

在一些可行的实施例中,存在某些可以接收额外(extra)数据的组件。需要说明的是,额外数据的数据值为键值对(key-value),内容包括键和值。键值对是数据库中进行存储的最简单的组织形式。对于接收额外数据的组件而言,若测试数据没有提供对应的键(key),则不会触发后续对象(intent)的解析逻辑,即不能生成对应的异常数据,从而影响漏洞的分析。

例如下面代码:

stringnavkeyhead="_$$_"

stringnavkey=navkeyhead+“navigation”

若输入的对象(intent)只是为空或者随机键值,并不会触发漏洞。若数据的键为"_$$_"或“navigation”或其他字符串,也不会触发漏洞。通过污点分析后,发现navkey中的值可以作为目标键,则通过一下方式确定目标键:

this.nav=this.getintent().getstringextra(navkey);

得到的键为“_$$_navigation”。即,以“_$$_navigation”为键,以空数据/异常数据值/异常数据类型为值,才可能会引起应用程序的崩溃。

在本申请实施例中,可以通过污点分析对目标组件的代码进行分析,解析对应“getextra”(指的是对象的一系列getextra方法,例如getstringextra)方法对应的参数,得到作为目标键的字符串。在上述示例中,也就是找到“_$$_navigation”。

需要说明的是,污点分析主要用来追踪应用程序内数据的流动方向。污点分析的过程主要涉及三个概念:源(source),槽(sink)和污点传播规则。其中,源是污点元素的起始,槽是关键的目的方法,污点传播规则指的是污点标记在经过何种操作之后会被后续变量继承。

在本申请实施例中,我们把静态字符串当成源(如"_$$_"和“navigation”),对象的getextra方法作为槽,以字符串的操作作为污点传播规则,最终计算出getextra方法的参数。

具体的,在本申请实施例中,可以通过下述步骤实现污点分析:

s1、确定作为污点的目标字符串。

首先,在本申请实施例中,可以把代码中的静态的字符串作为目标字符串,这些目标字符串作为污点。比如上述示例代码中的“_$$_”和“navigation”。

分别标记source和sink,其中source为字符串,sink为getextra方法

s2、确定所述目标字符串作为源的污点传播规则。

在应用程序的代码中,确定所述目标字符串作为源的污点传播规则。比如上述示例代码中,源为“_$$_”和“navigation”,通过代码以下代码实现数据的流动:

stringnavkeyhead="_$$_"

stringnavkey=navkeyhead+“navigation”

在真实的应用程序的代码中,有许多代码,但是有些代码与源、槽或污点传播规则并没有关系,则可能可以从代码中确定若干条代码(比如5-6条代码)为源的污点传播规则。

s3、根据所述污点传播规则确定所述目标字符串的槽。

通过上述污点传播规则,则得到所述目标字符串的槽。比如上述示例代码中,确定源为“_$$_”和“navigation”,污点传播规则为:

stringnavkeyhead="_$$_"

stringnavkey=navkeyhead+“navigation”

则得到槽为navkey。

s4、获取所述槽的值,作为所述目标键。

当确定了槽的值后,通过getextra的方法计算目标键的值,即:

getstringextra(navkey)

得到目标键为“_$$_navigation”。

103、将与所述目标键配对目标值设置为异常数据,得到目标异常键值对。

在本申请实施例中,得到目标键后,则可以通过下述方法确定该目标键对应的目标值:

this.nav=this.getintent().getstringextra(navkey)

如设置为_$$_navigation对应的值为空数据。对于接收的数据类型为额外数据的目标组件,通过污点分析得到目标键,针对性的生成异常数据,得到目标异常键值对,当向所述目标组件发送所述目标异常键值对时,可以提高寻找安卓本地拒绝服务漏洞的效率。所述异常数据包括空数据、异常数据值或异常数据类型中的至少一种。

104、向所述目标组件发送所述目标异常键值对。

需要说明的是,参考模糊测试的原理,在测试过程中针对每条测试数据,结果并不是可预期的,导致崩溃的测试数据会在系统日志中记录,因此我们设计了日志监控模块,其功能主要是判断测试数据是否会导致应用产生异常。对于未导致崩溃的测试数据不会被记录,对于导致崩溃的测试数据我们会根据系统日志内容记录关键的信息。

在本申请实施例中,往目标组件发送异常数据是为了使得应用程序崩溃,以获取崩溃信息,从而分析崩溃的原因相对于使用反编译工具获得源代码并分析源代码的方式,提高了对本地拒绝服务漏洞进行挖掘的准确率,而且不会产生误报,从而减少了人工验证的工作量。

105、若所述目标组件发生崩溃,则记录所述异常键值对以及所述崩溃的信息。

在本申请实施例中,如果应用程序崩溃了,则可以从日志监控中获得崩溃信息。由于日志监控中的崩溃消息的信息较多,本申请实施例中,取较为重要前三段的内容:

androidruntime:fatalexception:main

androidruntime:process:com.test.app,pid:<pid>

androidruntime:java.lang.runtimeexception:unabletostartactivitycomponentinfo{com.test.app/com.example.project.composeemailactivity}:

java.lang.runtimeexception:weibosdkwasnotinitall!pleaseuse:wbsdk.install()inyourappapplicationoryourmainactivity.whenyouwanttouseweibosdkfunction,makesurecallwbsdk.install()beforethisfunction

根据以上信息的第一段“fatalexception”,可以看出,上述intent使得应用程序发生了错误。第二段内容给出了错误发生的应用名,即为com.test.app。第三段的内容“java.lang.runtimeexception:unabletostartactivity…”可知,发生的错误类型以及错误的位置,错误类型为:

java.lang.runtimeexception

错误的位置是:

com.test.app/com.example.project.composeemailactivity

本申请实施例中,对于接收的数据类型为额外数据的目标组件,由于通过污点分析得到目标键,针对性的生成异常数据,得到目标异常键值对,当向所述目标组件发送所述目标异常键值对时,可以提高寻找安卓本地拒绝服务漏洞的效率。

请参考图2,本申请还提供了一种对安卓应用程序的漏洞检测设备200,用于安卓操作系统的应用程序,包括:

静态分析模块201,用于确定暴露的接收额外数据的目标组件;

污点分析模块202,用于对所述目标组件进行污点分析,得到目标键;

处理模块203,用于将与所述目标键配对目标值设置为异常数据,得到目标异常键值对;

发送模块204,用于向所述目标组件发送所述目标异常键值对;

记录模块205,用于若所述目标组件发生崩溃,则记录所述异常键值对以及所述崩溃的信息。

在一些可行的实施例中,所述污点分析模块202具体用于:

确定作为污点的目标字符串;

确定所述目标字符串作为源的污点传播规则;

根据所述污点传播规则确定所述目标字符串的槽;

获取所述槽的值,作为所述目标键。

在一些可行的实施例中,所述静态分析模块201具体用于:

使用反编译工具获取暴露的组件的目标组件信息;

根据所述目标组件信息确定接收额外类型数据的所述目标组件。

本申请还提供了一种对安卓应用程序的漏洞检测设备,其特征在于,所述设备运行时实现如上所述的对安卓应用程序的漏洞检测方法。

对于接收的数据类型为额外数据的目标组件,由于通过污点分析得到目标键,针对性的生成异常数据,得到目标异常键值对,当向所述目标组件发送所述目标异常键值对时,可以提高寻找安卓本地拒绝服务漏洞的效率。

在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。

所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(dsl))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存储的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,dvd)、或者半导体介质(例如固态硬盘solidstatedisk(ssd))等。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。

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