一种Android应用漏洞检测方法与流程

文档序号:12064204阅读:1008来源:国知局
一种Android应用漏洞检测方法与流程

本发明涉及一种基于静态Dalvik虚拟机的Android应用漏洞检测方法。



背景技术:

2007年Google公司正式发布了Android智能手机操作系统,并逐渐成为智能手机的主流操作系统,Android系统的应用数量突破百万个。随着Android应用数量的激增,安全研究员、黑客也越来越重视Android应用的漏洞挖掘,越来越多的应用被爆出存在安全漏洞,导致用户的隐私数据被盗取、手机中木马病毒,甚至导致严重的经济损失。目前Android应用的常见漏洞包括敏感信息泄露、权限泄露、拒绝服务、Webview远程代码执行、不安全地加载链接库、本地密码学误用等类型,大多数漏洞在于程序员对Android系统和框架API使用不当和配置不当、组件权限设置不当/输入数据处理不当、应用逻辑和API(本地及远端)使用不当、或者使用有漏洞的第三方组件等等。

早期Android应用的漏洞检测主要通过反编译应用APK文件,然后人工审计反编译来发现安全漏洞。人工审计的方法主要缺点是速度慢、效率低、覆盖率低,主要依靠安全人员的经验知识来检测漏洞。随着安全研究的深入及应用数量的激增,国内逐渐出现Android应用自动化审计工具,主要使用静态分析和关键词匹配技术。这些自动化审计工具主要检测的应用漏洞包括:明文保存敏感信息、文件权限问题、日志信息泄露、组件权限问题、明文传输、拒绝服务等,大部分是漏洞特征比较明显的漏洞,对于比较复杂的漏洞则无法检测。同时,由于静态分析和关键词匹配缺少上下文分析和可达性分析,检测到的漏洞可能根本不会调用到,所以会产生大量误报。

除了静态分析漏洞检测工具,也有基于动态分析的漏洞检测工具,例如Drozer和IntentFuzzer。IntentFuzzer只能够动态检测应用在处理Intent时是不是存在漏洞,Drozer可以通过命令行交互动态检测应用漏洞,但是只能检测到部分可以交互的漏洞,并且需要较多人工工作。动态分析相比静态分析的优点是准确率更高,但是缺点是速度较慢、效率较低、无法覆盖所有执行路径。



技术实现要素:

为了克服现有技术的缺点,本发明提供了一种基于静态Dalvik虚拟机的Android应用漏洞检测方法,针对目前Android应用漏洞检测在静态分析及动态分析存在的缺点,本方法在Android应用静态反编译的基础上,结合正则匹配及过滤引擎、函数调用图及数据流分析技术,解决了传统静态分析关键词匹配的误报问题,通过部分模拟Dalvik虚拟机代码执行动态分析漏洞代码,大大提升了Android应用漏洞检测的准确率及检测效率。

本发明所采用的技术方案是:一种Android应用漏洞检测方法,包括如下步骤:

步骤一、提取漏洞检测向量中的漏洞特征;

步骤二、判断漏洞特征是否涉及函数调用:如否,则根据反编译的smali代码和应用配置文件AndroidManifest.xml文件进行匹配;如是,则进入步骤三;

步骤三、根据反编译的smali代码确定函数调用图特征、函数签名特征和函数参数特征;

步骤四、如果漏洞检测向量中的函数调用图特征、函数签名特征和函数参数特征均能成功匹配,则检测到安全漏洞。

与现有技术相比,本发明的积极效果是:

本发明设计的基于静态Dalvik虚拟机的Android应用漏洞检测技术结合了传统静态分析速度快、效率高的优点,在静态反编译Android应用为smali代码的基础上,结合正则匹配及过滤引擎、函数调用图关联及数据流分析技术,大大降低了传统静态分析的误报率。同时,本发明结合大量Android应用安全漏洞的专家知识经验,采用插架化可扩展架构设计,可方便地进行漏洞检测扩充,大大提高了Android应用漏洞检测的先进性。同时,本发明基于静态Dalvik虚拟机模拟指令执行,针对关键代码进行动态模拟来检测应用漏洞,大大提高了漏洞检测的准确率及覆盖率。

本发明结合了传统Android应用漏洞检测中静态分析与动态分析的优点,能够快速、准确地检测出Android应用存在的安全漏洞,可以提高Android应用安全研究人员的漏洞挖掘效率,同时也可以为应用开发者提供全面的安全漏洞检测信息,协助修补安全漏洞,降低用户的使用风险。

附图说明

本发明将通过例子并参照附图的方式说明,其中:

图1为本发明的原理框图;

图2为基于静态Dalvik虚拟机的漏洞检测流程图;

图3为漏洞检测向量的函数调用特征示意图;

图4为函数调用的另一实例示意图。

具体实施方式

本发明的原理如图1所示,首先基于大量Android应用安全漏洞经验知识提取漏洞检测向量,每个漏洞检测向量包含了漏洞的检测特征信息,然后根据漏洞检测向量及基于静态Dalvik虚拟机的漏洞检测技术来检测Android应用的安全漏洞。在进行漏洞检测的时候,首先将Android应用反编为smali代码,然后采用静态模拟Dalvik虚拟机执行来匹配漏洞检测向量,如果匹配到漏洞检测向量则表示检测到安全漏洞。

漏洞检测向量主要由安全专家基于大量Android应用安全漏洞经验知识库进行人工总结、提取,并不断更新,覆盖了所有常见的Android应用安全漏洞,保证了漏洞检测向量的全面性和时效性。漏洞检测向量主要分为两类:1.不涉及函数调用的一般配置错误类漏洞;2.涉及一个或多个函数调用的漏洞。漏洞检测向量主要包含以下信息:漏洞标题、危险等级;漏洞描述、修复建议;漏洞特征:漏洞的函数调用、参数设置、配置信息。

基于静态Dalvik虚拟机的漏洞检测技术主要模拟和追踪Android系统中关键函数的调用及函数参数的传递,在漏洞检测过程中主要基于Android应用反编译smali代码及漏洞检测向量进行检测,主要流程如图2所示,包括如下步骤:

1、根据漏洞检测向量得到关键的漏洞特征,包括函数调用图特征、参数特征、配置特征等信息;

2、对于不涉及函数调用的配置错误等漏洞检测向量,可直接根据反编译的smali代码和应用配置文件AndroidManifest.xml文件进行匹配。对于涉及函数调用的漏洞检测向量,则根据应用反编译的smali代码分析出函数调用图;

3、根据漏洞检测向量中的函数调用图及函数签名特征搜索反编译得到的函数调用图,匹配相同的函数调用图;

4、针对匹配到的函数调用图,再根据漏洞检测向量中的参数特征信息来匹配是否有相同的函数调用参数;

5、如果漏洞检测向量中的函数调用图特征、函数签名特征和函数参数特征都能成功匹配,那么表示成功匹配到该漏洞检测向量,检测到该漏洞。

漏洞检测向量的函数调用特征一般包含一个或多个关键函数的组合调用,如图3所示,该图表示漏洞向量的函数调用图特征,FunctionA表示任意函数,Android_API_1函数及Android_API_2函数表示Android系统提供的API调用。我们在匹配函数调用特征的时候,首先匹配Android_API_1函数的调用,如果找到调用Android_API_1的函数FunctionA,则继续在FunctionA函数的代码中查找是否存在Android_API_2函数的调用,如果存在,则表示匹配到该检测向量的函数调用特征。

函数签名的匹配使用smali语法的函数签名命令方法,如下所示:

methodName(III)Lpackage/name/ObjectName;

methodName标识函数名,括号中表示参数类型,这里III表示三个整形参数,Lpackage/name/ObjectName;表示返回值的类型。通过该函数签名可以唯一标识一个函数。

漏洞检测向量中函数的参数特征对于漏洞的检测非常重要,本发明通过静态Dalvik虚拟机技术来模拟函数参数的传递及设定。我们首先通过函数调用图特征和函数签名特征定位到反编译的smali代码块,假设函数调用如图4所示:我们假设该漏洞检测向量的函数参数特征是Android_API_1(ARG1,ARG2),即第一个函数参数值为ARG1,第二个参数值为ARG2。为了检测是否匹配该漏洞向量,我们必须检测已经匹配到的函数调用是否有相同的参数设定,步骤如下:

1、首先记录Android_API_1在FunctionA函数代码块中的位置P1,并得到Android_API_1函数调用时所用到的寄存器,假设为v0、v1;

2、取出FunctionA从函数开始到P1之间的所有smali指令;

3、模拟执行取出的每条指令,模拟过程中维护寄存器表,针对每条指令执行寄存器表操作,主要是设置及清除操作,不执行其他具体的行为;

4、执行完取出的所有指令后,得到寄存器表中v0、v1寄存器的值,如果v0的值为ARG1,v1的值为ARG2,则可以判定匹配到漏洞检测向量的函数参数特征。

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