基于特征匹配的Android App漏洞检测系统设计与实现
2017-02-14刘嘉勇肖顺陶
◆吴 丹 刘嘉勇 贾 鹏 肖顺陶
(四川大学电子信息学院 四川 610064)
基于特征匹配的Android App漏洞检测系统设计与实现
◆吴 丹 刘嘉勇 贾 鹏 肖顺陶
(四川大学电子信息学院 四川 610064)
由于Android系统的开放性和开源性,Android应用数量极其丰富,涉及到日常工作和生活的各个方面。同时由于各种Android市场对应用审核不严格,投放到市场中的Android应用存在着大量的已知类型的安全漏洞,这些漏洞给用户的隐私和财产带来了极大的威胁。如何快速有效的检测出Android应用程序中已知类型的漏洞并定位漏洞所在代码段,成为Android安全领域的一个热门研究内容。本文针对Android应用漏洞检测技术进行了研究,对已知漏洞进行归纳、分析,提取漏洞特征信息,提出并实现了一个基于特征匹配的Android应用漏洞检测系统。该系统由数据库、检测脚本、Web页面三个部分组成。经实验表明,该系统能够有效检测并定位Android应用中存在的已知类型漏洞。
Android; 特征匹配; 漏洞检测
0 前言
近年来,随着移动互联网的高速发展,移动智能设备已成为人们日常生活的重要依赖,而Android操作系统的市场占有率处于领先地位。Android操作系统快速发展的同时,也伴随着严重的安全问题,在Android系统中已经发现大量安全漏洞,这些安全漏洞主要源于内核、系统框架、以及应用软件(Application,App)。由于Android生态系统的开放性,Android应用的数量呈现井喷式增长,由于开发人员安全意识不足,在程序设计中存在逻辑缺陷,或者在开发过程中产生疏漏没有对输入信息做验证,并且Android应用市场混乱且缺乏有效的管理机制,这些应用的安全质量难以得到保证,安全漏洞的数量正在逐年上升。
随着安全漏洞日益凸显,引发人们对Android App安全的高度重视。本文主要研究了Android 应用漏洞检测技术,主要工作如下:
(1)建立Android App的漏洞特征库,该漏洞库主要是给检测脚本提供漏洞特征。
(2)编写检测脚本,对反编译Android安装包(Android Package,APK)得到的源码、资源文件,以漏洞特征库中的数据为参数,通过特征匹配及判定规则判断该App是否存在漏洞。
(3)搭建web页面,以B/S(浏览器/客户端)的形式,将APK文件上传、检测和展示。通过web界面,可以向漏洞特征库添加新的漏洞特征。
1 相关知识
1.1 Android 安全机制
Android 是以 Linux 为内核实现的,保留了Linux 中的一些安全机制[1],并根据Android系统的特点,设置了一系列安全机制,其中与Android App相关的安全机制有APK签名、权限限制、应用程序沙箱等机制。APK签名机制基于JAR签名,Android使用该机制来确保应用更新包是来自于同一作者,从而建立应用程序之间的信任关系[2]; Android App 的权限在AndroidManifest.xml文件中定义,在App进行安装时,系统根据该文件来决定是否赋予App某些权限; 在安装App时,系统给App赋予一个唯一的用户标识(UID),App启动后就在特定进程内以该UID运行,并拥有一个只属于该App的专用目录。Android系统的签名、权限、沙箱机制为Android应用程序的发布、安装与运行提供了安全保障。
1.2 Android App 安全性分析
目前Android App 存在很多安全性问题,本文将安全性问题归纳为以下几类:(1)App权限通常在Android manifest.xml文件中配置。若配置文件设置不当,会造成权限申请不足,或者造成权限申请过度[3];(2)Android App的敏感数据在网络中进行传输时,未使用SSL/TLS加密或防范措施不当,造成敏感数据泄漏、HTTPS中间人劫持、SSL证书替换等;(3)Android APP中主要通过共享配置文件(Shared Preferences)、SQLite数据库、原始文件方式来存储数据,若App数据读写不当,将会造成数据泄漏;(4)Android 日志信息主要记录在开发时生成的调试信息,可能会记录诊断信息、账号密码或其他敏感信息,造成数据泄露;(5)Android App组件同时作为数据源和数据目的池,经常成为潜在的攻击面,如果没有进行安全防护,或者被授予权限的恶意文件访问,可能遭到一系列的危害。
以上的安全性问题会直接导致Android App产生各种安全漏洞。Android App常见的安全漏洞有组件和权限内暴露漏洞、WebView组件远程代码执行漏洞、弱随机数漏洞、Intent注入漏洞、SQL注入漏洞、敏感数据泄露漏洞、运行代码加载漏洞[4],这些漏洞若被攻击者利用将会造成严重影响。
一个典型的API使用不当的例子是WebView远程代码执行漏洞,该漏洞源于程序没有正确地对addJavascriptInterface方法的使用进行限制,攻击者可通过使用Java Reflection API来利用该漏洞执行任意Java对象的方法。该漏洞可导致合法用户被安装恶意扣费软件、发送欺诈短信、窃取通讯录和短信以及被远程控制等严重后果[5]。
1.3 Android App 漏洞检测方法
目前常用于Android App漏洞检测的方法有静态分析和动态分析。静态分析是在不运行App的情况下对反编译APK后得到的代码进行分析,通过构建特殊数据流来检测App中存在的漏洞,具有覆盖面广的优点; 动态分析是将App运行在模拟器或Android操作系统中,使用命令行启动activity或其他组件,根据App行为是否异常或崩溃来检测App中的漏洞。
本文所设计的检测系统使用静态分析方法来检测Android App 中的漏洞,主要采用特征匹配的方法,根据已知漏洞的特征定位到关键API,并通过分析上下文环境来判断Android App 中是否存在漏洞。
2 系统设计
本文设计了一个基于特征匹配的Android App漏洞检测系统,其大致思路为上传APK文件,利用检测脚本反编译APK生成Smali文件,然后从数据库读取漏洞信息特征并根据判定规则进行特征匹配。本章将详细介绍该系统的整体架构和功能模块设计。
2.1 系统总体设计
本文将Android漏洞检测系统分为漏洞信息数据库、检测脚本模块、web页面展示模块等三个部分,而检测脚本模块又由静态分析模块、漏洞扫描模块两个部分。系统框架图如图1所示:
图1 系统框架图
2.2 漏洞数据库
本文从国内知名漏洞库中共选取、归纳、分析Android App漏洞八类,具体为:(1)Android组件暴露漏洞:Content Provider组件暴露;(2)远程代码执行漏洞:Web组件远程代码执行漏洞、Master Key I型漏洞;(3)远程安全绕过漏洞:Fragment漏洞、电话拨打权限绕过漏洞;(4)Android信息泄漏漏洞:Android SQLite Databases漏洞;(5)https中间人劫持漏洞:SSL_WEBVIEW型中间人劫持漏洞;(6)SSL信任所有证书漏洞;(7)Manifest.xml不安全属性配置漏洞;(8)下载替换漏洞。提取每种漏洞类型的漏洞特征信息,存入漏洞库的漏洞特征信息表中。例如,组件暴露漏洞是因为组件在被调用时未做验证,或在调用其他组件时未做验证,其特征为Android Manifest文件中android:exported的值设置为true,未使用android:protectionLevel值为signature验证调用来源。
漏洞信息数据库包括扫描结果存储表、漏洞特征信息表,分别用于存储漏洞扫描相关结果以及漏洞特征信息。漏洞特征信息表为漏洞扫描模块提供了必要的特征信息; 扫描结果存储表主要存储漏洞扫描模块生成的数据,用于结果的展示和文档生成。
漏洞特征信息表是可扩展性的,可通过Web页面提供的借口持续性向该表中添加新的漏洞特征信息。漏洞特征信息表的字段结构如表1所示:
表1 漏洞特征信息表字段结构
2.3 静态分析模块
静态分析模块主要完成对APK的静态分析工作,为后续的漏洞扫描提供数据。其分析目标主要有APK文件列表、Manifest配置文件、资源文件、权限、四大组件(Service、Activity、Broadcast和Content Provider)、敏感API调用。静态分析模块分为三部分来实现:APK文件分析模块、DEX文件反编译模块、Smali文件分析模块,其模块执行流程如图2所示。
图2 静态分析模块执行流程图
APK文件分析模块主要对APK进行解包操作并返回文件类型及APK的基本信息、解析Manifest配置文件以及获取APK中的所有文件; DEX反编译模块即利用工具将DEX文件转换为Jar文件、Smali文件,并获取其中所有类列表及方法; Smali文件分析模块用于实现对DEX反编译后的Smali文件的处理分析工作等。
2.4 漏洞扫描模块
漏洞扫描模块利用静态分析模块中的分析结果、Mongo DB数据库中的漏洞特征信息表中的数据作为输入数据,通过字符串搜索引擎进行特征匹配,从而完成对应用程序的漏洞检测,最后将扫描结果数据存储到Mongo DB数据库中。其运行关系如图3所示:
图3 漏洞扫描模块运行关系图
漏洞扫描模块主要分为两部分:漏洞检测模块、转存扫描结果模块。漏洞检测模块通过读取Mongo DB数据库中存储的漏洞特征信息,用于实现漏洞信息列表中所有漏洞的扫描工作; 转存扫描结果模块主要用于将漏洞检测模块的检测结果转存到漏洞信息数据库中,用于漏漏洞扫描结果的展示与查询。
2.5 Web页面展示模块
图4 APK文件上传模块执行流程图
用户界面模块目的是为实现APK自动化扫描提供操作接口,其主要页面有文件上传、扫描统计、用户管理、漏洞特征管理等。
上传扫描页面提供APK文件上传接口、APK文件检测入口、扫描结果展示及扫描报告下载等功能,其执行流程如图4所示。
扫描统计页面将扫描过的APK信息、文档以列表形式展示,提供查看详情、删除、下载功能; 用户管理页面,可以实现添加用户、删除用户、修改用户等功能,并将修改后的用户信息写入Mongo DB数据库; 漏洞特征页面的主要功能有:展示已有的漏洞特征信息、添加新的漏洞特征信息、删除漏洞特征信息。
3 实验结果
3.1 系统测试运行环境
基于以上设计,本文实现了Android App漏洞检测系统。为了验证该系统的有效性,本文搭建系统运行环境并上传APK文件进行测试,系统运行环境如表2所示:
表2 漏洞信息特征表字段结构
3.2 测试文件来源
实验的测试文件均是从Android应用市场下载的流行应用,Android应用类型包括美食、购物、娱乐、社交、通讯、体育、天气、娱乐、商务办公、出行导航、视频播放等,APK文件一共达到100个。
3.3 测试结果展示
图5 APK文件初步扫描结果统计
本文首先通过Web页面上传待检测APK,上传后即开始自动检测并对漏洞进行分类处理,检测完成后自动展示检测的统计结果。如图5所示。
图6 APK文件漏洞类型统计
查看该APK文件检测结果详情,详情中分别统计漏洞类型数,高、中、低等级的漏洞数据,以及一个漏洞在源码中出现的次数。漏洞类型统计结果如图6所示。
可以查看漏洞详情、展示修复建议等,并展示该漏洞的出处,其具体详情如图7所示。最后在扫描结果的基础上对APK文件进行人工分析,确认了APK确实存在检测系统所检测出的漏洞,从而证明了该系统能够有效、快速地检测出Android App中的已知漏洞。在测试过程中还发现,不能对加固、加壳的APK文件完成自动化检测。
图7 APK漏洞检测详情
4 结语
针对目前Android App的安全问题,归纳Android App已知漏洞特征信息,本文设计并实现了一个Android App漏洞检测系统。系统由Mongo DB数据库、检测脚本、Web三个层面构成,Mongo DB数据库存储漏洞信息特征、漏洞扫描结果,检测脚本完成对APK文件信息提取、DEX文件反编译、关键字匹配等操作,Web页面为系统提供可视化操作接口,简化流程,为实现Android App漏洞自动化扫描提供了有利条件。该系统的实现,节省了Android App漏洞扫描的时间和成本。系统存在的不足是目前针对已加固、加壳的APK文件无法完成自动化检测,需要先将其手动脱壳才能进行漏洞扫描。并且该系统的检测结果依赖特征库中的特征,在一定程度上会产生误报和漏报。系统仍需继续丰富漏洞特征信息数据库,并且综合利用静态分析、动态分析技术来降低误报率和漏洞率,以实现Android App漏洞的全自动化检测。
[1]杨刚,温涛,张玉清.Android漏洞库的设计与实现[J].信息网络安全,2015.
[2](美)Nikolay Elenkov著.Android安全架构深究[M].刘惠明译.北京:电子工业出版社,2016.
[3](美)Joshua J.Drake,(美)Collin Mulliner,(西)Pau Oliva Fora,(美)Stephen A.Ridley,(美)Zach Lanier,(德)Georg Wincherski 著.诸葛建伟,杨坤,肖梓航 译.Android安全攻防权威指南[M].
[4]董国伟,王眉林,邵帅,朱龙华.基于特征匹配的Android 应用漏洞分析框架[J].清华大学学报自然科学报,2016.
[5]推酷.WebView远程代码执行漏洞浅析[OL].http://www.tuicool.com/articles/jeYVFrN,2015.
[6]卿斯汉.Android安全研究进展[J].软件学报,2016.