探寻 Android 系统服务中的内部接口

前言

我们都知道Android应用程序依赖Binder IPC接口和系统服务通信来完成各种操作,使用系统的各项功能。因为system_server进程中的系统服务负责了Android中许多重要的活动,例如组件、权限等的管理等,所以在OEM实现它们自己的ROM的时候,多多少少会选择为系统服务定制一些供内部使用的接口,从而方便系统级应用或是特定应用实现它们本没有权限进行的一些操作。本文主要记录了不同厂商实现这类接口的偏好,并讨论一些潜在的风险。

厂商实现

华为/荣耀

华为和荣耀原本的代码是同源,所以在很多方面都是非常相似的,不过在分家之后也会各自添加一些不同的功能。

  • 原生扩展服务:除了直接在AOSP系统服务中增加新的AIDL接口,或通过onTransact实现一些裸接口之外,华为和荣耀的ROM中还喜欢在AOSP原生的系统服务中增加一个getHwInnerService接口,这个接口返回一个IBinder对象,而这其中又会包含更多的接口,其类名的特征为HwInnerXXXService或者HwXXXServiceEx
  • 自实现服务:华为和荣耀自己实现的系统服务也会包含丰富的功能,都是直接注册到servicemanager中的,服务名称一般包含hw,不过有些服务会通过system_app进行托管,而不是system_server。还存在一个com.huawei.systemserver的包,但是实际上这是一个system_app。

OPPO

  • 原生扩展服务:除了直接在AOSP系统服务中增加新的AIDL接口,OPPO还利用了Binder的一个原生接口getExtension()来实现对AOSP原生系统服务的扩展,该方法同样返回一个IBinder对象,显然这种实现方式比华为和荣耀的那种要更优雅一点。其类名的特征为OplusXXXServiceEnhance
  • 自实现服务:OPPO自己实现的系统服务也会包含丰富的功能,都是直接注册到servicemanager中的,服务名称一般以oplus开头。需要注意的是,在OPPO的system_server中存在很多所谓的Service,不过经过仔细分析便会发现他们并没有绑定到任何Binder服务。

vivo

  • 原生扩展服务:vivo自定义接口都是直接写到原生服务中的,再调用IVivoXXX,集中在com.android.server.VivoSystemServiceFactoryImpl里面创建,当然这个类里面不都是获取的Binder扩展服务,也有例如ActiveServices这种非Binder服务的,需要注意区分,类名形如:IVivoAms或者IVivoWms
  • 自实现服务:vivo自己实现的系统服务也会包含丰富的功能,在com.android.server.VivoSystemServiceFactoryImpl中的getVivoBinderService获取一个com.android.server.VivoBinderServiceImpl对象,实现IVivoBinderService,而com.android.server.VivoBinderServiceImpl中的服务注册代码位于addVivoBinderService函数(包括Java服务和Native服务)。在该函数中真正创建服务对象的代码位于com.vivo.services.ServiceFactoryImpl中的getXXXService,Native部分在com.android.server.VivoBinderServiceImplloadVivoServersLib中加载了/system/lib64/libvivo_servers.so。此外还有注册在zygote中的一部分的/system/lib64/libvivo_runtime.so,注册点位于com.android.internal.os.ZygoteInit

三星

  • 原生扩展服务:似乎并没有发现三星有很固定的扩展方式。
  • 自实现服务:三星包含很多自实现服务,服务名称一般包含sem,但是三星使用SELinux对它们进行了良好的隔离,所以整体攻击面就比较收敛。

小米

  • 原生扩展服务:小米一般通过原生服务的onTransact来扩展一些接口,这些接口的实现位于XXXServiceStub中,例如ActivityManagerServiceStub,而真正的实现则位于/system_ext/framework目录中,并属于另一个包com.miui.rom,虽然com.miui.rom这个包本身是system_app,但是由于system_server也会加载/system_ext/framework下的代码,所以它们实际上以system_server的权限运行。
  • 自实现服务:小米也包含很多自实现服务,不过并没有很仔细的进行研究过。

总结

本文总结了不同厂商实现自定义系统服务接口的偏好,这些接口的不正确或未鉴权实际上会导致信息泄露和越权操作等结果。经过浅度的研究,实际便可以发现一些简单的漏洞,可以获取到一些系统运行时的机密信息。然而即使这些接口执行了正确的权限校验,实际上也表明OEM开发的系统应用可以利用这些内部接口,一定程度上实现绕过Android SDK中的标准API去访问系统机密信息,甚至是用户敏感数据,且很难被任何照明弹机制记录或进行合规审查。在App隐私合规问题逐渐减少的今日,这类新的访问方式或许已经成为了用户隐私新的潜在威胁。