过去十年,智能手机市场迅速发展,成千上万的的应用被投放至安卓市场,开发人员能轻易往良性软件静态注入恶意代码,再投放至第三方安卓市场,从而衍生了许多的安全问题。据国外调研公司称:2013年第三季度,安卓平台在中国已经占据了59%的市场份额[1]。然而,安卓系统普及的同时,各种重打包软件和木马也随之爆发,2013年上半年,中国第三方安卓平台新增手机木马,重打包软件样本228649款,超过2012年全年新增样本总量,其中九成恶意软件窃取用户隐私,大部分重打包恶意软件来自第三方安卓应用市场。[2]安卓移动端存在很大的安全隐患。研究如何检测重打包软件可以帮助安卓市场管理人员打击盗版软件,帮助用户正确识别重打包软件,检测恶意软件盗取用户隐私数据的行为,维护安卓用户的信息安全。
重打包软件的静态特征主要有两个[3]:(1)主要获取安卓手机用户端的权限,如,等高风险指数的权限;(2)频繁调用,等敏感API。动态行为特点包括[4]:关键路径和隐私数据访问,服务器域名访问,未授权行为执行等等。
目前国内外重打包恶意软件的检测技术方法主要分为三类:第一类是静态检测技术,通过解析APK文件[5],我们可以获得META-INF文件,用于存放应用程序的签名信息,保证APK包的完整性。res文件,用于存储资源文件包括图片,字符串等等。AndroidManifest.xml配置文件,声明了应用的包名,SDK版本,权限,组件等。Dex文件是java字节码文件,可运行于安卓虚拟机Dalvik上。绝大部分静态分析技术是分析APK文件,通过反编译Dex文件为Smali代码文件,对文件中类和类之间函数的调用关系的分析,数据流的传输分析,常用API以及APK结构构建向量特征的分析,采用模式匹配方法[6],将已知安卓应用的APK文件特征与恶意代码软件库中的恶意软件特征比较,检测恶意重打包软件,或采用机器学习和数据挖掘技术方法,提取静态特征向量,训练检测恶意软件的分类器。现有的静态污点分析[7]使用粗粒度相似检测方法,但此方法会导致许多数据泄露的错误警报。为了优化污点分析技术方法,Steven Arzt, Siegfried Rasthofer提出污点传播分析技术[8],这是具有更高精确度的静态污点分析方法,处理分析当发生方法调用和返回时的上下文,数据流量,字段,和对象灵敏度,来减少错误警报率。此优化污点分析方法,主要是通过向前分析或者向后分析传播访问路径。其访问路径的形式定义为为,x是局部变量,f和g是字段。访问路径隐式地描述了通过该路径可到达的对象集合。包含一个流函数,此函数传播与调用无关的污点,在源处生成新的污点,在汇点处报告污点并传播本地调用的污点。经典的静态检测技术还有诸如分析安卓应用的语义签名的许多方法,语义签名分析方法的技术要点在于归纳安卓应用包含的正则表达式匹配的指令序列,此方法面临的问题是恶意软件签名信息不断更新,用于分析的恶意软件签名库需要随之更新,否则重打包应用的漏检率会大幅增加。[9]
第二类检测方法为动态检测方法,即通过分析安卓应用的运行情况来检测重打包应用,沙盒检测技术[10]是动态检测的主要技术,根据具体使用案例不同,沙盒安全策略有所不同,一种是基于防御性定义,使得进程在特定点停止并检查,甚至终止进程来防止潜在的对系统的损害。另外一种是在应用程序运行时监视和记录所有的系统活动,然后处理收集的信息。第二种方法适用于监视未知软件并对其进行分类的情况,例如,通过识别系统状态并分析其原因。
第三类是静态检测和动态检测相结合的处理技术,检测分两步,安卓应用首先通过静态检测,可以得到两类软件,即可疑重打包软件和重打包软件,再由更为复杂的动态分析检测手段检测可疑重打包软件。这里的静态检测,是通过提取待测应用的特征信息,再与安卓重打包软件特征库进行匹配,从而检测已知恶意代码家族的恶意代码样本,同时进行重打包检测。其中特征匹配基于NCD(Normalized Compression Distance)算法[11],该算法可以用于计算两个序列之间的相似度。例如两个特征序列x和y,相连后的序列为S,压缩算法为,压缩后的序列长度表示为,所以x与y的距离表示为
,返回值在0.0到1.0之间。针对静态检测无法应对恶意软件反检测手段如代码混淆,加密,和对于新出现的恶意软件无法检测等情况。可疑软件进行动态分析检测,对恶意软件常用的系统路径和访问数据进行日志记录分析,例如系统程序目录,用户个人隐私数据,用户短信数据库等等,恶意软件会使用某些未在AndroidManifest.xml中声明的权限,绕权执行敏感行为[12]。还有某些恶意软件会非法获取用户信息,并且上传服务器,而动态检测可以收集相关恶意域名,作为恶意软件的行为匹配特征之一[13]。通过行为监控应用在运行时的日志信息进行过滤和记录,再和恶意行为模式匹配,即可判断安卓应用运行时是否存在恶意行为。
文献[14]提出了一种基于permission技术的检测方法。传统的permission技术检测软件是否获取高危敏感权限,归纳恶意软件常用的敏感权限,并进行分类,从而划分恶意软件和良性软件,恶意软件的检测率不是很理想。而此方法是基于ASM字节码处理框架,考虑使用构建恶意软件行为的全部路径算法,路径入口从AndroidManifest.xml获取,主要分析Activity类,构建应用的全部路径图,再与恶意软件路径图匹配,从而提高检测准确度,考虑在此基础上使用机器学习方法,进一步积累系统函数调用风险库,恶意软件的检测正确率会提高更多。
而在最新的文献[15]中,Ke Tian提出了依赖分区DRegion这一概念,依赖分区可分为类级依赖区域和方法级依赖区域,属于一个依赖区域的类之间有方法调用,数据调用,和ICC调用关系,不同依赖区域的类相互独立,无任何调用依赖关系。类级依赖图和方法级依赖图的构建显得尤为重要,其中关键算法为构建两种图的相关算法。与传统的恶意软件特征提取有所不同的是,不再获取字节码中的签名特征,而是通过获取方法级依赖图的特征如方法的覆盖率,即用,覆盖率近似于用户使用一个方法级依赖区域中的方法的比例。就是的方法总数。由U成功调用的方法总数。提取的特征再通过机器学习相关样本,得到分类器,即可用于重打包软件的检测。
[1] 李寅, 范明钰, 王光卫. 基于反编译的 Android 平台恶意代码静态分析[J]. 计算机系统应用, 2012 (11): 187-189.
