android8.1: Как зарегистрировать сервис поставщика в ServiceManager

для android8.1 разрешение SELinux более строгое. Он позволяет регистрироваться в ServiceManager только службам, определенным в plat_service_contexts, у нас есть служба поставщика, которая ранее была зарегистрирована в ServiceManager, теперь она будет возвращать ошибку при вызове defaultServiceManager () -> addService, как показано ниже.

ошибка: 04-12 18: 07: 13.764 268 268 E SELinux: avc: denied {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, не удастся создать для правила neverallow, определенного в domain.te, ниже.

разрешить np_streammedia default_android_service: service_manager add;

правило: не разрешено * default_android_service: service_manager add;

Итак, как зарегистрировать сервис собственного поставщика в ServiceManager?

Кажется, что в документе Google есть некоторые решения, но я плохо понимаю. https://source.android.com/security/selinux/images/SELinux_Treble.pdf


person Nancy.Zhang    schedule 20.04.2018    source источник


Ответы (4)


Проблема не столько в том, что правила SELinux изменились, сколько в том, что Treble представил новое разделение контекстов Binder:

  1. Framework (/dev/binder). Только для связи между службами платформы и приложениями.
  2. Поставщик (/dev/vndbinder)
    Только для связи между услугами поставщика.
  3. Аппаратное обеспечение (/dev/hwbinder). Этому контексту разрешено преодолевать барьер между поставщиком и платформой. Но с сильно улучшенным языком интерфейса под названием HIDL.

Что вам нужно сделать, зависит от того, что пытается сделать ваша служба.

  • Если вы хотите предоставить приложениям пользовательский AIDL интерфейс, вы должны сделать свою службу «Расширением платформы».
  • Если вы хотите, чтобы две службы вашего поставщика взаимодействовали друг с другом, вам необходимо переключиться на использование контекста поставщика, добавив эту команду перед выполнением каких-либо вызовов Binder.
ProcessState::initWithDriver("/dev/vndbinder");
  • Если вы хотите доставить данные из службы поставщика в службу платформы или приложение, вам необходимо разделить службу на службу поставщика, которая предоставляет HIDL интерфейс через /dev/hwbinder, и службу инфраструктуры, которая подключается к этому интерфейсу и предлагает интерфейс AIDL через /dev/binder .
person Simpl    schedule 12.07.2019

Разрешения SE Linux начиная с Android 8.1: перейдите в директорию "/ system / sepolicy".

Объявите новый тип my_service в файле public / service.te:

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 добавил новый язык политики, называемый Common Intermediate Language (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: Добавить

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

Вот ссылка, чтобы объяснить, как добавить системную службу. https://devarea.com/aosp-creating-a-system-service/#.XPA50ohKhPZ

person Prasanth.NVS    schedule 05.06.2019

Да .. Для Android 8.0 Oreo и выше регистрация приемников не разрешена в манифестных и статических приемниках. Требуется динамическая реализация и среда выполнения из службы STICKY, и необходимо запустить эту службу из манифеста и static receiver, который получает BOOT_COMPLETED. Опять же, если вы разместите свой код, может быть, я или кто-то еще смогу помочь ... !! Загрузите код ..

person sandhya sasane    schedule 20.04.2018
comment
MyMediaService * MyMediaService :: instantiate () {MyMediaService * mss = MyMediaService :: GetInstance (); defaultServiceManager () - ›addService (String16 (media.stream), mss); вернуть mss; } Спасибо за ответ, но я регистрирую эту службу в собственном процессе демона, а не в java-процессе. Это будет отклонено android при вызове defaultServiceManager () - ›addService. - person Nancy.Zhang; 23.04.2018

Вы должны определить свой собственный тип сервиса:

1, определите http://androidxref.com/8.1.0_r33/xref/device/google/marlin/sepolicy/service.te

type cne_service,                 service_manager_type;

2, добавьте разрешающую политику http://androidxref.com/8.1.0_r33/xref/device/google/marlin/sepolicy/qcneservice.te

add_service(qcneservice, cne_service)

3, пометьте службу http://androidxref.com/8.1.0_r33/xref/device/google/marlin/sepolicy/private/service_contexts

cneservice    u:object_r:cne_service:s0
person Yong    schedule 18.02.2019