APP下载

基于APP分层结构的Android应用漏洞分类法

2018-09-25于浩佳陈思远

信息安全研究 2018年9期
关键词:分类法安全漏洞漏洞

刘 蓉 于浩佳 陈思远 陈 波

(南京师范大学计算机科学与技术学院 南京 210023) (1250071326@qq.com)

近2年,Android手机在全球市场份额占比始终维持在80%以上[1].随之而来的是Android平台的安全问题也日益增多.360发布的《2017年度安卓系统安全性生态环境研究》显示[2],截至2017年12月,所测设备中93.94%的Android手机存在安全漏洞.用户从Android应用市场下载应用时,无法了解该应用存在的漏洞及安全隐患,而那些广泛存在的漏洞中相当一部分会导致用户在毫不知情的情况下泄露隐私信息,给用户甚至组织造成财产损失.因此,对Android应用进行安全评估就显得尤为重要.

安全评估系统会对Android应用进行全面的检测,并提示用户该应用可能存在的安全风险,例如该应用可能暴露用户位置信息,或者恶意软件可以通过该应用的代码漏洞进行权限提升等等.用户得到评估信息后可以对安全风险有更充分的认识,并根据评估系统给出的提示更好地保护自己的隐私数据,从而对存在的安全漏洞进行相应的防范.安全评估系统还能帮助Android程序员在开发过程中及时发现应用的漏洞与不足之处.另外,安全评估亦是Android应用市场以及各级管理者进行安全管理的关键技术.各大Android应用市场会对市场内提供的应用进行安全评估,以告知用户应用是否安全并拒绝危险应用上架.

要对Android应用进行系统化的安全评估,首先必须有一种科学的漏洞分类法.通过对Android应用漏洞进行科学合理的分类,能使评估结果更为客观准确、更具有说服力.但是,目前Android应用漏洞分类方面的研究尚未引起足够重视,已有的一些Android漏洞分类法实际上不满足Amoroso[3]提出的分类法所应具有的六大特性,部分分类法不具有良好的可扩展性,难以将新出现的漏洞扩展到分类体系中去.为此,本文提出了一种基于APP分层结构的Android应用漏洞分类方法.

1 相关工作

安全漏洞分类是指依据漏洞的特征或属性进行类别的划分.计算机软件安全漏洞分类方面的研究由来已久,早在1976年Abbott等人[4]就对操作系统的安全漏洞分类进行了研究,在此后的40多年中,国内外都有不少相关的研究,研究内容也不局限于操作系统的安全漏洞,而是涵盖了Web应用漏洞、应用软件漏洞、Android应用漏洞等多个计算机领域[5-8].下面对与Android安全漏洞分类相关的研究进行分析.

1.1 计算机软件安全漏洞分类法

软件安全漏洞分类方面的相关研究较多,例如Tsipenyuk等人[9]提出的“7+1”分类法,“7”是指输入验证(对输入内容过度信任)、API滥用(调用者未按协议使用API)、安全功能(访问控制、加密、权限管理等设置不当)、时间和状态(分布式计算中时间和状态错误)、错误(系统对非预期输入处理不当)、代码质量(代码质量不佳导致漏洞产生)、封装(代码未作合适的封装处理),“1”则指环境(软件运行环境存在漏洞).还有王勇等人[10]在Frei等人[11]工作的基础上提出了一种基于漏洞生存期的多维量化属性分类法.该方法对软件安全漏洞的3种属性进行了研究和量化:生存周期属性、安全属性和分布属性.

我国在2017年发布了安全漏洞分类的国家标准[12],标准中按成因、空间及时间分成3类,并提出分类法应当遵循唯一性和扩展性原则.

上述分类方法,均对漏洞本身特征与漏洞所在平台的特点进行了充分考虑,将所有漏洞都囊括在构建的分类框架中,因此也是Android安全漏洞分类值得借鉴的.但是Android平台上的漏洞与传统的PC平台漏洞由于所在系统平台以及应用上的不同而具有一些天然的差异性.

1.2 Android安全漏洞分类法

1) 基于系统架构的Android漏洞分类方法

Android操作系统是基于Linux的,由应用程序层、应用程序框架层、系统运行库层和Linux内核层这4层架构组成,不同的层次分担不同的工作,而不同的漏洞也会出现在不同的层次,因此有的学者围绕4层架构进行分类.卢双龙等人[13]在此基础上又进行了进一步的扩展,将4层扩充为6层,增加了管理层和硬件层.管理层主要包含权限管理漏洞、应用安装机制漏洞等;硬件层则包含了会对设备造成损害的环境因素和传感器等可能遭受的物理损坏.这种6层分类法相比4层分类法更为细致,对漏洞的划分也更为精确.但这种分类法主要是面向Android系统漏洞的,而非针对应用安全漏洞,Android应用漏洞几乎不会出现在Linux内核层或系统运行库层这些层次,因此这种分类法无法适用于Android应用漏洞的分类.

2) 基于漏洞库的Android漏洞分类方法

NVD,CNVD,CNNVD是目前国内外比较主流的漏洞库,我们在这3个漏洞库中均进行了高级搜索,搜索关键词为Android,厂商为Google,产品为Android的漏洞.NVD中共有结果1 280个,CNVD中有漏洞930个,CNNVD有803个(搜索日期是2018年5月31日).其中CNVD和CNNVD的漏洞详情中都有漏洞类型,CNVD对几乎所有搜索结果的漏洞类型都标记为通用软硬件漏洞,无法很好地体现漏洞特征.而CNNVD的漏洞类型描述相对比较详细,有信息泄露漏洞、权限许可和访问控制漏洞、缓冲区溢出漏洞等多种类型,但也有很多漏洞的漏洞类型处写着资料不足而未予以分类.董国伟等人[14]对这些Android漏洞进行了整理归纳,将Android应用常见漏洞归纳为7种:组件权限暴露漏洞、Webview组件远程代码执行漏洞、弱随机数漏洞、Intent注入漏洞、SQL注入漏洞、敏感数据泄露漏洞和运行时代码加载漏洞.然而这种分类法只是简单地枚举了几类漏洞,许多已知的Android应用漏洞不属于这7类中的任何一类,例如数据传输时的HTTPS未校验服务器证书漏洞、Intent组件的隐式意图调用漏洞等都无法在该分类方法中进行归类,因此这种方法在实际应用中需要不断扩充和优化.

3) 基于经验的Android漏洞分类方法

基于经验的Android漏洞分类方法通常是作者根据手中已有的资料,对Android漏洞进行归纳总结,然后基于自身经验对这些漏洞进行分类.

刘昊晨[15]对Android漏洞进行了如下分类:缓冲区溢出漏洞、Root漏洞、拒绝服务漏洞、API逻辑漏洞、浏览器审查漏洞、蓝牙等连接攻击漏洞和其他漏洞.这种分类方法罗列的漏洞种类较少,对于大多数漏洞都未予研究,将所有未涵盖的漏洞都归于其他漏洞分类中.

网上有许多Android应用安全评估平台,这些平台也都有各自的漏洞分类方法.例如“爱加密APP漏洞分析平台”将检测项目分为五大类:内置SDK检测、数据存储检测、源码检测、敏感信息检测和其他项检测.还有“爱内测移动应用安全测试专家”,该平台检测项目分为应用安全检测、源码安全检测和数据安全检测.360旗下的移动安全检测平台“360显危镜”则没有对漏洞进行分类,而是在网页上对所有检测项目进行了列举,用户体验较差.

基于经验的分类方法通常缺乏足够的理论依据支撑,并且很容易因为作者经验不足而出现遗漏.这样的分类通常只需满足工作需求即可,从而出现分类质量低、漏洞覆盖不全面的问题.

以上3种分类方法都存在各自的问题,基于漏洞库的分类法和基于经验的分类法都出现了未包含全部漏洞的问题,并且可扩展性都较差,而基于系统架构的分类法则并不适用于应用安全漏洞的分类.这些问题是我们在Android应用漏洞分类方法中需要注意和避免的,在保证漏洞分类方法能满足安全评估需求的同时,还要做到分类科学合理,具有良好的可扩展性和通用性.

2 基于APP分层结构的Android漏洞分类法

针对当前Android应用安全评估技术相关研究欠缺、Android漏洞分类通用性和可扩展性差等现状,本文在现有方法的基础上,提出了一种基于APP分层结构的Android应用漏洞分类方法——LSA分类法.

2.1 Android应用漏洞层次分布

Android应用的安全评估,评估的是应用的APK文件以及安装后应用功能的安全性,此外,用户安装应用的环境千差万别,因此,各个不同版本的Android操作系统的系统漏洞并不在分类范围内.

图1 漏洞层次分布图

LSA分类法(a taxonomy of Android application vulnerabilities based on layered structure of application)将Android应用中的漏洞分为3层4类,如图1所示.最底层的是Java代码层,Java代码层中有组件安全漏洞(component security vulnerabilities)和数据安全漏洞(data security vulnerabilities).Java代码层之上是应用源文件层,这里的文件指的是APK文件解压缩后产生的dex文件、so文件等,在这一层有源文件安全漏洞(source file security vulnerabilities)和Manifest文件漏洞,其中Manifest文件漏洞介于代码层和源文件层之间,但Java代码层考虑的漏洞主要是Java代码产生的漏洞,而Manifest文件是可扩展标记语言XML所写,因此此处将其归于应用源文件层.顶层是用户界面层,这一层的漏洞是业务逻辑漏洞(logical vulnerability).

2.2 各类漏洞详情

在对Android应用漏洞进行层次划分后,分类结果如图2所示:

图2 LSA分类法图示

1) 组件安全漏洞

一个Android应用是由不少于一个的组件组成的,通过对Android漏洞的整理发现,这些组件中Activity组件、Services组件、Broadcast Receiver组件、Content Provider组件、Intent组件和WebView组件这6种组件的漏洞较多,因此6种组件均单独列为一类,除此之外Android中还有数量众多的其他组件,这些组件的漏洞均归类为其他组件漏洞.

Activity组件漏洞:Activity组件可导出漏洞,即设置exported=“true”,这会导致该组件被一个第三方的恶意应用利用,从而导致安全风险;Activity Manager漏洞,ActivityManager类中的killBackgroundProcesses函数能够杀死进程,误用将导致安全威胁,是一个风险较低的漏洞.类似的漏洞还有不少,凡是与Activity组件直接相关的漏洞均属于此类.

Services组件漏洞:Services组件可导出漏洞,原理与Activity组件可导出漏洞类似.还有一些漏洞利用Services组件在后台运行的特性,在不提示用户的情况下在后台执行敏感操作,这类漏洞均属于Services组件漏洞.

Broadcast Receiver组件漏洞:Broadcast Receiver组件可导出漏洞.动态注册广播组件暴露漏洞,应用动态注册了一个Receiver组件,导致其被恶意应用利用,造成应用泄露敏感数据或执行不安全操作.

Content Provider组件漏洞:Content Provider组件可导出漏洞.Provider文件目录遍历漏洞,攻击者通过openFile()遍历文件目录,进而获取所有可读文件;读写权限漏洞,Content Provider组件如果没有对文件读写权限进行合理限制,攻击者就可以读取其中的敏感数据,而Content Provider中往往会包含不少此类数据.

Intent组件漏洞:隐式意图调用漏洞是Intent组件最常见的漏洞,未指定具体接收对象,导致Intent可被其他应用获取,造成数据泄露;意图协议URL漏洞,通过特定URL直接向应用发送意图,调用未导出的组件.

WebView组件漏洞:WebView组件用于展示Web页面,因此涉及的漏洞也较多,包括WebView明文存储密码风险、WebView远程代码执行漏洞、WebView绕过证书校验漏洞、未移除有风险的WebView系统隐藏接口、WebView忽略SSL证书错误等多个漏洞.

2) 数据安全漏洞

数据安全漏洞指的是会导致应用内敏感数据泄露的漏洞,这里需要指出的是,由组件漏洞导致的数据泄露均归于组件安全漏洞,这会在下面验证分类法科学性的部分进行详细阐述.数据安全漏洞又分为4类:数据存储漏洞、数据加密漏洞、数据传输漏洞、日志信息漏洞.

数据存储漏洞:SharedPreferences漏洞,使用getSharedPreferences时参数设置不当,使应用文件可被第三方读写篡改;File任意读写漏洞,使用openFileOutput (string name,int mode)方法创建内部文件时设置为全局可读写,导致创建的文件可被全局读写.

数据加密漏洞:明文数字证书漏洞,数字证书未进行加密可能会被盗取或篡改,造成用户账号信息被攻击者获取;AESDES弱加密,使用“AESECBNoPadding”或“AESECBPKCS5padding”的模式,ECB方式易被破解,安全性不足;setSeed伪随机数漏洞,本地加密时使用setSeed方法,这种方法产生的伪随机数易被破解.

数据传输漏洞:在应用进行网络数据传输时会产生许多安全漏洞,其中包括许多传统网络安全漏洞,但这里主要考虑应用本身造成的漏洞.例如SSL通信服务端检测信任任意证书、未使用HTTPS协议的数据传输、HTTPS未校验服务器证书、HTTPS关闭主机名验证、开放socket端口,这些都是应用中一些设置不当导致的数据传输漏洞.

日志信息漏洞:日志是Android的一大特色,在日志文件中会包含大量的敏感数据,而日志在很多时候都是可以通过一些方法来调用或恶意获取的,这就会导致日志中敏感数据的泄露.

3) Manifest文件漏洞

Manifest文件漏洞是指AndroidManifest.xml配置文件中一些参数设置不合理而导致的安全风险.主要有:应用设置为可调试,从而易被攻击或破解;调用敏感权限,例如发送或拦截短信、访问通讯录、发送地理位置等敏感权限,但这不能一概而论,部分应用确实需要一些敏感权限来实现一些功能,但如若应用调用一个与其功能完全不相关的敏感权限,则就会被认为存在安全隐患;申请冗余权限,应用申请了非必须权限,该权限可能并非敏感权限,但这将导致应用遭受提权攻击的风险上升.

4) 源文件安全漏洞

Android的APK文件属于一种压缩文件,解压后可以获得包括dex文件、so文件、xml文件等各种类型的文件,如果对这些文件没有进行很好的保护,则会导致应用易被攻击.对文件保护不足主要有3类:dex文件保护不足、so文件保护不足、代码未混淆.

dex文件保护不足:dex文件是Android应用的核心文件,若不进行适当的加固保护,则应用极容易被反编译,从而导致代码篡改等安全风险.

so文件保护不足:so文件虽然相较于dex文件更难被破解,但仍有经验丰富的攻击者能够通过一些工具对其破解,一旦so文件被破解,应用中的一些关键算法就会泄露.

代码未混淆:如果应用被反编译,代码混淆能够对应用代码进行一定程度的保护,攻击者面对混淆过的代码无法轻易地理解,一些关键代码也难以寻找,而一旦代码未混淆,攻击者就能轻易地找到关键代码进行查看或篡改,造成巨大的安全威胁.

5) 业务逻辑漏洞

业务逻辑漏洞通常在实际运行应用时通过人工的方式才能发现,例如最常见的密码找回,有些应用的密码找回功能存在逻辑缺陷,在没有充分验证当前用户身份的前提下就允许其进行密码找回或修改.比如给用户账号绑定的手机发送验证码,输入该验证码即可进行密码找回,那么一旦用户手机失窃,手机持有者就能完成这一操作,而对用户的信息、财产安全构成威胁.

2.3 分类法形式化描述与验证

2.3.1符号定义

接下来对LSA分类法的科学性进行验证.

首先定义如下符号:

1) 集合符号

V为所有Android应用漏洞集合;v为集合V中的一个元素;C为组件安全漏洞集合;D为数据安全漏洞集合;F为源文件安全漏洞集合;L为业务逻辑漏洞集合.

2) 函数符号

domf表示函数f的域,满足f(x)的x的集合;f:X→Y表示f为X映射到Y的部分函数,即domf为X的子集;C-D:C×D表示C-D为C与D的有序对集合,C-D中的元素即同时属于组件安全漏洞和数据安全漏洞的Android应用漏洞,C-F,C-L,D-F,D-L,F-L的定义与C-D同理;VC-D:V→C-D表示函数VC-D把满足条件的Android应用漏洞映射到C-D类中,VC-F,VC-L,VD-F,VD-L,VF-L的定义与VC-D同理.

在某些情况下,组件安全漏洞可能导致数据泄露等问题,为去除二义性,定义所有由组件安全漏洞引起的数据安全漏洞均属于组件安全漏洞,即

另外根据分类法的分层,C,D,F,L分属3个不同的层次,显然,位于不同层次的漏洞集合都是不相交集合,对于层次划分可能存在歧义的Manifest文件漏洞,前文已经明确将其划分为应用源文件层.

2.3.2Z表示法描述与验证

本文使用Z语言的模式(schema)对分类法进行描述.

模式是Z语言的基本描述单位,是Z规格说明的基本结构,如图3所示.一个模式由3部分组成:模式的名称、声明部分和断言部分.模式的声明部分引入变量及其类型;断言部分描述了这些变量之间的不变式关系.分类法的描述如图4所示.

图3 Z表示法

图4 分类法描述

Amoroso[3]提出,分类法应当具有互斥性、穷举性、非二义性、可重复性、可接受性和可用性.根据图解可以得出结论,LSA分类法中,4类漏洞的集合具有互斥性,两两之间均无重复元素,对于任一新加入的漏洞,也只会属于4个集合中的1个集合,具有非二义性.

LSA分类法将一个Android应用完整地划分为3层,避免了一一列举而造成漏洞的遗漏,因此也很好地满足穷举性.

LSA分类法定义明确,不同漏洞类型间界定分明,使用者及使用情景不会对分类结果造成影响,是可重复的.

LSA分类法符合逻辑,对多种已有的分类法进行了参考,具有良好的可接受性.

LSA分类法可以直接应用于Android应用的漏洞分类,并且能够很好地满足安全评估的需求,符合Amoroso提出的可用性.

3 相关工作比较

为了更好地说明本文提出的Android应用漏洞分类法在APP安全评估中的优势,将其与1.2节中列举的几种已有的Android安全漏洞分类法进行比较,具体有如下优点:

1) 科学性和严谨性.3种已有的分类法都不能很好地满足分类法所应具有的六大特性,其中基于漏洞库的Android漏洞分类方法和基于经验的Android漏洞分类方法都具有较强的主观色彩,主要分类依据是作者的经验,分类较为随意.本文提出的LSA分类法则通过系统的层次划分、严格的类别定义和形式化描述证明,保证了分类法的科学性和严谨性.

2) 可扩展性.LSA分类法具有良好的可扩展性,在Android系统不发生巨大变革的前提下,可以对漏洞分类下的具体漏洞进行扩展,将最新产生的漏洞加入其中.

3) 针对性.LSA分类法从安全评估的角度出发,对安全评估中需要检测的项目进行了科学系统的分类,涵盖了Android应用中需要检测的敏感项目,因此本文分类法对于安全评估的需求具有很强的针对性.

4) 实用性.目前国内有众多的Android应用安全评估平台,例如“爱加密APP漏洞分析平台”、“爱内测移动应用安全测试专家”、“360显危镜”等,各大评估平台对漏洞分类标准不一,评估结果也因此具有很大差异,因此,本文提出一种专门的分类法可以统一评估指标,具有重要的实用价值.

4 小 结

Android应用安全评估是对一个应用进行全面的检测.例如源文件是否进行了足够的保护、程序中是否有安全漏洞、应用是否会泄露用户敏感信息等等.通过对这些项目进行检测,给出被检测应用的安全等级或安全评分,对普通用户、Android程序员、Android应用市场管理者都具有较强的实用性.

本文从Android应用安全评估的角度出发,提出了LSA分类法,满足分类法应当具有互斥性、穷举性、非二义性、可重复性、可接受性和可用性.LSA分类法对已有的几种Android漏洞分类法进行了优化和改良,并对安全评估具有更强的针对性.

本文已将提出的分类法应用到安全评估系统中,并基于LSA分类法提出一种Android应用漏洞统一描述语言,我们将另文介绍完成的工作.

猜你喜欢

分类法安全漏洞漏洞
漏洞
基于模糊测试技术的软件安全漏洞挖掘方法研究
探析计算机安全漏洞检测技术
分类法在高中化学中的应用
试论安全漏洞检测技术在软件工程中的应用
智能设备安全漏洞知多少
三明:“两票制”堵住加价漏洞
漏洞在哪儿
高铁急救应补齐三漏洞
基于贝叶斯分类法的股票选择模型的研究