APP下载

基于机器学习的Android恶意软件检测实验

2020-03-09杨章静

实验技术与管理 2020年12期
关键词:组件机器特征

陈 镭,杨章静,黄 璞

(1.南京审计大学 实验中心,江苏 南京 211815;2.南京审计大学 信息工程学院,江苏 南京 211815;3.南京大学 计算机软件新技术国家重点实验室,江苏 南京 210232)

近年来,全球智能手机用户数量呈指数级增长,估计到2021 年将达到17.7 亿部。Android 被设计成一个开放、免费和可编程的操作系统,设备和用户数量庞大,应用程序丰富,已成为目前最为流行的移动智能操作系统。然而,Android 系统的开放性不仅吸引了合法应用的开发者,也出现了众多的恶意软件[1]。赛门铁克公司提供的互联网安全威胁报告指出,每5个Android 应用中就会有1 个实际上是恶意软件,这给Android 用户带来了严重的风险。

常用的商业恶意软件检测工具,如“360 手机安全卫士”“腾讯手机管家”等,一般采用基于签名的检测方法。基于签名的检测技术源于模式匹配[2-3]的思想,为每种已知恶意代码产生一个唯一的签名特征标记,来创建恶意代码库。基于签名的检测方法相对简单,检测速度快,在恶意代码库比较大的情况下,可以获得较好的检测效果。但是这种方法对于不在恶意代码库中的软件无法检测,且随着恶意代码库越来越大,不仅占用大量的存储空间,还需要大量的人力来更新维护恶意代码库。而且一旦恶意软件对代码进行微小的修改和伪装,基于签名的检测方法就失去了相应的检测能力。

为了应对不断发展的Android 恶意软件攻击,近年来机器学习技术越来越多地应用到Android 恶意软件检测领域[4]。在这些系统中,基于不同的特征表示(如权限[5]、API 调用[6-8]、系统调用图[9-10]、动态行为[11]等),可以分为基于静态特征[12]、动态特征和静动态特征结合的方法[13]。采用不同的机器学习算法,如支持向量机(SVM)[14]、随机森林和深层神经网络[15],构建模型来检测恶意软件,都取得了不错的效果。

本文采用基于静态特征检测的思路,对机器学习方法引入到Android 恶意软件检测领域进行了实验验证,实验过程如图1 所示。首先提取Android 应用程序的静态特征,把特征映射到高维向量,然后采用机器学习算法构建并训练模型,训练好的模型可直接部署到用户的Android 设备上,最后对待测Android 应用软件进行检测。

图1 检测实验流程图

1 Android 应用软件背景知识

1.1 恶意软件行为

Android 平台上,恶意软件往往通过重打包的方式伪装成正常软件引导用户下载安装。通常在后台拨打电话、发送拦截服务短信、推送广告等,使用户在毫不知情的情况下被扣去通信费用。部分恶意软件搜集用户敏感信息,将短信内容、通讯录列表信息、地理位置信息等敏感数据发送到指定服务器;还有部分恶意软件通过非法获取root 权限,在未经用户允许的情况下恶意删除用户数据、耗费系统资源、删除系统组件、更改系统外观、加密文件、勒索钱财等,对用户正常使用造成严重的破坏和影响。

1.2 Android 应用软件介绍

应用软件想要在Android 设备上运行,必须先进行编译,然后打包成为一个能够被Android 系统识别并运行的APK 文件。一个APK 文件解压后通常包含lib 目录、META-INF 目录、资源文件(resources)、原生资源文件(assets)、清单文件(AndroidManifest.xml)和Dex 文件(*.dex)等。

清单文件是 Android 应用的入口文件,每一个Android 项目都包含一个清单文件。文件中包含了应用程序中所有申请使用的权限,这些权限在软件安装时会展示给用户授权。比如一个游戏软件可能需要写入存储卡或振动的权限,但通常不应该申请读取通讯录或者短信记录的权限。在这个环节,用户可以根据需要选择接受或拒绝。清单文件中还包含了组成应用程序的每一个组件如活动组件(activities)、服务组件(services)、内容提供器组件(content providers)和广播接收器组件(intent receivers),并使用权限(permissions)和意图过滤器(intent)来确定组件之间以及组件和其他应用之间的交互。

Dex 文件是应用程序的Java 源代码经编译后形成的字节码文件,包含源程序中定义和实现的所有类和方法,它通过Dalvik 虚拟机解释执行。从Dex 文件中可以得到应用程序的各种行为,包括敏感API 调用、受限制的API 调用、字符串常量信息、访问操作系统敏感资源以及所有与系统相关的功能要求和许可等。

AAPT(Android asset packaging tool)工具是Android SDK 提供的工具之一,它不但可以编译和打包原始文件,还可以逆向解压APK 文件。APK 文件的打包与解压流程如图2 所示。

图2 APK 文件打包与解压流程

2 基于机器学习检测的实验方案

2.1 机器学习项目的步骤

一个完整的机器学习项目一般流程包括:

(1)把拟解决的问题抽象成数学问题。首先要明确问题,是分类问题、回归问题或是聚类问题。本文实验要解决的恶意软件检测问题属于典型的二分类问题。

(2)数据获取及分析。获取的训练数据要有一定的代表性,不然会出现过拟合现象。例如分类问题,不同种类的数据规模不能有几个数量级的差距。根据训练数据的量级、样本的总量、特征的总量,可以估算出内存占用率。内存占用率过高甚至溢出,则需要考虑改进算法或使用特征降维,以及采用分布式系统进行训练。

(3)数据预处理。据统计,数据预处理要占用整个分析过程50%~80%的时间,好的数据预处理会让建模达到事半功倍的效果。数据预处理阶段通常有4 类方法:数据的清洗、集成、变换和规约。

(4)特征工程。其目的是筛选出显著的特征、排除非显著的特征。特征工程能使模型的性能得到提升,在机器学习中具有非常重要的作用,有时在简单的模型上也能取得不错的效果。特征工程一般包括特征构建、特征提取、特征选择3 个部分。期间需要用到卡方检测、信息增益、条件熵、后验概率等与特征有效性分析相关的技术和方法。

(5)模型选择与调优。根据要解决的具体问题和数据的实际情况来选择模型。综合考虑样本的数量、特征的维度、数据的分布以及要解决的问题属于分类、回归还是聚类,采用交差验证方式,观察测试结果曲线,分析原因,尝试找到最优模型及参数组合。

(6)模型评估。从模型准确率、精确率、召回率、ROC 曲线、均方误差,时间复杂度、空间复杂度、迁移性、稳定性等多个方面进行模型评估。

2.2 特征提取

本文实验和Drebin 项目[12]一致,从清单文件和Dex 文件中共提取8 类静态特征。

1)从清单文件中提取的特征。

硬件特征(hardware components)。应用程序请求使用手机硬件设备,如相机、蓝牙或GPS 设备,则必须在清单文件中声明这些功能。请求访问某些硬件组合通常会反映有害行为。

请求权限特征(requested permissions)。Android平台上的应用和系统、应用和应用之间被权限系统隔离开,当应用想要访问某些数据或准备执行特定操作时,必须申请相应的权限。恶意软件通常会更频繁地请求某类权限,例如申请发送SMS 相关的权限。

应用组件特征(application components)。Android系统中存在4 种不同类型的应用程序组件:Activities、Services、Providers 和Receivers。这些组件的名称可能有助于识别同一个家族演变的恶意软件。例如,DroidKungFu 病毒的几种变体共享特定名称的服务组件。

意图特征(filtered intents)。Android 系统进程内和进程间通信主要通过Intent 进行。例如startActivity函数给某个Activity 组件发送Intent,以启动该组件的一个实例;startService 函数给某个Service 组件发送Intent 以启动这个Service。

2)从Dex 文件中提取的特征。

受限API 特征(restricted API)。指受到权限保护的API,Android 权限系统会对关键API 的访问进行限制。假如一个应用使用受限API,但没有请求相应的权限,这表明此软件很可能非法获得了root 权限。

使用权限特征(used permission)。应用程序申请了某个权限但并不一定真正会使用该权限。只有在代码中调用了受权限保护的API,或访问了受权限保护的数据,才算正在使用了某种权限。

可疑API 特征(suspicious API)。指人为定义的某些访问手机敏感资源,并且经常在恶意软件中出现的API。例如:加解密、发送Http 请求、获得设备信息、读写SMS、读写外部存储等相关API。

网络地址特征(network addresses)。某些恶意软件会定期与远程服务器建立网络连接,泄露用户隐私数据等。因此,在反汇编代码中搜索IP 地址、资源定位符(uniform resoures cocator,URL)、主机名等字符串特征,其中一些地址可能与僵尸网络有关,存在于多个恶意软件样本中。

2.3 特征向量

节2.2 中从清单文件和Dex 文件中提取的静态特征均为字符串形式,由于大多数机器学习方法是对数值向量进行操作,因此需要先将提取的特征字符串转换成离散的数值形式。

特征转换:定义一个大的集合S,集合S包含了提取的8 类特征中的所有字符串。通过向每类特征中的所有字符串添加唯一前缀,确保属于不同类别的特征元素不会发生冲突,同时保证属于同一种类别的特征元素的唯一性。

和集合S对应,本文定义了一个|S|维向量空间,其中的每个维度取值为0 或1。对于每一个单独的应用软件x来说,是通过构造一个特征向量来对其进行描述,这样对于从x中提取的特征字符串s,若s出现在S中,特征向量相应的维度设置为1,否则为0。

2.4 模型选择

本文尝试选用SVM、逻辑回归、朴素贝叶斯、决策树等几种常见的机器学习算法进行模型构建、训练以及分类检测对比实验。

3 实验环境和过程

3.1 实验环境

硬件环境:inter i5 8500 8 核3.0 GHz 处理器,8 GB DDR4 内存,1TB 硬盘。

软件环境:Win10 64 位操作系统,JDK1.8,Weka3.8(Weka 是一款开源的,基于Java 环境的机器学习和数据挖掘工具),Python 3.7,Scikit-learn 机器学习库。

3.2 实验过程

1)获取数据集。

实验选用Drebin 项目公开的数据集,Drebin 收集了2010 年8 月至2012 年10 月期间公开的大量App样本,最终数据集中包含123 453 个良性应用、5 560个恶意应用,并提取了8 类静态特征。

2)数据预处理。

由于Drebin 项目中良性应用和恶意应用的比例相差过大,恶意应用只占良性应用不到5%的比例,造成样本类别分布偏差过大,本文使用Scikit-learn 库提供的随机方法 train_test_split(),抽取良性应用的1/10,即12 345 个良性应用和全部的5 560 个恶意应用,组成17 905 个样本的数据集。

划分训练集和测试集:随后按照66%和34%的比例划分训练集和测试集,最终的训练集包含10 234样本,测试集包含6 088 样本。

3)特征工程。

从训练集10 234 样本中,共提取100 234 个特征,组成100 235 维的特征向量,最后一维为标记位。由于特征向量过于稀疏,会占用大量加载和训练时间。实验中采用Weka 平台提供的weka.filters.unsupervised.instance.SparseToNonSparse 工具转存为非稀疏特征向量,并存储为arff 格式文件。

特征选择:由于100 235 维的特征向量过大,存在大量的冗余特征,为了加快模型训练收敛,缩短检测时间,采用Weka 平台提供的特征信息增益函数weka.attributeSelection.InfoGainAttributeEval 进行特征筛选,最终选择了权重排名前1 000 的特征组成特征向量。

4)模型评估。

本文实验利用Weka 平台提供的几种机器学习分类算法进行数据训练与模型测试,分别为线性SVM(weka.classifiers.functions.LibLINEAR)、逻辑回归(weka.classifiers.functions.Logistic)、朴素贝叶斯(weka.classifiers.bayes.NaiveBayes)、决策树(weka.classifiers.trees.J48)。为了保证分类结果的稳定性,实验采用十折交叉验证的方式进行模型训练,最终分类效果如表1 所示。

表1 1 000 维特征时模型分类效果评估表

从表1 可以看出,在使用相同数据集的情况下,选择1 000 维特征时,线性SVM(带有L2 正则化项的损失函数)算法取得了不错的分类效果:分类的整体准确率达到了96.4%,ROC 曲线面积为0.952,模型训练时间1.18 s,模型测试时间0.16 s。

在不进行特征选择,共100 234 维特征时,线性SVM 算法分类的整体准确率有了进一步的提高,达到了97.6%,ROC 曲线面积为0.971,模型训练时间2.89 s,不过模型测试时间增加到17.82 s。

从实验结果可以看出,以上4 种算法总体上准确率都达到了不错的效果,从而可以说明基于机器学习的Android 恶意软件检测方法的有效性。

4 结语

本文设计实现了一种基于机器学习的Android 恶意软件检测实验方法。实验中,通过分析、提取清单文件、Dex 文件的8 类关键特征,使学生对Android 系统、应用程序实现原理及运行机制有了更清晰的认识。通过抽象问题、数据获取、数据预处理、特征工程、模型训练、模型评估等一套完整的机器学习项目流程,使学生掌握了目前流行的机器学习方法,整体上提升了学生用机器学习方法分析和解决实际问题的能力。

猜你喜欢

组件机器特征
根据方程特征选解法
机器狗
无人机智能巡检在光伏电站组件诊断中的应用
离散型随机变量的分布列与数字特征
机器狗
新型碎边剪刀盘组件
U盾外壳组件注塑模具设计
不忠诚的四个特征
未来机器城
风起新一代光伏组件膜层:SSG纳米自清洁膜层