android8.1:如何向ServiceManager注册供应商服务

时间:2018-04-20 02:21:03

标签: android selinux

对于android8.1,SELinux权限更严格。它只允许在plat_service_contexts中定义的服务注册到ServiceManager,我们之前有一个注册到ServiceManager的供应商服务,现在调用defaultServiceManager() - > addService时会返回错误,如下所示。

错误: 04-12 18:07:13.764 268 268 E SELinux:avc:拒绝{add} for service = media.stream pid = 649 uid = 1013 scontext = u:r:np_mediastream:s0 tcontext = u:object_r:default_android_service:s0 tclass = service_manager permissive = 0

如果我在/ device下添加这个允许sepolicy,将无法构建domain.te中定义的下面的neverallow规则。

允许np_streammedia default_android_service:service_manager add;

规则: neverallow * default_android_service:service_manager add;

那么如何将自己的供应商服务注册到ServiceManager?

似乎谷歌的文档中有一些解决方案,但我无法理解。 https://source.android.com/security/selinux/images/SELinux_Treble.pdf

4 个答案:

答案 0 :(得分:0)

  

是..,对于android 8.0 Oreo及以上版本,清单和静态接收器中不允许注册接收器。需要从STICKY服务动态实施和运行时,需要从清单和接收static receiver的{​​{1}}启动该服务。再次,如果你发布你的代码,可能是我或其他人将能够帮助... !!请上传代码..

答案 1 :(得分:0)

您应该定义自己的服务类型:

1,定义 http://androidxref.com/8.1.0_r33/xref/device/google/marlin/sepolicy/service.te

Author

2,添加允许策略 http://androidxref.com/8.1.0_r33/xref/device/google/marlin/sepolicy/qcneservice.te

public IEnumerable<Book> Books => MyItems.OfType<Book>.Where(b => b.Authors.Contains(this));

3,标签服务 http://androidxref.com/8.1.0_r33/xref/device/google/marlin/sepolicy/private/service_contexts

type cne_service,                 service_manager_type;

答案 2 :(得分:0)

从Android 8.1开始的SE Linux权限:直接转到“ / system / sepolicy”

在“ public / service.te”文件中声明新的类型“ my_service”:

type my_service, system_api_service,  service_manager_type;

在service_contexts(“ private / service_contexts”)文件中,服务标记如下:

com.android.sampservice.ISampService      u:object_r:my_service:s0

添加以下规则:(在public / servicemanager.te中)

allow system_app my_service:service_manager add;

在android 8.1中,google添加了一种称为通用中间语言(CIL)的新政策语言。
要添加系统服务,您需要: 在文件系统/sepolicy/private/compat/26.0/26.0.cil中:添加

(typeattributeset my_service_26_0 (my_service))

在/system/sepolicy/prebuild/api/26.0/nonplat_sepolicy.cil文件中:添加

(typeattribute my_service_26_0)       
(roletype object_r my_service_26_0)

并将my_service添加到nonplat_sepolicy.cil文件中的行:Add

(typeattributeset service_manager_type (audioserver_service_26_0 , ... , my_service_26_0)

此处是解释如何添加系统服务的链接。 https://devarea.com/aosp-creating-a-system-service/#.XPA50ohKhPZ

答案 3 :(得分:0)

问题不在于SELinux规则发生了变化,而是Treble引入了Binder上下文的新分离:

  1. 框架(/dev/binder
    仅用于框架服务和应用之间的通信。
  2. 供应商(/dev/vndbinder
    仅用于供应商服务之间的通信。
  3. 硬件(/dev/hwbinder
    允许此上下文打破供应商到框架的壁垒。但是使用了一种经过改进的界面语言HIDL

您需要执行的操作取决于您的服务正在尝试执行的操作。

  • 如果您想为应用提供自定义的AIDL界面,则必须将服务设为“框架扩展”。
  • 如果您希望两个供应商服务彼此通信,则必须在进行任何Binder调用之前通过添加此命令来切换为使用供应商上下文。
ProcessState::initWithDriver("/dev/vndbinder");
  • 如果要将数据从供应商服务传递到框架服务或应用程序,则必须将服务拆分为通过HIDL提供/dev/hwbinder界面的供应商服务和一个连接到该界面,并通过AIDL提供一个/dev/binder界面。