EveDroid:Event-Aware Android Malware Detection Against Model Degrading for IoT Devices

EveDroid: Event-Aware Android Malware Detection Against Model Degrading for IoT Devices

2019 IEEE Internet of Things Journal

Intro

良性和恶性程序都可能调用同一API使得基于API的模型效果大打折扣

  1. 本文提出一种新的应用程序表示方法:事件组(event group),它捕捉不同事件中使用的API调用类型,然后将这些事件组合起来引入更高层次的语义
  2. EveDroid将不同事件中的每一组API调用根据它们的组成转换为它们所属的类别。我们将API调用的每一组类别称为函数集群(function cluster)。通过这样做,当一个新的API在系统更新中发布并被应用程序使用时,我们仍然可以通过将这个API调用分区到某个类别来捕获它。
  3. 我们还设计了一个特殊的神经网络(NN)来提取事件函数簇之间的关系。通过标签,我们将样本事件组中的每个函数簇输入到神经网络中,并将不同网络的输出串联在一起,由一个隐藏层进一步处理。最后,采用softmax分类器进行预测。利用训练好的神经网络,我们可以为任何未知样本建立事件组,并将其输入到训练好的网络中,以确定样本是否是恶意的。

本文是基于静态技术-调用图的

Related Work

DroidMiner:通过字节码分析API

MaMaDroid:基于马尔科夫链构建一个API调用序列的行为模型(待阅读

HinDroid:将Android应用程序、相关api及其丰富的关系表示为一个结构化的异构信息网络,然后使用基于元路径的方法来描述应用程序和api的语义相关性。

全都直接使用API,不好,无语义,无通用性

本文采用NLP技术来泛化API调用,并将API函数绑定到事件,使系统对模型降级更加健壮。

System Design

1

提取调用图

通过FlowDroid对Android应用程序和Java程序的数据流进行分析,提取样本的调用图

建立事件组

  1. 遍历事件子图

    目标是获取不同事件的API调用,以便我们可以知道应用程序在这些事件中做什么。

    【重要】一个事件$e_i$就是树上的一条到叶子结点的路径(包含子路径)

    (使用Google官方的API;参数为空用none代替)

    首先要找到这个应用程序的所有入口点(生命周期回调、GUI事件和系统事件处理程序)。应用程序可以从这些入口点中的任何一个触发,因此调用图的任何路径都可以在实际情况下执行。

    (设计缓存需要重复遍历的路径,节省内存)

  2. API调用编码

    编码所有的单个API

    在获取事件中的API调用之后,首先我们需要根据每个API调用的组成将其编码为一个向量

    我们将每个API调用划分为一系列单词,包括包名、返回类型、方法名和参数列表,因为这些单词包含API功能的信息。

    使用doc2vec将文字序列转换成矢量(doc2vec是基于段落向量分布式存储模型(PV-DM)的思想,它将一个词序列映射成一个固定长度的特征空间向量,在特征空间中具有相似意义的句子彼此靠近。)

    比如对于一个API CALL java.io.FileReader:int read(char[])就可以将其变成序列java,io,FileReader,int,read,char[]

    通过将每个API调用通过其全部组合转换为一个向量,而不是简单地将其抽象为一个包或一个族,我们可以比MaMaDroid保留更多关于其功能的语义,从而使我们的系统更适合恶意软件的演化和API的更改。

  3. API调用聚类

    对编码后的API向量进行k-means聚类,假定$k$簇,每个API被映射到一个类(簇)中。

    使用$k$个类,每个类的调用频率组成一个向量,$p_{i,j}$表示第$j$类在事件$e_i$中出现的频率,则定义事件簇(Function Clusters)

    【重要】这个事件簇,就相当于将调用图上的一条路径通过API类的概率组成的向量表示了

    事件组(Event Group)就可以由所有事件簇表示:

    一个应用程序就由一个事件组表示

    总结:先将各个API分到大类,再根据调用图用大类构建事件簇向量,再由所有事件簇向量(就表征了整个调用树)构成事件组向量,事件组即表示APK:$APIs\to p_{i,j}\to e_i\to E_g$

训练神经网络

0

NN由几层组成:输入层,事件层,连接层,隐藏层和softmax层。输入是每个事件的功能集群,然后使用多个事件层进行处理。在处理事件层之后,我们可以获得包含有关应用程序在不同事件中的行为方式的信息的功能。每个事件的事件层的所有输出将被连接到一个向量中,然后我们通过将不同的事件合并到隐藏层中来建立更高级别的语义。

具体的参数略,看原文

P.S.1我感觉这个算法用attention也许会有很好的效果?但不知道为什么作者没用,以后可以试一下

PS.2 调用图非常大,需要考虑内存开销

PS.3 EveDroid为静态分析方法,对于一些在动态加载的代码,那就不行哒,不过可以通过反射等机制来解决这个问题;而且也可以使用动态沙箱跑出的API序列来解决这个问题(直接动态分析)