根据Google公布的数据显示,截止到2015年6月,Google应用商店[1]的Android应用下载量达到600亿次。然而,由于Android应用程序发布渠道众多且缺乏有效的管理机制,部分应用开发者安全意识淡薄,因此大量的应用在丰富用户体验的同时也带来了日益凸显的安全问题。近几年,由恶意应用和安全漏洞引发的安全问题逐渐增多[2-6]。现有对这类应用安全问题的处理主要是对产生危害行为的应用进行下架处理,但这不能从一开始就缓解应用中存在的安全问题。目前各应用市场均没有一种有效的验证机制能对应用安全性进行分析,Google应用商店采用Google Bouncer来动态运行应用,期望通过监测应用运行过程中出现恶意行为来判别其安全性,但动态分析覆盖率较低,恶意应用可通过监测运行环境来控制可疑行为的执行从而绕过Bouncer的检测[1]。
静态分析在不需要运行应用的情况下对应用代码进行分析,具有覆盖面广的优点。在Android应用软件静态漏洞分析方面,Lu等[7]给出了名为CHEX的静态分析框架,对Android应用的数据流进行分析,发现其中的组件劫持漏洞;Zhong等[8]通过静态分析的方法对大量应用进行分析,发现应用间存在权限提升漏洞,容易导致权限提升攻击;Jiang等[9]主要关注Android的四大组件之一:Content Provider,得出Android应用程序中存在的被动数据泄露与数据污染的2个安全漏洞的结论,可能造成移动智能终端隐私数据泄漏;Chin等[10]设计了分析工具Comdroid,通过分析Android应用组件间通信的漏洞,来识别应用的安全风险;Luo等[11]提出了Android应用中的WebView注入攻击,指出混合应用不再是一个可信计算基,它能访问设备资源破坏浏览器的沙箱机制,并对WebView组件可能造成的漏洞进行了验证;Jin等[12]指出了基于HTML5技术开发的移动应用存在JavaScript代码注入攻击的漏洞,并对注入途径、检测方法和应对方法做了分析;Poeplau等[13]主要聚焦在Android应用中引用额外代码带来的安全隐患上。
现有研究解决了部分Android应用安全和用户隐私保护数据问题,但是没有全面考虑应用中可能存在的各类不同安全问题,覆盖面和适用范围较窄。本文提出了一种基于特征匹配的Android应用安全分析框架,通过全面分析现有Android应用漏洞,研究漏洞可能出现的形式和特征,构建漏洞检测规则,结合应用静态分析技术,采用特征匹配的方式挖掘应用中可能存在的安全问题。
1 Android应用安全漏洞示例Android系统自身提供了多种机制来保障应用安全,其中权限机制是Android 主要的安全机制,Android 系统为每项手机资源分配了权限,每个权限保护着一系列的数据,应用程序想获得系统资源必须拥有相应的权限,保证系统资源不被滥用。然而,权限机制并不是万无一失的,由于开发者的疏忽,可能会使应用中存在权限暴露漏洞。
如图 1所示,应用A为Android设备上的原生应用或已安装应用,应用A申请了Send_SMS权限,实现了一个可以发送SMS的服务,并向外部暴露了这个服务;恶意应用B没有申请Send_SMS权限,按照Android权限机制,应用B不能发送SMS,但是由于应用A向外暴露的发送SMS的服务且没有做恰当的安全保护,应用B可以调用应用A的发送SMS的功能,从而成功发送恶意扣费短信。在这个例子中,应用A存在权限暴露的安全漏洞,被恶意应用B利用,对用户的财产安全造成了影响。
权限暴露漏洞主要与Android应用组件属性的设置有关,Android 应用包含四大组件:Activity提供应用界面功能、Service提供后台服务、Broadcast Receiver提供对广播事件响应、Content Provider提供数据服务,四大组件的申请一般都需要在应用的AndroidMainfest.xml文件中完成,如图 2是应用申请的一个Service,其exported属性设置为“true”,并设置了Intent-filter属性,其他的应用可以通过构造符合Intent-filter约束的Intent来调用此Service。
Android应用的权限泄露问题就是基于这种组件的安全属性设置不合理的情况,根据分析其产生的原因,总结权限泄露的主要规则有:1) 应用组件暴露,其他应用可以通过Intent来调用应用的组件;2)应用的Intent处理例程(如Activity的onCreate()方法)中包含敏感权限的API操作,如Send_SMS的sendMessage();3) 组件对Intent请求没有进行相应的权限检测,即在Manifest文件中声明组件时没有定义调用组件需要使用的权限。针对该漏洞,可采用静态分析方法获取应用的相关组件、权限和API调用等信息,然后与定义的规则进行匹配,判断应用中是否存在这一漏洞。
2 分析框架实现基于特征匹配的Android应用安全漏洞分析框架如图 3所示,包含3个部分:1) Android应用静态分析, 首先对应用进行反编译,得到Manifest文件、资源文件和代码文件等,然后进行Manifest文件分析、语法词法分析、危险API分析、控制流、数据流分析,得到应用的详细行为特性;2) 常见漏洞分析和整理,针对现有的Android应用常见安全漏洞进行分析,研究漏洞产生机理,提取漏洞规则;3) 漏洞匹配,根据提取的漏洞规则,构建相应的漏洞检测器,对应用静态分析得到的特征数据进行匹配,找出应用中可能存在的安全问题。
2.1 Android应用静态分析
静态分析技术是检测软件安全漏洞的常用方法,指在不执行程序的情况下对其代码进行审查,找出可能存在的问题,静态分析的输入一般是程序源代码或中间码(如Java字节码)。由于很难得到Android应用的源码,基于对分析框架适应性的考虑,本文对Android应用的静态分析主要是分析应用的APK文件。Android应用以APK文件(application package file应用程序包)的形式发布,其中包含应用清单文件(AndroidManifest.xml)、应用资源(res、assets等)和被编译的代码文件(dex)等内容。Android应用静态分析技术就是针对应用的APK进行分析,得到与应用安全相关的特征信息。
APK的静态分析流程如图 4所示,针对每个待分析应用APK文件,静态分析流程主要包含以下步骤:1) 反编译APK文件,得到应用的smali代码文件、resources资源文件和AndroidManifest.xml文件;2) 对得到的Manifest文件和资源文件进行解析,获取应用的权限申请、组件声明和回调函数定义等相关信息;3) 对得到的smali文件进行语法和词法分析,构建对应的smali类和方法;4) 对 smali类和方法进行危险函数的扫描和分析,获取应用关于危险函数调用的信息;5) 采用程序控制流和数据流分析的方式对程序代码进行分析,获取应用关于敏感数据的使用和传播情况。
1) 反编译APK。
APK反编译是静态分析的基础性工作,研究人员对其进行了广泛的研究[14],本文使用baksmali.jar和AXMLPrinter2.jar分别对应用的dex文件和Manifest文件进行反编译处理,得到应用smali代码文件、resources资源文件和AndroidManifest.xml文件。目前的反编译工具只能针对原生的Android应用APK文件,若应用通过加壳等安全加固的方式改变了APK文件的格式,则无法正常完成APK的反编译工作。
2) Manifest文件分析。
Manifest文件分析的主要工作是对Manifest.xml文件进行解析,提取各文件的节点信息,将不同的内容映射到相应的特征集合中。
Manifest文件是应用的清单文件,包含了十分丰富的信息,其中与应用安全相关的有:应用申请权限信息,应用要访问系统资源必须申请相应的权限(如只有申请了Send_SMS权限的应用才能发送短信息),用户需要在应用安装时授予其所申请的权限;应用组件信息,Android系统包含Activity、Service、Receiver和Provider 4类组件,为了完成不同的功能,应用需要在Manifest文件中对组件进行申明;Intent-filter信息,Intent是应用间和应用内部组件通信的主要方式,可以异步传递消息和数据,Intent-filter定义了应用中组件可能接收的Intent的模式。
3) Smali代码分析。
Smali代码词法分析和语法分析能将smali代码文件解析成相应的类,并构建类之间的依赖关系。
可执行文件(dex文件)反编译得到smali代码,与Java字节码类似,一个smali代码文件表示一个类。通过分析应用的smali代码可以得到的特征集有:敏感API函数调用信息,Android系统对敏感数据的访问被封装为API函数,应用通过调用API函数来访问敏感数据,扫描smali代码可以获取敏感API函数的调用信息;应用代码实际使用的权限信息,Android系统使用权限控制应用对敏感数据的访问,权限与敏感API函数间存在一定的对应关系,使用Felt等[2]提出的方法可以根据应用获取实际使用的权限信息;危险API函数调用信息,Android系统中提供了少量功能强大但存在安全隐患的API函数,如执行shell命令的Runtime.exec()和将本地对象暴露给web端的addJavaScriptInterface()等,通过扫描smali代码可以获取应用关于此类函数的调用信息。
4) 数据流分析。
数据流分析一直是静态代码分析的重点和关键,Android应用数据流分析获取的特征数据主要是敏感数据在应用中的使用和传播情况,主要用于对隐私数据泄露等漏洞的检测。
本文采用soot静态分析框架,在开源项目Flowdroid的基础上进行拓展[15],实现对Android应用的数据流分析。Android应用静态代码数据流分析的流程概述如图 5所示,反编译后首先对应用的source点、sink点和entrypoint进行检测,source点是指敏感数据的获取点,主要是获取敏感数据的API函数(如getDeviceID),sink点是指数据传出点, 主要是对数据进行存储、传输等操作的函数,entrypoint是指包含source点的函数或一段代码。基于Android应用的特性,source点、sink点和entrypoint的检测需要分析应用组件的生命周期函数和事件回调函数,这些工作是通过分析Android特定的文件来完成的,包括layout布局文件、manifest清单文件和dex文件。然后,根据得到组件的生命周期函数和事件回调函数以及entrypoint等信息构建应用的伪主函数,模拟应用中函数调用的情况。在生成了伪主函数之后,采用与分析Java程序类似的方法进行数据流分析,构建用于程序的调用图和控制流图。最后从各个entrypoint出发,遍历控制流图进行污点跟踪传播,分析得到敏感数据从source点流向sink点的传播路径。
2.2 漏洞规则提取与匹配检测
对权威漏洞库中中国国家信息安全漏洞库CNNVD和美国国家漏洞库NVD收录的关于Android应用漏洞的情况进行了归纳整理,总结了Android应用中常见的安全漏洞,漏洞分类如图 6所示。本文提出的应用安全分析框架中的静态分析模块和漏洞匹配模块独立实现,针对不同的Android漏洞,通过编码构建相应的漏洞检测器,对静态分析得到的特征数据进行匹配检测,判断应用是否存在相应的漏洞和具有良好的拓展性。
1) 组件权限暴露。
若Android应用组件暴露,攻击者可以通过构造符合应用组件定义的消息对象,劫持其组件进行相关操作[7,9]。组件暴露的产生条件是应用在Manifest文件中申请组件时,将其exported属性设置为“true”,或者应用在没有将exported属性设置为“false”的情况下,为组件设置了Intent-filter,导致组件可能被其他应用调用。权限暴露漏洞是应用由于定义的组件暴露被恶意应用利用,构造符合要求的Intent对象来调用应用组件,获得该应用所申请的权限。权限暴露漏洞产生的条件有组件暴露、组件的Intent处理函数中包含敏感权限API操作和组件的对Intent请求没有进行相应的权限检测。这类漏洞的检测主要是对静态分析得到的组件、权限等特征集合进行匹配,判断是否满足漏洞产生的条件。
2) Webview远程代码执行。
Webview是Android内置的浏览器组件,为应用提供访问Web网页的功能。Webview 提供一个addJavascriptInterface方法实现 Javascript访问Android内Java对象,Javascript在丰富Android应用功能的同时也为Android应用带来严重的安全威胁[11,12]。当应用采用HTTP协议实现Webview内容加载,攻击者可以采用中间人攻击(MITM)劫持HTTP数据流来控制应用。Webview远程代码执行漏洞的检测主要是匹配静态分析中获取的危险API调用的特征集合,判断是否有符合漏洞规则的危险API函数的使用。
3) 弱随机数。
加密的安全性非常依赖于高质量的随机数发生器(RNG)。很多开发者在开发Android应用时并没有很好地遵守相关安全建议[16],例如研究发现Android内采用OpenSSL库的伪随机数发生器(PRNG)存在的安全漏洞[17]。不同应用采用同一伪随机数发生器初始化状态可能导致某个应用可以预测其他应用使用的伪随机数,从而得到其敏感信息如密码等。对这类漏洞的检测主要是匹配静态分析中获取的应用敏感API函数调用的特征集合,判断其中是否使用了具有安全缺陷的随机数发生器。
4) Intent注入。
在Android系统中,Intent是应用内部和应用间通信的重要方式,可以在不同组件间异步地传递消息和数据。Intent注入漏洞通常发生在应用间通信的过程中,通过利用应用定义中暴露的组件信息,攻击者可以构造符合要求的Intent对象注入应用组件中,操作应用组件完成某些功能或造成应用崩溃,实现权限提升攻击和拒绝服务攻击等。该漏洞实施攻击需要应用具有组件暴露、组件对获取的Intent数据没有进行适当的检验和处理等条件。对Intent注入漏洞的检测需要结合静态分析中获取的组件、权限特征和数据流分析中Intent数据传播情况进行综合分析,判断是否可能存在该漏洞。
5) SQL注入。
SQL注入漏洞常见于web程序,相关研究发现Android应用在执行不安全的SQL语句时,也会带来SQL注入漏洞[9]。Android应用普遍使用SQLite存储数据,最常见的SQL漏洞是应用使用原始的SQL语句进行操作,当SQL语句存在外部输入参数时就可能发起SQL注入攻击。后续又发现可以利用SQLite扩展的动态加载功能,执行远程SQL注入攻击,针对此SQLite动态加载漏洞Android 在后续版本中采用关闭SQLite动态加载和采用预编译宏移除动态加载功能修复该漏洞。由于各厂商Android 系统版本和第三方数据库并不一定随着Google 系统修复该漏洞,因此该漏洞仍会广泛存在于Android应用中。对这类漏洞的检测主要是首先分析应用的敏感API函数中是否存在原始的SQL操作,其次分析数据流中是否存在从外部获取的数据(如从界面元素、网络连接、短信等)传播到SQL操作语句。
6) 敏感数据泄露。
智能终端是一个隐私密集型设备,应用敏感数据泄漏被恶意利用会带来严重的安全隐患,针对Android隐私泄漏方面研究多采用静态污染点分析、动态污染点分析、安全审计等方法[14,17-19]。敏感数据泄漏包括明文数据泄漏、明文网络传输、外部存储、 logcat日志泄漏等[13]。明文数据泄漏通常见于密码等敏感数据,应用开发者未对密码采用加密而直接传输,容易被截获而造成明文传输漏洞;部分应用在存储敏感数据时,将数据存储于SD卡上,其他应用可以读取SD卡中数据,造成敏感数据外部存储漏洞;日志常被用于记录应用调试信息,应用开发者在开发过程中可能通过调用logcat相关函数记录敏感数据用于调试,但开发完成后未关闭日志,造成数据泄露。对此类漏洞的检测主要是分析应用的数据流特征,检测是否有从敏感API函数获取的数据通过网络传输、外部存储和日志函数等方式传播出去。
7) 运行时动态代码加载。
Android应用可以在运行时动态加载外部代码,并且应用从外部加载代码的技术手段多种多样[13],主要包括:使用ClassLoader技术和反射机制在运行时从应用外部(如外部存储和网络流)加载字节流来获取class对象和使用其中的方法;使用JNI从本地加载原生的so文件;使用包资源共享技术获取其他应用中的资源文件和代码;在运行时下载安装APK文件,并使用其资源。攻击者可以采用替换文件或字节流等方式来进行代码注入,导致应用执行未知代码。对这类漏洞的检测主要是结合分析应用的敏感API函数特征集合和数据流特征,判断是否可能有未知代码在应用运行时被加载执行。
3 实验分析为了验证分析框架的有效性,进行了充分的实验。实验的测试集包括273个从Android应用市场下载的流行应用和专门构造的50个具有安全漏洞的缺陷应用。
为验证工具的检测效果,对构造的缺陷应用集合中的50个应用, 使用工具扫描分析,对比分析结果与应用中实际存在的缺陷的异同,分析工具的检出率;对于市场中下载的273个应用,在使用工具分析后,根据分析得到的结果再对应用进行人工检测,总结工具分析的误报率。分析结果如表 1和表 2所示。
结果表明: 1) 工具总体的分析效果达到了预期目标,能很好地挖掘出应用中存在的安全问题,但由于静态分析不能充分模拟应用的运行场景,导致工具的误报率偏高;2)在实验过程中,对市场上下载的某些应用工具分析失败,通过人工分析发现应用经过了加壳等方式的加固处理,导致应用在反编译时出现异常。
漏洞类型 | 缺陷应用 | 工具检出 | 检出率 |
组件权限暴露 | 33 | 33 | 100% |
Webview远程代码执行 | 9 | 8 | 89% |
弱随机数 | 4 | 4 | 100% |
Intent注入 | 5 | 4 | 80% |
SQL注入 | 7 | 5 | 71.40% |
敏感数据泄露 | 23 | 19 | 82.60% |
运行时动态代码加载 | 14 | 12 | 85.70% |
漏洞类型 | 工具检出 | 人工分析 |
组件权限暴露 | 25 | 33 |
Webview远程代码执行 | 19 | 15 |
弱随机数 | 12 | 9 |
Intent注入 | 40 | 33 |
SQL注入 | 27 | 23 |
敏感数据泄露 | 186 | 130 |
运行时动态代码加载 | 40 | 30 |
在2×2.26 GHz主频和32 GB内存的服务器环境下使用工具对测试应用进行分析,对其运行效率进行评估。分析时间与应用的大小成正相关的关系,其中静态分析过程中,应用的平均耗时在 10min 左右,最短的分析时间为10s,最长的分析时间为20min。而每个漏洞匹配的耗时在几秒之内就可以完成。图 7展示了应用分析所耗费的时间。
4 结 论
针对Android应用的安全问题,本文提出了一种基于特征匹配的Android应用安全分析框架,通过静态分析漏洞特征匹配技术分析应用中存在的安全问题,很好地弥补了动态分析框架覆盖率不足的问题。该框架能有效发现应用中可能存在的安全问题,一定程度上保障用户安全。下一步针对目前应用采用的安全加固技术,将优化应用的逆向分析技术,扩大分析框架的适应范围;另一方面,针对静态分析误报率较高的缺陷,将引入动态验证的技术,提高分析的精度。
[1] | Google. Bouncer[Z/OL]. (2012-02-18). http://googlemobile.blogspot.com/2012/02/android-and-security.html. |
[2] | Felt A P, Finifter M, Chin E, et al. A survey of mobile malware in the wild[C]//Proceedings of the 1st ACM Workshop on Security and Privacy in Smartphones and Mobile Devices (SPSM'11). Chicago, USA:ACM, 2011:1-14. |
[3] | Grace M, Zhou Y, Wang Z, et al. Systematic detection of capability leaks in stock Android smartphones[C]//Proceedings of the 19th Annual Network & Distributed System Security Symposium (NDSS'12). San Diego, USA:ISOC, 2012:107-121. |
[4] | Wang R, Xing L, Wang X, et al. Unauthorized origin crossing on mobile platforms:Threats and mitigation[C]//Proceedings of the 20th ACM Conference on Computer and Communications Security (CCS'13). Berlin, Germany:ACM, 2013:635-646. |
[5] | Zhou Y, Jiang X. Dissecting Android malware:Characterization and evolution[C]//Proceedings of the 33rd IEEE Symposium on Security and Privacy (S & P'12). San Francisco, USA:IEEE, 2012:95-109. |
[6] | Zhou Y, Wang Z, Zhou W, et al. Hey, you, get off of my market:Detecting malicious apps in official and alternative Android markets[C]//Proceedings of the 19th Annual Network & Distributed System Security Symposium (NDSS' 12). San Diego, USA:ISOC, 2012:1-13. |
[7] | Lu L, Li Z, Wu Z, et al. Chex:Statically vetting Android apps for component hijacking vulnerabilities[C]//Proceedings of the 19th ACM Conference on Computer and Communications Security (CCS' 12). Raleigh, USA:ACM, 2012:229-240. |
[8] | Zhong Y, Xin Z, Mao B, et al. DroidAlarm:An all-sided static analysis tool for Android privilege-escalation malware[C]//Proceedings of the 8th ACM Symposium on Information, Computer and Communications Security (ASIACCS'13). Hangzhou, China:ACM, 2013:353-358. |
[9] | Zhou Y J, Jiang X X. Detecting passive content leaks and pollution in Android applications[C]//Proceedings of the 20th Network and Distributed System Security Symposium (NDSS'13). San Diego, USA:ISOC, 2013:1-16. |
[10] | Chin E, Felt A P, Greenwood K, et al. Analyzing inter-application communication in Android[C]//Proceedings of the 9th International Conference on Mobile Systems, Applications, and Services (MobiSys'11). Washington D C, USA:ACM, 2011:239-252. |
[11] | Luo T, Hao H, Du W, et al. Attacks on WebView in the Android system[C]//Proceedings of the 27th Annual Computer Security Applications Conference (ACSAC'11). Florida, USA:ACM, 2011:343-352. |
[12] | Jin X, Hu X, Ying K, et al. Code injection attacks on HTML5-based mobile apps:Characterization, detection and mitigation[C]//Proceedings of the 21st ACM Conference on Computer and Communications Security (CCS'14). Scottsdale, USA:ACM, 2014:66-77. |
[13] | Poeplau S, Fratantonio Y, Bianchi A, et al. Execute this analyzing unsafe and malicious dynamic code loading in android applications[C]//Proceedings of the 20th Annual Network & Distributed System Security Symposium (NDSS'14). San Digeo, USA:ISOC, 2014:1-16. |
[14] | 丰生强. Android软件安全与逆向分析[M]. 北京: 人民邮电出版社, 2013 . FENG Shengqiang. Android Software Security and Reverse Engineering[M]. Beijing: Posts & Telecom Press, 2013 . (in Chinese) |
[15] | Arzt S, Rasthofer S, Fritz C, et al. Flowdroid:Precise context, flow, field, object-sensitive and lifecycle-aware taint analysis for Android apps[C]//Proceedings of the 35th Annual ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI'14). Edinburgh, UK:ACM, 2014:259-269. |
[16] | Egele M, Brumley D, Fratantonio Y, et al. An empirical study of cryptographic misuse in Android applications[C]//Proceedings of the 20th ACM Conference on Computer and Communications Security (CCS'13). Berlin, Germany:ACM, 2013:73-84. |
[17] | Kim S H, Han D, Lee D H. Predictability of Android OpenSSL's pseudo random number generator[C]//Proceedings of the 20th ACM Conference on Computer and Communications Security (CCS'13). Berlin, Germany:ACM, 2013:124-136. |
[18] | Enck W, Gilbert P, Chun B G, et al. TaintDroid:An information-flow tracking system for realtime privacy monitoring on smartphones[C]//Proceedings of the 9th USENIX Symposium on Operating Systems Design and Implementation (OSDI'10). Vancouver, Canada:USENIX, 2010:1-15. |
[19] | Lessard J, Kessler G. Android forensics:Simplifying cell phone examinations[J]. Digital Device Forensics Journal,2010, 4 (1) : 1 –12. |