Добавление службы поставщика в ServiceManager с архитектурой Android Treble [политика SELinux]

Примечание. Я новичок в политике SELinux и следую vndservicemanager от Android

У меня есть служба Java (MyService), которая запускается на приемнике BootComplete. Теперь я добавляю свой сервис в ServiceManager в onCreate MyService.java.

ServiceManager.addService(mysystemservice, mybinder);

Что касается архитектуры treble, я переместил свое приложение в раздел образа поставщика, добавив ниже в Android.mk приложения.

LOCAL_VENDOR_MODULE := true

Я внес следующие изменения в политику OEM SELinux, ранее она была написана для системной службы, так как я перенес приложение к поставщику, поэтому внес изменения в службу поставщика, предоставив как старую, так и текущую политику SE.

Создан контекст "my_service"

СТАРЫЙ

В private / service_contexts

mysystemservice u:object_r:my_service:s0

СЕЙЧАС

В vendor / common / vndservice_contexts

mysystemservice u:object_r:my_service:s0

Определенный тип услуги

СТАРЫЙ

В public / service.te

type my_service, service_manager_type;

СЕЙЧАС

В vendor / common / vndservice.te

type my_service, vndservice_manager_type;

Теперь даю разрешение на добавление

СТАРЫЙ

В public / servicemanager.te

allow system_app my_service:service_manager add;

СЕЙЧАС

В abc.te

type abc, domain;
type abc_exec, exec_type, vendor_file_type, file_type;

init_daemon_domain(abc)

vndbinder_use(abc)

binder_call(abc, system_app)

add_service(abc, my_service)

allow abc  my_service:service_manager  find;
allow abc  my_service:service_manager  add; 

После вышеуказанных изменений и полной сборки я вижу, что мой контекст службы является частью out / product / target / vendor / etc / selinux / vndservice_contexts..inplace of out / product / target / system.

Но как только Myservice.java попытается добавить "mysystemservice" в ServiceManager с помощью

ServiceManager.addService (mysystemservice, mybinder);

Я получаю сообщение об ошибке ** avc denied **

E / SELinux: avc: denied {add} for service = mysystemservice pid = 7588 uid = 1000 scontext = u: r: system_app: s0 tcontext = u: object_r: default_android_service: s0 tclass = service_manager permissive = 0 2019-11 -14 12: 44: 39.613 592-592 /? E / ServiceManager: add_service ('mysystemservice', b0) uid = 1000 - РАЗРЕШЕНИЕ ОТКАЗАНО

Как мы видим в журнале выше, Целевой контекст принимает значение по умолчанию "tcontext = u: object_r: default_android_service: s0" вместо "my_service"

Примечание. Если я сохраняю изменения для образа системы, все работает нормально, проблема только в том, что я передаю изменения политики SE поставщику.

Пожалуйста, дайте мне знать, если я что-то пропустил или есть другой способ добавить Сервис.


person Rishikesh pathak    schedule 02.12.2019    source источник
comment
Пожалуйста, проверьте, что audit2allow предлагает как разрешить добавление правила: source.android.com/security/ selinux / validate # using_audit2allow   -  person Simpl    schedule 04.12.2019
comment
Привет, попробовал, но audit2allow здесь не помогает, предлагается добавить default_android_service вместо my_service. Ниже приведен результат audit2allow: # ============= system_app ======== ====== разрешить system_app default_android_service: service_manager добавить;   -  person Rishikesh pathak    schedule 09.12.2019
comment
Убедитесь, что первая строка вашего vendor/common/vndservice_contexts содержит полный путь к двоичному файлу (например, /vendor/bin/mysystemservice).   -  person Simpl    schedule 09.12.2019
comment
Привет, такая же проблема наблюдается с предложенным изменением ... но я заметил одну вещь: я не вижу mysystemservice в расположении out / target / product / XYZ / vendor / bin. Это должно быть там?   -  person Rishikesh pathak    schedule 12.12.2019
comment
Местоположение зависит от того, что вы указали в своем Android.mk или Android.bp. Но да, я ожидал, что там будет находиться двоичный файл поставщика по умолчанию. Где твой mysystemservice?   -  person Simpl    schedule 13.12.2019
comment
mysystemservice находится в vendor / priv-app /   -  person Rishikesh pathak    schedule 13.12.2019


Ответы (1)


Одна проблема, которую я вижу, заключается в том, что вы используете abc.te, но вы не определили это в своем seapp_context внутри vendor/common/.

Вы должны определить что-то вроде ниже:

user=system
seinfo=platform
name=your.package.name
domain=adbc
type=system_app_data_file

После этого изменения avc ошибка будет указывать на abc домен приложения.

person Nitin Rahoria    schedule 22.02.2021