SEPolicy для Android Native Binder клиент
Я новичок в мире Android
Я хочу знать, как установить SEPolicy для клиентской программы родного связующего (и что также установить..)
Я использую ссылку поставщика связующего (vndservicemanager) из Использование Binde-IPC
И я добавляю несколько файлов для требуемой SEPolicy
Теперь у меня есть два встроенных исполняемых файла - my_binder_service и my_client
оба они находятся в / vendor / bin /
my_binder_service запускается во время загрузки, и это добавит сервис к поставщику servicemanager
my_client - это программа, которая использует binder IPC для выполнения некоторой функции из my_binder_service
Вот мои настройки в init.rc
service my_binder_service /vendor/bin/my_binder_service
class main
class oneshot
class console
seclabel u:r:my_binder_service:s0
Что у меня так далеко:
- my_binder_service успешно запущен во время загрузки
- Это может добавить сервис вендор servicemanager
- my_client хорошо работает в разрешающем режиме
Все вышеперечисленное проверяется в принудительном режиме с помощью команды ps -AZ и vndservice list
Однако my_client сталкивается с ошибкой сегментации в принудительном режиме
Я проверяю отклоненное сообщение
dmesg | grep avc | grep my_
logcat | grep avc: | grep my_
Но я не нашел ни одного сообщения ни в разрешающем, ни в принудительном режиме
Я также проверяю контекст этих 2 запущенных процессов с помощью ps -AZ:
u:r:my_binder_service:s0 <- for my_binder_service
u:r:su:s0 <- for my_client
Я обнаружил, что контекст процесса не установлен правильно для my_client
И я думаю, что это может быть проблема my_client в принудительном режиме
Я думаю, что my_binder_service установлен правильно из-за команды seclabel в файле init.rc
Но я не знаю, где установить контекст процесса для my_client
Вот содержимое my_client.te (my_binder_service.te похож на это)
type my_client, domain;
type my_client_exec, exec_type, file_type, vendor_file_type;
init_daemon_domain(my_client)
allow my_client my_client_exec:file entrypoint;
allow my_client serial_device:chr_file { read write };
vndbinder_use(my_client);
binder_call(my_client, my_binder_service);
и контекст файла указан в файле file_context
/vendor/bin/my_binder_service u:object_r:my_binder_service_exec:s0
/vendor/bin/my_client u:object_r:my_client_exec:s0
Чего не хватает в части SEPolicy?
Или это не проблема SEPolicy?
1 ответ
Я нашел решение своего вопроса несколько часов спустя..
Оказалось, что это не связано с SEPolicy клиентской программы
Во-первых, я обнаружил, что список vndservice не выводит my_binder_service в принудительном режиме, я перепутал результат с разрешающим режимом.
Затем я снова проверяю СОП в Использовании Binder IPC, чтобы увидеть, пропустил ли я что-нибудь.
И на самом деле! Я скучал по многим вещам...
Вот все изменения, которые я сделал
# In vndservice_contexts
my_binder_service u:object_r:my_binder_service:s0
Я думал seclabel в init.rc работает, но оказалось, что эта строка еще нужна
# In my_binder_service.te
type my_binder_service, domain, vndservice_manager_type;
allow my_binder_service self:service_manager add;
vndservice_manager_type добавлен, а правило разрешения добавлено на основе logcat | grep avc: результат и команда aud2allow
Единственное изменение, которое я сделал в my_client.te, - это удаление в нем init_domain_daemon()
Поскольку я нахожу это необоснованным после проверки файла te_macros
И наконец, все работает в принудительном режиме
За исключением того, что контекст процесса для my_client по-прежнему su вместо my_client, что, я думаю, может не иметь отношения к этой проблеме.
Может быть, единственное, что имеет значение для IPC между клиентом и сервером, это следующие строки
binder_call(my_client, my_binder_service);
binder_call(my_binder_service, my_client);