APP下载

Android系统服务信息分层获取方法

2021-06-23郭芷含罗森林柯懂湘秦枭喃

计算机工程与应用 2021年12期
关键词:序列化进程关键

郭芷含,罗森林,柯懂湘,秦枭喃

北京理工大学 信息与电子学院,北京100081

近年来,互联网、物联网技术飞速发展,移动终端、智能工业设备等被广泛使用,万物互联正在逐步实现[1]。随之而来的问题也十分严重,针对智能设备的网络攻击正在危及物理世界的安全[2]。在移动终端设备中,用户常常受到垃圾信息、诈骗信息的侵害,面对病毒、木马导致的金钱损失[3]。在市场份额中,Android系统占据主要成分,目前已运行在超过25亿活跃移动设备上[4]。因此,基于Android系统的安全性研究是当前研究的热点问题,确保数据安全和私密性是Android系统的首要任务[5]。

系统服务(System Service)是Android系统的核心组成部分,指后台运行的应用程序或系统级进程,具有较高的运行权限[6],也是恶意代码攻击的主要目标。系统服务漏洞是Android漏洞的关键部分。利用系统服务漏洞,可对Android系统设备实现多种攻击,其中包括利用PowerManager服务存在的越权访问漏洞实现关机窃听、利用锁屏服务存在的管理漏洞绕过锁屏密码解锁设备、利用媒体服务中的整数溢出漏洞实现选线提升攻击来控制整个设备。

系统服务关键信息获取是Android系统漏洞挖掘和安全评估的重要步骤。在系统服务漏洞挖掘过程中首先需要获取关键信息,如统计接口数量、分析日志获取服务名和函数接口名,以及测试的参数数值信息,进而对漏洞挖掘的过程进行跟踪和分析。当前系统服务关键信息获取已广泛应用于漏洞挖掘。例如,Long等通过分析包括API和强制清单权限的Android框架,提出了一种基于机器学习的模型[7],检测针对不同Android版本的隐形恶意软件;Jung等通过提取许可请求、API调用和运行时行为的信息,提出了一种Android恶意软件检测的新方法[8],防止Android恶意软件的传播并保护隐私信息免遭破坏。目前常用的系统服务关键信息获取方法主要有人工信息获取方法和自动化信息获取方法。人工信息获取方法需要人工阅读代码,获取信息量少。在自动化信息获取方法中,基于源码解析的方法对系统源码的依赖程度高,无法获取闭源服务信息;基于Java反射的方法无法获取Native层信息;基于Binder通信监控的方法在系统兼容性上存在缺陷。因此,目前已有的Android系统服务关键信息获取方法存在获取信息不全面的缺点。

本文针对系统服务模糊测试过程中系统服务关键信息获取不全面的问题,提出了Android系统服务信息分层获取方法(A Hierarchical Acquisition Method of Android System Service Information,HAA)。利用该方法对系统服务的跨进程通信数据进行统计分析,能够有效防护Android系统、拦截恶意行为、识别恶意软件和诊断系统服务异常等。实验结果表明,该方法可以全面获取系统服务接口参数规范、系统服务依赖信息和系统服务进程信息,在保障Android系统安全方面行之有效。

1 相关工作

目前提出的Android系统服务关键信息获取方法主要分为两类:人工信息获取方法和自动化信息获取方法。其中,根据实现原理差异,可将自动化获取方法分为基于源码解析方法[9]、基于Java反射方法[10]和基于Binder通信监控方法[11]。

基于人工分析的系统服务关键信息获取方法是通过人工阅读代码、调试分析等方法获取服务依赖关系、服务接口参数信息和服务进程信息。该方法自动化程度低,难以应对大量系统服务信息的获取。

基于源码解析的信息获取方法是通过自动化解析服务源码中的AIDL文件获取服务接口参数规范。Gu等人提出的Android系统服务漏洞挖掘方法[12],通过解析AIDL文件获取服务接口参数规范。上述方法对系统源码依赖程度高,无法获取闭源服务信息。并且静态分析源码的方法无法获取服务进程信息,也无法解析源码获取服务依赖信息,由于Native层没有实现AIDL文件,所以无法获取Native层服务接口参数规范。

基于Java反射的信息获取方法主要用于系统服务接口参数规范的获取。调用ServiceManager对象的getService方法获取框架层的服务,利用反射技术获取服务接口的函数签名,并解析签名信息,以获取服务接口参数信息。利用Java反射技术获取接口参数规范,如Iannillo等提出的Chizpurfle[13]。该方法实现简单且不依赖源码,可有效获取Java层服务接口参数规范。但其获取信息不全面:只能获取Java层系统服务接口的参数规范,无法获取Native层服务接口参数规范;也不能获取服务进程信息和服务依赖信息。

基于Binder通信监控的系统服务关键信息获取方法,主要用于系统服务动态信息的获取,监控分析Binder通信数据获取系统服务的关键信息。作为系统服务架构实现的基础,系统服务与其他进程的通信数据经由Binder传输,完成系统服务关键信息的获取。该方法在Android安全防护领域用途广泛,例如恶意行为拦截和恶意软件识别。根据Binder驱动监控的实现方式,可将其分为修改系统源码方式和动态插桩、函数Hook方式。系统源码方式通过修改系统源码,构建包含Binder监控模块的Android虚拟环境,监控分析Binder通信数据,获取系统服务动态信息,如Tam等人提出的CopperDroid[14]。这一类方法的优点是能够有效获取系统服务的动态信息,但只能用于虚拟设备,在实际Android设备中无效。第二类方法通过构建动态插桩和Hook函数为核心的机制以监控Binder驱动,监控分析Binder通信数据,获取系统服务动态信息,如Yoon等人提出的AppScope[15]。这类方法只关注部分系统服务动态信息,并且只针对Java层的Binder通信进行监控,忽略了Native层的Binder通信过程,因此服务信息获取不够全面。

针对上述方法存在的自动化程度低、获取信息不全面和对实际Android设备无效的缺陷,本文提出一种Android系统服务信息分层获取方法(HAA)。该方法通过Binder通信劫持技术,在系统中构建完整的Binder通信行为监控视图,并对不同层次Binder通信数据所获取的系统服务关键信息进行分析,实现自动且高兼容性的获取。

2 Android系统服务信息分层获取方法原理

2.1 算法模型

针对系统服务关键信息获取不全面的问题,本文提出了系统服务关键信息的分层获取方法。该方法主要分为两个核心模块:多层次Binder监控模块和关键信息解析模块。针对系统服务关键信息的自动化获取,构建完整的三层Binder通信行为监控模块,拦截系统服务注册过程获取系统服务进程信息,实现应用层的序列化记录、框架层的服务注册记录和内核层的通信数据记录。针对接口参数规范、服务依赖关系和服务进程信息的信息获取不全的问题,构建关键信息解析模块,分析系统服务通信过程中获取到的服务依赖关系和接口参数规范,如图1所示。

图1 HAA方法原理框图

2.2 多层次Binder监控模块

多层次Binder监控模块监控发生在系统不同层次的Binder行为,分别在系统的应用层、框架层和内核层构建序列化子模块、服务注册监控子模块和数据传输监控子模块。相对其他已有方法,HAA方法在不需要修改源码的同时,拓宽了监控的范围,获取完整的Binder通信数据和通信行为记录,并且有效克服其他方法仅能够实现单层动态信息获取和兼容性差的问题。

多层次Binder监控模块以Android系统中的Binder通信机制为基础实现对数据流的监控。为将Java层和Native层的Binder建立通信,该监控模块依据Native层Binder是Java层Binder映像的特点,在Java层的JavaBBinder和Native层的BBinder上建立Binder通信机制,构建了Java层到Native层的通道。在Java层与Native层的通信时,Java层通过JNI(Java Native Interface)实现对Native层的调用,分为注册JNI、注册服务和获取服务三个阶段。在Native层与Java层进行Binder通信时,Native层通过JNI实现对Java层的反调用,调用过程分为获取对象、获取属性及方法、构造对象。在系统中的应用层、框架层和内核层构建序列化子模块以获取数据。

在应用层,通过Hook libbinder.so动态库中的序列化方法监控并记录应用的序列化操作。在框架层,通过Hook ServiceManager进程的svc_can_register函数,实现系统服务注册过程监控。在内核层,通过Hook IPCThread类的transact方法,监控并记录应用的Binder通信数据传输行为,如表1所示。

表1 日志条目说明

2.3 关键信息解析模块

关键信息解析模块,是从多层次Binder监控模块获取的复杂信息中,解析出规范化且可使用的信息。而多层次数据的数据类型不一致、不同服务间获取方式不一致将导致关键信息解析困难。此模块将构建3个子模块,分别用于解析接口参数规范、解析服务依赖关系和解析服务进程信息。相较于其他方法仅能实现服务依赖解析,HAA方法极大扩展了关键信息的解析范围。

2.3.1 参数规范获取

应用程序跨进程调用系统服务接口的参数需要先经过序列化操作,再通过Binder传输。其中,序列化操作将数据变为可存储、可通过Binder传输的状态。在Android系统中,使用Parcel容器保存序列化的数据。通过监控应用程序调用系统服务接口时对参数进行的序列化操作,可以获得系统服务接口参数信息。根据序列化数据类型,可将序列化操作分为两种,HAA方法针对下述两类序列化操作进行拦截。

对于基本类型、基本类型数组、泛型容器等类型数据,Pracel对象提供和数据类型对应的序列化操作接口实现对该类型的序列化。基本类型如Integer型数据Parcel提供writeInt接口实现序列化操作;基本类型数组如int[]数组型数据,Parcel提供writeInt接口实现序列化操作;泛型容器如List容器型数据,Parcel提供writeIntArray接口实现序列化操作。本方法通过Hook Parcel对象提供的序列化接口监控这类数据类型的序列化操作,如表2所示。

表2 Hook函数列表

对于实现了Parcelable接口的对象,系统通过调用对象自身的writeToParcel方法实现序列化操作,HAA方法对这一类对象序列化的拦截记录,操作步骤如下:

(1)注入到待监控的服务调用进程。

(2)在进程中遍历每个被ClassLoader加载的类,查询每个类是否含有writeToParcel方法,并检查参数类型确定其是否继承自Parcelable接口。

(3)对每个Hook函数找到的继承自Parcelable接口的writeToParcel方法,在调用writeParcel方法时记录写入的Parcel对象和写入的类型。

HAA方法监控系统服务调用时每一次序列化操作与数据传输的过程,通过查询表1中Parcel字和Data字段匹配的记录,可获取对应接口的参数规范。

2.3.2 服务依赖解析

根据获取方式不同,可将Android系统服务分为实名服务和匿名服务。实名服务通过ServiceManager索引,依据服务名称获取。匿名服务只能调用其所依赖的实名服务的特定接口来创建。针对匿名服务的模糊测试要根据服务依赖关系获取匿名服务。

以sip_session匿名服务为例介绍匿名服务的获取方式,如图2所示。

具体步骤如下:

(1)客户端通过ServiceManager获取SipManager服务,然后通过调用SipManager服务的CreateSession接口创建SipSession服务。

(2)调用readStrongBinder函数,从SipManager服务的返回数据中解析出SipSession服务引用,再利用该引用调用SipSession服务的相关接口。

HAA方法获取匿名服务依赖关系的具体步骤如下:

(1)监控Binder驱动,获取实名服务返回的Binder通信数据。

(2)通过Hook Pracel对象的readStrongBinder函数,从通信数据中提取所有匿名Binder引用,并保存其来源,获取匿名服务所依赖的系统服务。

(3)当后续通过该匿名Binder与匿名服务通信时,从通信数据中提取该匿名服务的名称,并保存匿名服务名称和该匿名服务所依赖的实名服务。

2.3.3 进程信息获取

Android系统服务量大,且运行在系统的不同进程中,为了监控系统服务运行状态,需要获取服务进程信息。当启动实名服务时,需要在ServiceManager服务处注册才能提供服务。其中匿名服务和其所依赖的实名服务处于同一进程。通过拦截实名服务的注册过程,可以获得系统服务进程信息。HAA方法选取ServiceManager的svc_can_register函数监控。svc_can_register函数原型为Int svc_can_register(ubsigneD uid,uint16_t*name)。

svc_can_register函数的参数uid表示服务所在进程ID,参数name表示服务名称,系统中的实名服务向ServiceManager注册时,ServiceManager会调用该函数来处理注册信息。通过Hook函数记录每次注册的服务进程ID与服务名称。

HAA方法在开始监控实名服务注册过程之前,存在部分实名服务已经注册完成的情况,无法获取此类服务的进程信息。为解决该问题,HAA方法先终止Zygote进程,再获取服务进程信息。HAA方法可获得所有服务的进程信息。

3 实验分析

3.1 目的和数据源

为验证HAA方法的有效性,本实验在多个Android系统设备中进行系统服务关键信息获取实验。测试设备包括实体机和模拟器2种类型,测试设备系统包括原生系统和设备制造商定制系统2种类型。从GooglePlay选取15种应用作为测试样本生成系统服务通信数据,测试应用覆盖主要应用类别,如表3所示。最后与Chizpurfle[13]所使用的基于Java反射的关键信息获取方法、Gu[12]所使用的基于源码解析的关键信息获取方法、BadIntent[16]所使用的基于Binder监控的关键信息获取方法进行对比分析实验。

表3 系统服务信息获取全面性实验测试样本列表

3.2 实验环境和条件

实验环境分为两部分,如表4所示。

(1)多层次Binder通信监控模块部署环境

分别在Android模拟器、Nexus6P和SamsungS4这三台测试设备中部署Binder通信监控模块获取系统服务通信数据。

图2 sip_session匿名服务获取原理图

表4 实验环境配置

(2)关键信息解析模块部署环境

在Dell 390台式机中做监控数据分析工作,用于运行信息解析程序,分析归纳监控数据获取系统服务关键信息。

3.3 评价方法

评价指标包括获取的系统服务总数N、已正确解析函数规范的服务接口总数I、已正确获取服务依赖关系的匿名服务总数Nc和已正确获取进程信息的服务总数N p率。其上述评价方法的计算公式如下:

其中,Ni、N n和N a分别为实验方法所获取的Java层实名服务总数、Native层实名服务总数和Native层匿名服务总数;I i、I n和I a分别为已正确解析参数规范的Java层实名服务接口总数、Native层实名服务接口总数和Native层匿名服务接口总数。

3.4 实验过程及参数

实验过程的步骤如下:(1)在测试机器中部署自动化测试工具Monkey;(2)在测试机器中安装所有测试样本及HAA方法系统服务关键信息获取框架;(3)在测试机器中运行HAA方法,使用Monkey依次启动每个测试样本,每个测试样本运行时长为5 min,导出监控数据,并通过运行关键信息解析程序,自动化分析监控数据;(4)统计分析系统服务关键信息的获取结果,根据公式(1)、(2)计算N和I,并记录HAA方法信息获取实验结果;(5)使用Gu等人提出的Android系统服务漏洞挖掘方法[12]、Chizpurfle[13]和Badlntent[16]的关键信息获取方法替换步骤(2)中的HAA方法,重新安排所有测试样本,消除之前执行样本带来的干扰,重复步骤(3)和(4)。

3.5 实验结果和相关方法比较

表5分别为Android模拟器(系统版本8.0)、Nexus6P(系统版本7.1.2)设备和GalaxyS4(系统版本5.0.1)设备中所获取信息的实验结果。

由表5的实验结果可知:

(1)在系统服务数量上,HAA方法在Android模拟器、Nexus6p和GalaxyS4三个测试环境上的N值分别为114、159和168,高于其他三类方法,这是由于该方法在Native层实名服务总数N n和匿名服务总数Na上获取的更多的信息。由于Gu无法实现AIDL文件、Chizpurfle依赖Java层的反射特性和BadIntent仅监控单一层次Binder导致这三类方法的N n值为0,都无法获取到实名服务信息,而HAA在三个测试环境下的N n值分别为13、33和39,且与对比方法相比在Android模拟器和Nexus6P测试环境中具有更高的Na值,分别为19和31,表明该方法能有效提高系统服务信息的获取数量。这是由于HAA在Native层的BpBinder与BBinder上建立通信机制,构建了Java层到Native层通道,从而实现全面有效地获取服务关键信息。

(2)在系统接口数量上,依据Native层的Binder是Java层Binder的映像的特点,HAA方法利用Java映射,有效联合Java层和Native层以提取关键信息,有效提高了I n值。在三个测试平台上,I n值分别为101、158和195,解决了其他三类方法无法获取Native层实名服务接口总数的问题。HAA在三个平台的I a值分别为185、412和342,均高于Chizpurfle和BadIntent方法,且在Nexus6P和GalaxyS4两个测试平台上高于Gu方法的I a值338和92,因此HAA方法能全面有效地获取服务接口信息。

(3)HAA正确获取服务依赖关系的匿名服务总数Nc分别为19、31和17,大于对比方法的Nc值,表明该方法能够实现匿名服务依赖解析,获取正确的匿名服务接口总数。在正确获取进程信息的服务总数N p上,HAA分别为114、159和168,大于其他对比方法的N p值,这是由于HAA将Native层的BBinder对象和Java层的JavaBBinder对象关联起来,通过监控服务注册过程,准确无误获取服务进程信息。

表5 多环境配置下系统服务信息获取全面性结果

综上,HAA方法在Android模拟器(系统版本8.0)、Nexus6P(系统版本7.1.2)和GalaxyS4(系统版本5.0.1)三个测试平台的N值、I值、N c值和N p值都高于其他三类方法,表明该方法能全面地获取Java层的系统服务接口参数规范、Native层的接口参数规范、系统匿名服务依赖信息和系统服务进程信息,能够在多个不同Android平台上全面有效地获取系统服务信息,具有高兼容性。

4 结束语

本文分析了现有的Android系统服务关键信息获取方法的原理和优缺点,发现现有方法的兼容性、信息获取全面性和自动化获取能力方面存在不足,同时提出一种Android系统服务信息分层获取方法。通过在Android系统的应用层、框架层和内核层分别构建完整的Binder通信行为监控模块,拦截系统服务注册过程获取系统服务进程信息,分析系统服务业务通信过程获取服务依赖信息与接口参数规范,实现系统服务关键信息的自动化获取。最后在覆盖实体和虚拟、定制系统和原生系统的3个Android设备中进行了系统服务关键信息获取实验,并与其他方法进行对比分析。结果表明,Android系统服务信息分层获取方法能有效地获取系统服务接口参数规范、系统服务依赖信息和系统服务进程信息,信息获取全面,实现了系统服务关键信息获取过程的自动化和高兼容性。

猜你喜欢

序列化进程关键
硝酸甘油,用对是关键
高考考好是关键
如何建构序列化阅读教学
债券市场对外开放的进程与展望
改革开放进程中的国际收支统计
Java反序列化漏洞探析及其修复方法研究
Java 反序列化漏洞研究
作文训练微格化、序列化初探
社会进程中的新闻学探寻
生意无大小,关键是怎么做?