本文对自1947年以来的两百多篇文章进行了总结,详尽分类介绍了恶意软件的分析方法。
Android简介
Android是一个基于Linux内核的开源移动操作系统,主要为智能设备设计。Android系统的层次结构分为Linux内核层、库层、应用框架层和应用层。Linux内核层提供一些基本功能,如内存管理、进程管理和网络协议。这一层包含硬件组件的所有底层设备的核心驱动程序。库层提供核心库,包括原始库和第三方应用库,以辅助应用框架层。应用程序框架层相当于一个中间层,它智能地协调组件,从而增强了整个系统的灵活性。为了完成这项工作,应用程序框架包含许多系统服务,如活动管理器、窗口管理器、资源管理器、位置管理器、内容提供程序等等。应用层是唯一可以与用户交互的层,由运行在Android设备上的所有应用程序组成。
Android应用程序使用Java编程语言编写,使用Android软件开发工具包(SDK)提供的api。除了Java代码,应用程序还可能包含一些Android系统提供或由开发人员实现的本地库。与数据和资源一起编译的应用程序代码被打包到一个归档文件中,即所谓的Android应用程序包(APK)。在Android设备上安装APK之后,它将使用Android运行时环境运行。Android应用程序包含四个主要组件:活动、广播接收器、服务和内容提供商。Activity指定用户界面并处理与智能手机屏幕的用户交互。广播接收器处理操作系统和应用程序之间的通信。服务管理应用程序的后台处理来执行longrunning操作。内容提供商提供跨应用程序的数据共享。
开发人员在设计Android平台时引入了各种安全机制。Android系统具有层次结构,每一层都有自己的安全机制,即传统的访问控制机制、基于权限检查的机制、沙箱机制、数字签名机制和加密机制:
传统的访问控制机制相当于Android的Linux内核安全机制。访问控制限制主题(如用户或服务)访问对象(如资源)。它是保护数据机密性和完整性的主要方法。访问控制包括强制访问控制(MAC)和自主访问控制(DAC)两种方法。MAC由Linux安全模块实现。DAC是通过文件访问控制来实现的。
Android使用基于许可的安全模型来限制应用程序访问某些资源。如果应用程序想要使用受限制的资源,它们必须通过XML文件申请许可。在Android系统批准之前,应用程序不能使用受限资源。Android权限有四个级别,即正常、危险、签名和签名/系统。低级权限,包括正常和危险级别,在应用程序申请后立即进行授权。签名级别和签名/系统级别权限称为高级权限。在应用程序可以应用这些权限之前,它需要实现平台级的身份验证。然而,这一机制存在许多缺陷。用户需要决定应用的权限是否应该被授权,但是用户没有足够的知识来判断。
Sandbox用于分离Android系统中正在运行的应用程序。沙箱为应用程序提供了一组严格控制的资源。在Android应用程序的运行期间,每个应用程序运行在自己的Dalvik虚拟机中,拥有自己的进程空间和资源。因此,不同的应用程序不能相互交互,也不能访问彼此的资源和内存空间。
数字签名机制在应用层的安全中起着非常重要的作用。Android应用程序开发人员必须给他们的应用程序添加数字签名,因为没有数字签名的应用程序是不允许安装的。如果攻击者故意更改APK的内部文件,他必须退出app。直到攻击者获得原始发布者的私钥,他才会生成与原始签名一致的签名。此外,当应用程序需要更新时,应用程序的签名也会被检查。 数字签名保证了完整性。
Android系统可以支持加密机制,保护一些重要数据不被未经授权的用户或应用程序访问。Android系统在3.0及以上版本中实现了加密机制。由于用户越来越重视对隐私数据的保护,如手机事件、短信以及一些支付信息等,因此加密机制对Android系统的重要性越来越高。
论文筛选流程:
1)搜索方法
我们使用著名的文献搜索引擎和数据库来准备我们的调查。我们的目标是找到高质量和高相关性的参考论文,包括期刊文章和会议论文。所选的搜索引擎包括IEEE Explore、ACM Digital Library、施普林格、Elsevier和DBLP。这些期刊和会议与软件工程(包括软件测试和分析)、编程语言和系统、安全、移动计算和系统相关。
根据本次调查的主题,我们将重点放在文献检索的关键词上,如图。此外,我们还利用正则表达式和词性转换对其进行了扩展,以获得更多的关键字。
2)选择标准并不是所有基于搜索方法的候选论文都适合本文的研究范围。因此,我们使用以下的包含和排除标准来进一步筛选候选论文。答:包含标准如上图所示,有三个由关键字组成的域。本调查的主题涉及三个领域的交集。属于这三个领域交集的论文可以纳入我们的综述。
此外,我们排除了:1)论文关注的是Android以外的平台,如iOS, Windows Mobile, BlackBerry, Symbian。然而,包括Android在内的多个平台的论文也包括在内。2)论文只关注缓解安全威胁的技术,没有关注任何安全分析技术。这些技术试图通过不同的方法在应用程序级或Android平台级增强安全机制。3)论文对Android框架或应用程序进行了一次特定的攻击,没有描述检测技术或检测中使用的具体特性。4)论文侧重于app安全分析,没有提及任何类型的功能
3)选择的论文
我们首先通过检索的方法收集1947年的研究论文。根据这些论文的评选标准和评审结果,我们最终评选出236篇论文。我们对这些论文进行了一些统计分析,找出它们在出版场所的分布情况以及每年的流行趋势。图2和图3描述了每个期刊/会议中被选论文的分布情况,表明被选论文大多发表在顶级会议和期刊上。图4为2011 - 2019年每年的入选论文数量。为了获得更先进的评审结果,我们主要收集最新发表的论文。从图中可以看出,近年来关于Android应用安全分析的论文数量总体呈上升趋势。
table 2中的引文总结
静态特征:
权限:
为了保护用户的信息安全,Android使用基于许可的安全模型来限制应用程序访问用户的敏感信息。应用程序在安装之前会向用户提供请求的权限列表。在用户授予这些权限后,应用程序将自己安装到设备上。在Android系统中,有多种权限可以通过SDK文档查询。多个权限的组合可能反映出一些有害的行为。例如,如果应用程序申请网络连接权限和短信访问权限,应用程序可能会获取用户的短信信息,然后通过互联网传播出去。
Android权限是最常用也是最有效的静态特性。这是因为申请许可对于攻击者实现其恶意目标至关重要。虽然Java代码包含恶意方法的实现,但是一些API调用需要许可。例如,在发送短信之前,Android系统会检查相应的权限是否被授予。基于这样的场景,现有的工作在malapp检测中比其他静态特性更关注权限。
组件:
应用程序组件是Android应用程序的基本构件,是系统访问应用程序的入口点。每个组件作为不同的实体存在,并扮演特定的角色。这些组件由应用程序的清单文件AndroidManifest链接。描述每个组件及其交互方式的xml。Android应用程序中有四个主要组件:活动、服务、广播接收器和内容提供者。
活动指示用户界面(UI)并处理与智能手机屏幕的用户交互。如果一个应用程序有多个活动,那么其中一个应该标记为应用程序启动时显示的活动。服务管理应用程序的后台进程来执行longrunning操作。例如,一个服务可能在后台播放音乐,而用户在另一个应用程序中。广播接收器处理操作系统和应用程序之间的通信。例如,应用程序可以通过广播通知其他应用程序某些数据已被下载,并且可供它们使用。内容提供者解决数据和数据库管理问题。数据可以存储在文件系统、数据库或其他地方。在上述实体的构造中还使用了其他组件,如片段、视图、布局、资源、清单等。
过滤的intent:
Intent message通过发送Intent对象来处理相同或不同应用组件之间的通信。为了告知Android系统哪些intent可以被app组件接收,每个组件都有一个或多个intent过滤器。intent过滤器帮助应用程序组件拒绝不想要的intent,并留下想要的intent。它们在清单文件中进行了描述,并已用于malapp检测。
API:
API调用表示应用程序如何与Android框架交互。每个Android应用程序都需要API调用来与设备交互。因此一些工作使用API调用作为malapp检测的特性。捕获API调用和这些调用之间的依赖关系非常重要。这些信息可以通过静态分析和动态分析获得。
方法中的API调用有一定的顺序。这是一种攻击者为了绕过检测过程而改变API序列的策略,称为代码混淆。因此,一些工作认为API序列是应用程序检测错误的唯一特征。
API调用图还可以反映这些API调用之间的依赖关系。在API调用图中,每个节点代表一个API,每条边(f, g)表示过程f调用过程g。有些工作使用API调用图作为app的特征特征来检测malapp.
网络地址:
攻击者需要联系malapps报告他们的状态并向用户发送个人数据。因此,攻击者经常在恶意代码中添加服务器的网络地址,即命令与控制(C&C)服务器。在malapp检测中,有些工作是在app的安装文件中查找C&C服务器的网络地址或IP地址。
操作码:
opcode是Operation Code的缩写,是CPU可以执行的一条指令。应用程序中单个操作码或操作码序列的频率可以看作是malapp检测的特征。有些工作侧重于操作码,因为它们与应用程序代码密切相关。
硬件组件:
一个app需要多个硬件组件,使app s功能全面。在某种程度上,所要求的硬件组件的组合可以反映有害行为。例如,如果一个应用程序访问4G和GPS,这可能意味着它可以向攻击者报告用户的位置。
控制流图:
控制流图(CFG)是静态分析的基础。CFG是一种表示,使用图形表示法,表示在程序执行期间可能通过的所有路径。CFG中的每个节点都对应于方法中的一个基本块。基本块是没有任何跳转或跳转目标的直线代码段。跳转目标启动一个模块,然后跳转结束一个模块。有向边用于表示CFG中的跳转。代码可以是像JAVA那样的源代码,像SMALI那样的汇编代码,像arm指令那样的机器码,或者像DEX (Dalvik可执行文件)那样的字节码。对Java代码的控制流进行分析是一种代码模糊检测的方法。尽管攻击者可以更改API调用的顺序或重命名API调用来逃避检测,但是Java代码流不会改变。
控制流图(CFG)和函数调用图(CG)的区别:
都是表示程序控制流的有向图,但它们并没有包含的关系。
一个CG是表示整个程序中方法(函数)之间调用关系的图,图中的节点是方法,边表示调用关系。例如方法foo()调用了方法bar(),则CG中应有一条从foo()到bar()的有向边。
一个CFG是表示一个方法内的程序执行流的图,图中的节点是语句(指令),边表示执行流。例如语句A执行后的下一条语句是B,则CFG中应有一条从A到B的有向边。条件语句(if-else, while-do)之后可能执行的语句不止一个,可能执行true-branch或false-branch,所以CFG上条件语句节点的后缀会有多个,表示其后可能执行的不同branches。