2021,57(12)近年来,互联网、物联网技术飞速发展,移动终端、智能工业设备等被广泛使用,万物互联正在逐步实现[1]。随之而来的问题也十分严重,针对智能设备的网络攻击正在危及物理世界的安全[2]。在移动终端设备中,用户常常受到垃圾信息、信息的侵害,面对病毒、木马导致的金钱损失[3]。在市场份额中,Android 系统占据主要成分,目前已运行在超过25亿活跃移动设备上[4]。因此,基于Android 系统的安全性研究是当前研究的热点问题,确保数据安全和私密性是Android 系统的首要任务[5]。
系统服务(System Service )是Android 系统的核心组成部分,指后台运行的应用程序或系统级进程,具有
较高的运行权限[6],也是恶意代码攻击的主要目标。系统服务漏洞是Android 漏洞的关键部分。利用系统服务漏洞,可对Android 系统设备实现多种攻击,其中包括利用PowerManager 服务存在的越权访问漏洞实现关机窃听、利用锁屏服务存在的管理漏洞绕过锁屏密码解锁设备、利用媒体服务中的整数溢出漏洞实现选线提升攻击来控制整个设备。
系统服务关键信息获取是Android 系统漏洞挖掘和安全评估的重要步骤。在系统服务漏洞挖掘过程中首先需要获取关键信息,如统计接口数量、分析日志获取服务名和函数接口名,以及测试的参数数值信息,进而对漏洞挖掘的过程进行跟踪和分析。当前系统服务关
Android 系统服务信息分层获取方法
郭芷含,罗森林,柯懂湘,秦枭喃
北京理工大学信息与电子学院,北京100081
要:获取Android 系统服务关键信息有利于实现对Android 系统的漏洞挖掘和安全评估。为解决当前系统服务
关键信息获取方法存在系统源码依赖度高、兼容性差导致的信息获取不全面的问题,提出一种Android 系统服务信息分层获取方法。该方法通过在Android 系统的应用层、框架层和内核层分别建立完整的Binder 通信行为监控视图,解析服务依赖关系、服务进程信息与接口参数规范,在不依赖源码的前提下实现系统服务关键信息的自动化获取。在多个Android 设备中进行系统服务关键信息获取实验,结果表明该方法能全面地获取多项系统服务关键信息,具备更强的实用性。
关键词:Android ;系统服务;关键信息获取;binder 文献标志码:A
中图分类号:TP 393.08
doi :10.3778/j.issn.1002-8331.2003-0426
Hierarchical Acquisition Method of Android System Service Information
GUO Zhihan,LUO Senlin,KE Dongxiang,QIN Xiaonan
School of Information and Electronics,Beijing Institute of Technology,Beijing 100081,China
Abstract :Obtaining key information of the Android system services is beneficial to realize the vulnerability mining and security evaluation of the Android system.In order to solve the problem of high system source dependency and poor com-patibility on current incomplete system service key information acquisition methods,this paper proposes a hierarchical acquisition method of Android system service information.This method establishes a complete Binder communication behavior monitoring view at the application layer,framework layer and kernel layer of the Android system and then ana-lyzes service dependency,service process information and interface parameter specifications to gain system service key infor-mation automatically without relying on source code.The experiments of acquiring system service key information are performed on multiple Android devices,and the results show that this method can acquire multiple system service key information comprehensively and has stronger practicability.
Key words :Android;system service;key information acquisition;binder
作者简介:郭芷含(1999—),女,主要研究领域为网络安全、信息安全;罗森林(1968—),男,博士,教授,主要研究领域为信息安
全、数据挖掘、文本安全,E-mail :***************** ;柯懂湘(1994—),男,硕士研究生,主要研究领域为信息安全;秦枭喃(1996—),男,硕士研究生,主要研究领域为机器学习、数据挖掘。
收稿日期:2020-03-28
修回日期:2020-06-15
文章编号:1002-8331(2021)12-0099-06
Computer Engineering and Applications 计算机工程与应用
99
Computer Engineering and Applications计算机工程与应用2021,57(12)
键信息获取已广泛应用于漏洞挖掘。例如,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通信数据所获取的系统服务关键信息进行分析,实现自动且高兼容性的获取。
2Android系统服务信息分层获取方法原理2.1算法模型
针对系统服务关键信息获取不全面的问题,本文提出了系统服务关键信息的分层获取方法。该方法主要分为两个核心模块:多层次Binder监控模块和关键信息解析模块。针对系统服务关键信息的自动化获取,构建完整的三层Binder通信行为监控模块,拦截系统服务注册过程获取系统服务进程信息,实现应用层的序列化记录、框架层的服务注册记录和内核层的通信数据记录。针对接口参数规范、服务依赖关系和服务进程信息的信息获取不全的问题,构建关键信息解析模块,分析系统服务通信过程中获取到的服务依赖关系和接口参数规范,如图1所示。
100
2021,57(12)2.2多层次Binder 监控模块多层次Binder 监控模块监控发生在系统不同层次的Binder 行为,分别在系统的应用层、框架层和内核层构建序列化子模块、服务注册监控子模块和数据传输监控子模块。相对其他已有方法,HAA 方法在不需要修改源码的同时,拓宽了监控的范围,获取完整的Binder 通信数据和通信行为记录,并且有效克服其他方法仅能够实现单层动态信息获取和兼容性差的问题。
多层次Binder 监控模块以Android 系统中的Binder 通信机制为基础实现对数据流的监控。为将Java 层和Native 层的Binder 建立通信,该监控模块依据Native 层Binder 是Java 层Binder 映像的特点,在Java 层的JavaB-Binder 和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 IPC-Thread 类的transact 方法,监控并记录应用的Binder 通信数据传输行为,如表1所示。
2.3关键信息解析模块
关键信息解析模块,是从多层次Binder 监控模块获
取的复杂信息中,解析出规范化且可使用的信息。而多层次数据的数据类型不一致、不同服务间获取方式不一致将导致关键信息解析困难。此模块将构建3个子模块,分别用于解析接口参数规范、解析服务依赖关系和解析服务进程信息。相较于其他方法仅能实现服务依赖解析,HAA 方法极大扩展了关键信息
的解析范围。
2.3.1参数规范获取
应用程序跨进程调用系统服务接口的参数需要先经过序列化操作,再通过Binder 传输。其中,序列化操作将数据变为可存储、可通过Binder 传输的状态。在Android 系统中,使用Parcel 容器保存序列化的数据。通过监控应用程序调用系统服务接口时对参数进行的序列化操作,可以获得系统服务接口参数信息。根据序列化数据类型,可将序列化操作分为两种,HAA 方法针对下述两类序列化操作进行拦截。
对于基本类型、基本类型数组、泛型容器等类型数据,Pracel 对象提供和数据类型对应的序列化操作接口实现对该类型的序列化。基本类型如Integer 型数据Parcel 提供writeInt 接口实现序列化操作;基本类型数组如int[]数组型数据,Parcel 提供writeInt 接口实现序列化操作;泛型容器如List 容器型数据,Parcel 提供writeIn-tArray 接口实现序列化操作。本方法通过Hook Parcel 对象提供的序列化接口监控这类数据类型的序列化操作,如表2所示。
对于实现了Parcelable 接口的对象,系统通过调用对象自身的writeToParcel 方法实现序列化操作,HAA 方法对这一类对象序列化的拦截记录,操作步骤如下:
(1)注入到待监控的服务调用进程。
(2)在进程中遍历每个被ClassLoader 加载的类,
图1HAA 方法原理框图
系统层次
应用层
框架层
内核层
日志条目Date
Package Method Parcel Date
Service Uid Date Package Handle
Code Data Reply Flag
说明
序列化操作时间
执行序列化操作的完整应用名称具体执行序列化操作的函数保存序列化操作数据的容器指针值服务注册时间注册的服务名称服务进程ID 数据传输操作时间
执行传输操作的完整应用名称系统服务代理对象Handle 值所调用的系统服务接口编号值所需传输的Parcel 对象指针返回值保存的Parcle 对象通信模式
表1
日志条目说明
数据类型基本类型基本类型数组Bundle 类型Binder 类型FileDescriptor 类型容器类型
Hook 函数
writeInt 、writeString 、writeByte 等writeIntArray 、writeStringArray 等writeBundle writeStrongBinder writeFileDescriptor
writeList 、writeMap 、writeArray 等
表2
Hook 函数列表
郭芷含,等:Android 系统服务信息分层获取方法
101
Computer Engineering and Applications 计算机工程与应用
2021,57(12)询每个类是否含有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 ,uin
t16_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.2实验环境和条件
实验环境分为两部分,如表4所示。(1)多层次Binder 通信监控模块部署环境
分别在Android 模拟器、Nexus6P 和SamsungS4
图2sip_session 匿名服务获取原理图
应用类别通讯类媒体类地图类办公类工具类
来源GooglePlay GooglePlay GooglePlay GooglePlay 系统集成
应用的名称
WeChat 、Messenger 、Line 、Skype VLC 、MX Player 、PlayMusic 、
Spotify 、TikTok Google Map 、高德地图Docx Reader 、PDFReader 、DropBox 、
HTC Corporation Calculator 、Calendar 、Camera 、
Browser 、Contact
表3
系统服务信息获取全面性实验测试样本列表
102
2021,57(12)
三台测试设备中部署Binder通信监控模块获取系统服务通信数据。
(2)关键信息解析模块部署环境
在Dell390台式机中做监控数据分析工作,用于运行信息解析程序,分析归纳监控数据获取系统服务关键信息。
3.3评价方法
评价指标包括获取的系统服务总数N、已正确解析函数规范的服务接口总数I、已正确获取服务依赖关系的匿名服务总数N c和已正确获取进程信息的服务总数N p率。其上述评价方法的计算公式如下:
N=N i+N n+N a(1)
I=I i+I n+I a(2)其中,N i、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依次启动每个测试样本,每个测试样本运行时长为5min,导出监控数据,并通过运行关键信息解析程序,自动化分析监控数据;(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和匿名服务总数N a上获取的更多的信息。由于Gu无法实现AIDL文件、Chiz-purfle依赖Java层的反射特性和BadIntent仅监控单一层次Binder导致这三类方法的N n值为0,都无法获取到实名服务信息,而HAA在三个测试环境下的N n值分别为13、33和39,且与对比方法相比在Android模拟器和Nexus6P测试环境中具有更高的N a值,分别为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正确获取服务依赖关系的匿名服务总数N c分别为19、31和17,大于对比方法的N c值,表明该
硬件
Dell390台式机Android模式器Nexus6P SamsungS4
系统
Windows7
原生Android8.0
原生Android7.1.2
定制Android5.0.1
说明
Binder监控数据分析环境
BCM监控模块部署环境
BCM监控模块部署环境
BCM监控模块部署环境
表4实验环境配置
系统环境配置
Android模拟器
(系统版本8.0)
Nexus6P
(系统版本7.1.2)
GalaxyS4
(系统版本5.0.1)
信息获取方法
Gu
Chizpurfle
BadIntent
HAA
Gu
Chizpurfle
BadIntent
HAA
Gu
Chizpurfle
BadIntent
HAA
N i
82
82
82
82
95
95
95
95
73
112
112
112
android软件
N n
13
33
39
N a
16
16
19
23
23
31
8
17
17
N
98
82
98
114
118
95
118
159
81
112
129
168
I i
2562
2562
2562
2562
2179
2179
2179
2179
1586
3331
3331
3331
I n
101
158
195
I a
185
170
185
338
338
412
92
285
342
I
2732
2562
2732
2848
2751
2179
2517
2749
1678
3331
3616
3868
N c
16
16
19
23
23
31
8
17
17
N p
98
82
98
114
118
95
118
159
81
112
129
168表5多环境配置下系统服务信息获取全面性结果
郭芷含,等:Android系统服务信息分层获取方法
103

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。