邵帅, 王眉林, 陈冬青, 王婷, 姜鑫
(1. 中国信息安全测评中心,北京 100085; 2. 北京邮电大学 计算机学院,北京 100876)
随着移动互联网的发展,Android应用数目快速增长,Android应用软件的漏洞问题日益突出,其数量越来越多,造成的危害也越来越大. 根据通付盾发布的《2017年度移动安全报告》,2017年移动应用安全漏洞数量规模累计超过2.8 亿,由于高危漏洞导致经济损失达到数千亿美元[1].
Android应用程序由应用组件构成,组件是Android系统中较为独特的程序块,组件相关的漏洞一直是Android漏洞分析的研究热点. 一般来说,组件暴露漏洞包括组件权限提升漏洞和组件敏感信息泄露漏洞. 数据流分析(污点传播、可达路径分析)是目前普遍采用的组件暴露漏洞分析方法. Chex[2]可以通过在组件对外开放的接口和内部敏感数据泄露点之间进行污点传播分析来挖掘组件敏感信息泄露漏洞,该工具能够检测应用的所有入口点,然后对应用全局进行数据流分析,分析每一个入口点的执行过程,检测是否存在从开放接口到敏感数据之间的路径. Amandroid[3]是Android组件间数据流分析框架,在数据流分析的过程中对所有对象的指向关系,以及intent的目标和所携带的数据流都进行了分析. IccTA[4]则通过静态污点分析实现了Android应用程序中组件间隐私泄漏的检测. Woodpecker[5]能够检测应用中存在的显式和隐式功能泄露,该工具对APP进行可达路径分析,如果能够提取出从程序进入点到敏感API的可达路径,则认为存在显式的功能泄露,而隐式功能泄露检测则还要分析初始化代码. 杨天长等[6]针对Android应用Intent通信可能导致的安全风险,设计了基于动静结合的安全威胁检测方法. Zhang等[7]针对组件劫持漏洞提出了AppSealer框架,不但可以通过可达路径分析发现漏洞,还能自动化打补丁.
Maiorca等[8]提出了一种名为R-PackDroid的Android恶意软件检测系统,使用字节码和API包作为特征集. StormDroid[9]结合Android应用的静态和动态特征,并基于机器学习检测Android恶意软件. Marko等[10]评估了一些自动检测远程存储库中Android恶意软件的技术. 这些技术跟踪沙箱中应用的系统调用,并使用机器学习基于系统调用对应用程序进行分类.
机器学习技术已普遍用于源代码或二进制代码的漏洞分析中. Grieco等[11]提出了一种利用机器学习进行二进制程序漏洞预测的方法,但是该方法只能预测漏洞存在的可能,不能定位漏洞. 文献[12]提出了一种新的缺陷搜索方案,将CFG转换为高级数字特征向量,能够在跨平台的固件中搜索定位已知漏洞. VulDeePecker[13]通过向量表示程序中语义相关的多个(不一定是连续的)代码行,并实现了基于深度学习的漏洞检测系统及对应的漏洞数据集.
本文提出了一种基于机器学习检测组件类Android应用漏洞的方法:根据组件暴露漏洞原理总结了漏洞模型. 提取Android应用程序特征,并基于漏洞模型进行特征选择和量化,然后设计并实现了对应的机器学习系统,将样本特征集输入到机器学习算法中,得到漏洞分类模型,最后对漏洞分析效果进行了评估.
Android组件暴露漏洞包括组件劫持漏洞和组件拒绝服务漏洞. 组件劫持漏洞是指应用程序的组件权限配置不当,导出的组件可能被第三方APP恶意利用导致权限提升或者敏感信息泄露;组件拒绝服务漏洞指应用程序组件在处理其他组件传入的数据时,没有对异常参数进行处理,若第三方恶意APP传入精心构造的数据,可能导致目标程序崩溃.
应用程序权限控制是Android系统中的安全机制之一,它管理用户授予每个应用程序的权限,并防止应用程序超出权限. 但是,如果某个组件使用了某种敏感权限,却又对外部开放,那么第三方APP可能调用该组件实现权限提升或者获得敏感数据. 组件劫持漏洞的攻击场景如图1所示. 恶意应用程序没有获得调用系统API进行敏感操作(如调用getLocation()拨打电话)所需的权限P(如调用getLocation()需要权限“android.permission.ACCESS_FINE_LOCATION”). 但是M通过在应用程序A的组件A1中调用涉及权限P的方法来执行其敏感操作,M将A1作为跳板,在没有获得授权的情况下执行敏感操作,实现权限提升.
图1 组件劫持漏洞的攻击场景Fig.1 The attack scenario of component hijacking vulnerability
同理,组件拒绝服务漏洞的攻击场景为:恶意应用向存在漏洞的目标应用发送一个精心构造的Intent,目标应用在处理该Intent时崩溃.
通过分析漏洞原理和攻击场景,可以得出组件暴露漏洞的4个基本要素:组件,敏感API、调用路径和敏感权限. 组件是指在应用程序中包含敏感操作的应用程序组件;敏感API是指涉及敏感权限的系统API,攻击者可以通过开放的组件调用该API;调用路径是指从组件入口点到敏感API的调用路径,权限是指用户授予应用程序的系统权限. 对于组件劫持漏洞,攻击者是否可以利用漏洞取决于应用程序开发人员是否对应用程序采取安全保护措施. 当开发人员为该组件设置了访问权限时,即使代码中形成漏洞结构,攻击者也无法利用此漏洞来实现攻击目的.
基于以上因素,定义了组件暴露漏洞的表达向量. 其中组件包括组件名称、导出属性、组件访问权限等;敏感API包括敏感API的名称、参数、返回值等;调用路径包括从组件入口到敏感API的一系列函数的名称、参数、返回值等;权限包括敏感权限名称和级别.
Android应用的特征集合主要包含Android应用程序的基本特征和代码特征. 其中基本Android应用程序是指AndroidManifest.xml文件中的配置信息和权限信息. 代码特征是指从应用程序APK包中的class.dex文件中分析得到的类、方法等信息.
首先通过逆向,还原出每个组件的smali代码,并方法、参数等作为其代码特征;然后从根据组件暴露漏洞的特征向量从应用程序特征和代码特征中选择对应特征子集. 组件和敏感权限从基本特征中提取,敏感API和调用路径从代码特征中提取.
本模块的主要功能是解压缩、反编译、解析和提取Android APK文件信息,以供后续功能选择. 模块集成了开源框架“Androguard”和“FlowDroid”实现APK信息提取. 主要通过Androguard等实现基本特征的提取,通过FlowDroid实现代码特征的提取.
图2 特征提取模块Fig.2 The feature extraction module
该模块的主要功能是完成从APK元信息到机器学习训练数据的转换,模块包括两个子模块,特征选择和特征处理. 通过之前的特征提取模块,获得了包含完整Android应用信息的特征集,在特征选择子模块中将Android应用特征集与前面建立的组件暴露漏洞模型相结合,选取与组件暴露模型相关的特征,接下来,将特征向量输入特征处理子模块,特征处理子模块将相关特征集中的特征转换成可量化的形式,并进行数据清理和特征向量化. 具体为:借鉴词袋法,将特征所有可能取值放入集合中,并统计样本中某项特征的出现次数作为该特征维度的值. 组件、系统权限都直接作为特征取值集合,而由于系统API数量过多,在将敏感API转换成可用于特征量化的形式之前,首先将敏感API按照其归属的功能类进行聚类,再将聚类结果作为API特征取值集合;敏感API聚类完成后,统计代码特征中属于某一类的敏感API的出现次数,作为API的特征维度值. 调用路径则由敏感API的调用步数表示. 对于训练样本APK中的每一个组件,都将组件特征数据拼接为一组信息,再将所有组件信息组建为样本特征矩阵,写入文件中作为训练数据. 在构建特征矩阵之后,进行数据清理,即缺失值处理,最后将数据矢量化为机器学习算法的输入形式.
实验中将样本集划分为训练集和测试集,分别用于训练分类模型,以及测试分类器的性能. 在完成模型训练后,需根据模型在验证集上的表现调整算法中的参数,比较不同参数下的评估结果,选择评估结果最优的模型作为分类模型.
图3 漏洞分类模块Fig.3 The vulnerability classification module
根据已有的自动化Android应用漏洞检测工具,结合人工分析与验证,建立了1 000个Android APK样本集,其中存在组件暴露漏洞的APK 500个,不存在组件暴露漏洞的APK 500个. 在实验系统中采用了卷积神经网络算法,共进行了5次测试. 测试时采用5折交叉验证,每次选择800个APK进行训练,200个进行测试(其中100个存在漏洞,100个不存在漏洞). 测试结果如表1所示,可以看到,平均精度在90%以上.
表1 实验数据Tab.1 Experimental result
提出了Android组件暴露漏洞模型,定义了组件暴露漏洞的表达向量. 结合Android应用程序特征与该模型,提取了组件暴露漏洞特征,并转化为特征向量,通过机器学习技术对每个组件进行分类,判断是否存在漏洞. 实验结果表明,所选择的特征和算法可以产生较高的检测精度,这表明本文方法是可行的.
但本文仍存在一些不足之处,首先,在漏洞分析的粒度上,VDiscover分析的粒度为一个二进制文件,本文分析的粒度为组件,虽然本文的方法适用于组件类漏洞,但是对于某些其它类型的Android应用漏洞,如SSL证书校验漏洞,无法实现漏洞定位,下一阶段将增加支持的漏洞类型.