针对安卓系统位置信息服务的权限提升攻击

摘 要:Android 平台的安全问题越来越引起关注,尽管权限机制、隔离机制、应用签名等方式被用来保护平台的安全性,但是这种以应用开发者为中心、依托用户完成的粗粒度授权和访问控制机制存在诸多缺陷,导致系统安全性大大降低,容易受到权限提升攻击。针对这种攻击,现有的解决方案主要集中在加强中间层的防护措施,意味着攻击者如果能够跨越中间层,直接在应用层和内核层之间进行通信,则可以绕开 Android 系统中间软层的若干安全机制,实现对应用层的权限提升攻击。为了验证这种设想,论文提出了一种针对Android系统位置信息服务的权限提升攻击方案,通过编写可以在普通应用进程中运行的且可替代 Android 位置信息服务原生库的动态链接库,使得应用层请求只要调用该动态链接库就可以在没有权限的情况下绕过Android 权限机制到达底层,并获得位置信息数据,实验结果表明此方案可以实现权限提升,证实了现有Android 平台安全机制的不足。

关键词:Android; 访问控制; 安全机制; 权限提升攻击

中图分类号: TP302 文献标识码:A

A Privilege Escalation Attack Scheme Against Android Location Information Service

Wang Qing 1 Yuan Jun 2 Shen Jia-hui 2 Mu Nan 2

(1.China Information Technology Security Evaluation Center Beijing 100085;2. Institute of Information Engineering, Chinese Academy of Sciences Beijing 100093)Abstract With the continuous extension of application fields, the security problem of Android platform ismore and more obvious. Although adopting the authority mechanism, isolating mechanism and applicationof signature, there are still lots of drawbacks in Android coarse-grained authorization and access controlmechanism, which is developer-oriented and is based on users. This results in greatly lower securityand being vulnerable to privilege escalation attack in application layer. For this type of attack, existingsolutions are mainly concentrated on strengthening the security protection in the middleware. If thecommunication can be carried out between application layer and kernel layer directly, then privilegeescalation attack can obtain success as bypassing those security mechanisms in the middle layer. In thispaper, we proposes a privilege escalation attack scheme against Android Location Information service.we built a Dynamic Link Library, which can be run in common application process, to replace the nativelibrary. Through calling the Dynamic Link Library, requests in the application layer can bypass theAndroid access mechanism to reach the bottom and gain the location information data. The experimentalresults show that this scheme can realize elevated privileges, confirmed the shortage of the existingAndroid platform security mechanism.

Key words android; access control; security mechanism; privilege escalation attack

1 引言

自2009年谷歌正式发布安卓(Android)系统第一版至今,Android出现已经是第九个年头了,其凭借开放平台的特征带来了大量的市场占有率,根据StatCounter监测机构公布的最新数据,2017年3月,使用Android系统的用户占比达37.93% [1] ,其使用量首次超过Windows系统,成为全球最常使用的操作系统。随着使用量的增加,其安全性也受到了越来越多的关注。腾讯安全实验室发布的2016手机安全报告也指出,手机遭遇安全危害的Android系统用户占比37.2%,位居第一 [2] ,CVE Details公布的2016年报告显示,存在安全漏洞最多的软件产品是Android系统,共计为523处 [3] 。以上数据表明Android系统安全隐患不容忽视。

Android系统主要存在于移动通信中,目前用户对计算机安全认知程度非常高,而对移动通信的认知很低,甚至不少用户还没有意识到移动通信端存在安全问题。如手机上存储着隐私性的移动通信用户个人信息,恶意操作多以资费消耗、隐私窃取和系统破坏为主,有时还通过自动联网、自动拨号和自动发送短信注册服务,使用户蒙受经济损失。另外,在用户不知情的情况下获取用户通讯录、地理位置及信用卡等敏感数据,会造成不可估量的损失 [4] 。所以,对移动通信安全性的有效检测和评估,来提高安全性至关重要。

Android系统存在如此严重安全隐患的主要原因就是,它是一种权限分离的操作系统,即一个应用程序想实现功能,就必须获取相应的系统权限。权限获取后,程序在后台对权限的调用就可能会涉及到通信簿、短信、位置信息等各种隐私 [5] 。Android系统同时有多个应用在运行,多个应用也设置了对应的访问权限,应用之间可以互相访问,就出现了权限扩展导致的提权漏洞。正是这个漏洞的存在,有些没有特定API访问权限的应用可以通过对第三方应用的访问,间接实现某些超越自身权限的功能,这就是权限提升攻击,这种攻击具体可以分为混淆代理人攻击(Confused DeputyAttack)和共谋攻击(Collusion Attack) [6-8] 。混淆代理人攻击是指恶意程序利用其它程序的未保护接口来间接获得特权功能,普遍存在于 Android缺省程序(如电话、闹钟、音乐和设置程序)以及第三方程序中。共谋攻击是应用层权限提升攻击的另外一种方式:恶意程序可以通过共谋来合并权限,从而执行超出各自特权的动作。Davi L等人[9] 实现了一个短信劫持的混淆代理人攻击。文献 [10] 利用两个分别具有录音和网络权限的应用,实现了应用间权限提升共谋攻击。

针对Android 系统的安全采取的措施层出不穷,根据应用于系统位置的不同划分为三类,分别是内核层保护、中间层保护(系统库和运行环境、应用框架)和应用层保护。Android系统内核是Linux 内核,安全增强工作普遍基于安全模块LSM( Linux Security Module)实现。SELinuxon Android[11] 关注内核层的权限提升攻击,SEAndroid使得 SELinux 在 Android 上的实现成为可能。TrustDroid [12] 提出了Android 软件栈中不同层域孤立问题的解决方法,其依赖 Linux 文件权限机制来执行内核层的孤立。中间层通过应用层权限管理、运行时动态权限检测等机制对抗应用层权限提升攻击。例如IPC Inspection [13] 将被调用者的有效权限减少为调用者与被调用者权限的交集;Quire [14] 跟踪IPC 的调用链来减少权限,并提出一种轻量级的签名方案,通过创造签名语句来抵抗混淆代理人攻击。Apex[15] 是一个政策执行Framework,运行用户在安装时选择的同意权限并且对APP运行时的行为强加限制。应用层应用程序的静态分析是Android系统应用层的主要权限保护机制,用于识别 Android 应用程序是否申请多余权限或提供未保护的开放特权接口等安全缺陷。

上述安全机制只关注各层对权限的分别保护,忽略了层间的配合,对上下文不敏感。这也为应用层权限提升攻击提供了可乘之机。经过深入调研发现Android系统的安全机制存在几个缺陷:以用户为中心,依托用户完成授权工作,极大地降低了系统的安全性;解决方案过度依赖于中间层,如静态分析很多成果依赖于Android权限机制,该机制是在中间层中实现的。

解决方案的不足导致存在这样一种情况,即如果一种攻击方法可以直接穿透中间层到达底层,则可以绕过安卓中间层的安全方案和所有层的权限管理机制。基于此种假设,为验证Android仍然存在安全漏洞,本文提出了一种针对Android系统位置信息服务的权限提升攻击方案,通过编写可以在普通应用进程中运行的且可替代 Android位置信息服务原生库的动态链接库,使得应用层请求只要调用该动态链接库就可以在没有权限的情况下绕过 Android 权限机制到达底层,并获得位置信息数据。

2 攻击方案

2.1 Android定位服务流程

Android 系统拥有位置信息服务,定位方法包括四种,分别是GPS定位、WiFi定位、基站定位、AGPS定位。Android 位置信息服务的调用流程分析如下。LocationManager为整个定位服务的入口类。在LocationManager.java (位于:frameworksbaselocationjavaandroid location)中可以看到,LocationManager类中所有功能的实现都依赖于一个名为mService的字段来实现,这个字段的类型是ILocationManager。ILocationManager由LocationManagerService实现。

定位服务的真正实现类是LocationManagerS e r v i c e , 该 类 位 于 f r a m e w o r k s b a s e s e r v i c e s j a v a c o m a n d r o i d s e r v e r L o c a t i o n M a n a g e r S e r v i c e . j a v a 中 。LocationManagerService.java的另外一个作用就是对申请使用位置信息的应用进行权限检查。本文提出的攻击所需要绕过的第一个访问控制便在此处。

实际上,在移动设备上可真正用于定位服务的通常只有两种实现方法:一种是通过GPS模块,一种是通过网络。网络定位是通过代理方式来完成的,但代理在运行时可以进行动态替换,具有一定的不确定性[16] 。相反,GPS模块的定位实现是确定的,是可以参考的[17] 。所以,本文通过GPS模块来完成定位的实现类:GpsLocation-Provider(位于:frameworksbaseservicesjavacomandroidserverlocationGpsLocationProvider.java)。

经过分析可知,当硬件检测到位置更新后,最初调用的是GPS LocationProvider.cpp中的location_callback函数,消息通知的流程。

(1)location_callback函数中对应的是调用GpsLocationProvider.java中的reportLocation方法。

( 2 ) G P S L o c a t i o n P r o v i d e r. j a v a 中的 r e p o r t L o c a t i o n 方 法 会 调 用 I L o c a t i o n -Manager的report Location方法,然后是调用LocationManagerService的reportLocation方法。(

3 ) L o c a t i o n M a n a g e r S e r v i c e 的reportLocation方法中会对LocationWorkerHandler发 送 消 息 M E S S A G E _ L O C A T I O N _CHANGED。该消息在LocationWorkerHandler的 h a n d l e M e s s a g e 方 法 中 被 处 理 。 处 理 方法 中 会 调 用 L o c a t i o n P r o v i d e r I n t e r f a c e 的updateLocation方法和LocationManagerService的handleLocationChangedLocked的方法。前者对于Gps模块来说就是调用GpsLocationProvider的updateLocation方法。

(4)GPS LocationProvider的updateLocation方法会对ProviderHandler发送消息UPDATE_LOCATION,该消息在ProviderHandler的h a n d l e r 方 法 中 被 处 理 , 处 理 的 方 法 是 调 用handleUpdateLocation方法,该方法中会调用native_inject_location方法以注入。

(5)而LocationManagerService的handleLocation Changed Locked的方法会将最新的位置存放到mLastKnownLocation中。至此,便可以通过Location-ManagerService的getLastKnownLocation方法获取到最新更新的位置信息了。

2.2 Android定位服务流程

根据对Android GPS正常调用流程的分析发现,应用程序的权限在Framework层的Java代码部分检查,但Android GPS数据的获取可以完全由原生方法实现。即在Android的原生方法实现的源文件GPS LocationProvider。

CPP中能够实现对GPS设备的初始化、调用获取数据和数据的更新与传递。于是本文开发一个native_GpsTest.cpp实现GPS LocationProvider.cpp中的功能,编译为malicious.so作为应用程序自带的动态链接库替代libandroid_servers.so。这样攻击程序只需要在本进程中调用malicious.so就可以实现对底层设备的调用,从而可以绕过Framework层的权限检查。

基 于 此 思 路 编 写 的 攻 击 程 序 不 需 要 在AndroidManifest.xml中显示声明GPS相关权限, Android系统也不能通过权限检查机制来限制其攻击行为。这样就可以将该程序在用户完全不知情的情况下安装进入用户手机,并窃取其GPS数据。

本 文 编 写 了 N a t i v e G p s Te s t 以 实 现 G P SLocation Provider.cpp的功能,并作为应用程序的自带原生库安装进入手机。(1)隐藏在攻击程序正常功能中,在程序运行过程中会自动调用NativeGpsTest,自动发起攻击。(2)NativeGpsTest会使用的dlopen函数先调用libhardware.so中Hal 层入口函数get_module_t获得gps.XXXX.so路径并调用初始化接口。(3)编写的回调函数GPS Callback结构体作为init函数的参数。通过gps.xxxx.so调用Linux 内核层中设备驱动打开设备并启动数据接收线程,获得GPS数据后,返回至nativeGpsTest。

2.3 攻击实现方案

为成功调用Android底层数据,攻击程序的编写参照了GPS LocationProvider.cpp,结构上与GPS LocationProvider.cpp源代码完全相同,功能上也可以完全替代源代码。

GPS LocationProvider.cpp源码主要由两部分组成,一个是实现其功能的普通函数,另一个是回调函数。普通函数的编写替换可以直接参照源码。回调函数必须自行编写并对源码进行替换。回调函数主要通过调用上层Java方法来实现数据、命令等在两层间的传递,由于本文设计的攻击直接穿过Framework层,所有的功能完全使用原生方法实现,因此不需要向上层传递信息,即不需要调用上层Java方法,只需编写空的回调函数即可。但名为create_thread_callback作为关键回调函数需要特殊处理,它的主要功能是调用系统函数createJavaThread来创建线程,是整个GPS LocationProvider.cpp中唯一一个需要Java代码来实现的功能,需要通过使用Dlopen来调用createJavaThread函数

3 攻击方案验证

3.1 模拟器实验

本文的源码分析在Android虚拟机的各个版本上都进行了实验,以Android 4.1.2系统为例说明。方案将攻击程序运行在Android虚拟机上,然后利用eclipse Emulator control模拟生成GPS数据,以此来模拟现实的GPS数据接收。攻击程序获得GPS数据成功之后便通过Log向控制台输出获得的结果,并与模拟生成的GPS数据进行比较。实验结果是我们的攻击程序在各个版本的Android虚拟机上都取得了成功。

3.2 真机实验

模拟器实验成功后,按照模拟器上相同的流程继续在Galaxy Nexus和Nexus_s_4g手机,Android 4.1.2系统上进行真实试验。但是真机上的实验却并没有取得预料的结果,如图5。从输出的Log信息可以看出攻击程序按照方案设想已经成功穿透中间软层进入到了硬件抽象层,但是在调用硬件抽象层中的实现库gps.XXXX.so时,出现了错误。很可惜的是在遇到的问题没有办法通过源码来分析。因为程序失败的代码位于gps.xxxx.so中,而该部分代码除了高通公司较早的开源版本外,其余完全不开源。只能通过分析程序调试中输出的Log信息来分析报错原因。

通过输出信息可以看到我们遇到的问题主要分为两类,一类是硬件启动失败,另一类是权限不足。Galaxy Nexus中的实验结果显示,设备启动失败总是在GPS数据接收线程开启之前,且线程可以开启成功。Nexus_s_4g的实验结果显示,设备可以成功启动,但是在线程间通信过程中存在权限问题。

3.3 实验验证

在Android的Linux内核层,内核检查进程的uid、gid以判断进程是否拥有相应设备的调用权限。Android系统中所有硬件设备默认为系统进程SystemServer的资源,Android应用程序只能通过System Server才能调用它们。因此判断,虽然成功的穿透了Android中间层及其权限机制,但是Android系统内核层的访问控制和Android系统的隔离机制仍然存在。这是使得无法在真机上攻击成功的原因。于是本文进行了以下的尝试性方案。

本文尝试利用Android系统提供的进程间共享数据的机制来调用底层设备。使用一台Root过的手机,修改系统文件datasystempackages.x m l 中 攻 击 程 序 的 相 关 字 段 。 将 攻 击 程 序 的sharedUserID更改为1000 — SystemServer的UID;攻击程序的证书修改为图6:

这 样 就 可 以 强 行 将 攻 击 程 序 加 入 S y s t e mGroup,这使得攻击程序可以调用System Server进程的文件,拥有调用硬件设备的权限。实验结果通过授予攻击程序相应的权限,但是仍然未能成功的获得Gps数据,且输出的Log信息并没有改变。

4 结束语

本文以 Android 4.1.2版本的源码为基础,对 Android平台进行了系统分析,对于 Android位置信息服务提出了权限提升攻击方案,该方案主要利用了 Android位置信息服务的两个特点:一是 Android位置信息服务的cc++代码可以在不依赖上层Java代码的情况下实现所有功能,但是权限检测的功能却是在上层Java代码中实现的;二是Android系统运行应用程序调用系统库(如libhardware.so)并且没有任何的安全检查。

利用以上两点,本文编写的攻击程序,通过直接调用 Android系统库实现Android位置信息服务系统的功能,从而在不需要通过System Server进程的情况下在本进程内直接穿过中间层,打破Android系统的层次结构,实现权限提升攻击,验证了系统此类安全漏洞的存在。由于时间和精力等原因,攻击并没有做到尽善尽美,这里提出一些可以改进的方向,这也将是后续主要工作。

(1)针对真机上的攻击不成功的原因的分析,进行更多的实验和更广泛的调研,以期查明原因。

(2)Android位置信息服务并不只限于GPS定位这一种方式,其他的定位方式也可以进行攻击尝试,目前已经展开对于基于基站的定位方式的分析。

(3)攻击方法很可能并不只限于Android位置信息服务者一种情况,将尝试将攻击方法推广到Android平台下的其他敏感资源中。

……
关注读览天下微信, 100万篇深度好文, 等你来看……
阅读完整内容请先登录:
帐户:
密码: