Примечание. Я новичок в политике 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"

< Сильный > OLD

В private / service_contexts

mysystemservice u:object_r:my_service:s0

< Сильный > NOW

В vendor / common / vndservice_contexts

mysystemservice u:object_r:my_service:s0

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

< Сильный > OLD

В public / service.te

type my_service, service_manager_type;

< Сильный > NOW

В vendor / common / vndservice.te

type my_service, vndservice_manager_type;

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

< Сильный > OLD

В public / servicemanager.te

allow system_app my_service:service_manager add;

< Сильный > NOW

В 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 из 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 поставщику.

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

3
Rishikesh pathak 2 Дек 2019 в 12:06
Проверьте, что предлагает audit2allow в качестве разрешающего правила для добавления: source.android. ru / security / selinux / validate # using_audit2allow
 – 
Simpl
4 Дек 2019 в 10:18
Привет, попробовал, но audit2allow здесь не помогает, предлагается добавить default_android_service вместо my_service. Ниже приведен результат audit2allow: # ============= system_app ==== ========== разрешить system_app default_android_service: service_manager добавить;
 – 
Rishikesh pathak
9 Дек 2019 в 09:13
Пожалуйста, проверьте, содержит ли первая строка в вашем vendor/common/vndservice_contexts полный путь к двоичному файлу (например, /vendor/bin/mysystemservice).
 – 
Simpl
9 Дек 2019 в 10:48
Привет, такая же проблема наблюдается с предложенным изменением ... но я заметил одну вещь: я не вижу «mysystemservice» в расположении «out / target / product / XYZ / vendor / bin». Это должно быть там?
 – 
Rishikesh pathak
12 Дек 2019 в 14:36
Местоположение зависит от того, что вы указали в своем Android.mk или Android.bp. Но да, я ожидал, что там будет находиться двоичный файл поставщика по умолчанию. Где твой mysystemservice?
 – 
Simpl
13 Дек 2019 в 10:39

1 ответ

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

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

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

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

0
allenski 23 Фев 2021 в 04:21