Определение политики SELinux для системной службы Android: как настроить?

Ранее я написал автономный демон для доступа к настраиваемому устройству (/ dev / mydev0). Глядя на исходный код AOSP, я решил, что мне нужны политики настройки в следующих файлах, чтобы заставить его работать:

новый файл device.te, содержащий:

type mydev_device, dev_type;

новый файл mydevsrvc.te, содержащий

# service flash_recovery in init.rc
type mydevsrvc_type, domain;
type mydevsrvc_type_exec, exec_type, file_type;

init_daemon_domain(mydevsrvc_type)

allow mydevsrvc_type mydev_device:chr_file rw_file_perms;

отредактировал file_contexts, чтобы добавить:

/dev/mydev[0-9]*    u:object_r:mydev_device:s0

отредактировал service_contexts, чтобы добавить:

mydevsrvc                  u:object_r:mydevsrvc_type:s0

И запустил демон, отредактировав init.flo.rc, включив в него следующие строки:

service mydevsrvc /system/bin/mydevsrvc
    class main
    user system
    group system
    seclabel u:r:mydevsrvc_type:s0
    oneshot

Теперь мне нужно получить доступ к устройству в приложениях для Android, поэтому я должен превратить демон в системную службу Android.

Я могу запустить службу (поток), используя намерение BOOT_COMPLETED, как описано в предыдущем вопросе

Я не могу понять, как настроить политики SELinux, чтобы эта java-служба также могла получить доступ к файлу dev.

[Обновление] Я продолжаю использовать для этой цели привилегированный демон. Моя java-служба подключается к демону через сокеты. У меня нет лучшего решения.


person GPS    schedule 18.11.2015    source источник
comment
Собственно, во время разработки политик для этого демона я понял, что компонент, запускающий процесс, должен настраивать домен процесса. Теперь я обнаружил, что init * .rc - это то место, где я могу настроить домен для демона. Мне не удалось найти, где настроить домен для службы Android на основе Java.   -  person GPS    schedule 18.11.2015
comment
Если кто-то смотрит на него, я решил оставить собственный демон запускаемым из init.rc и общаться с ним из моей непривилегированной java-службы через сокеты android для linux.   -  person GPS    schedule 05.04.2016
comment
Здесь у вас есть синтаксис для команды dervice в init.rc stackoverflow.com/questions/8905593/   -  person kkk_ddd    schedule 13.07.2017


Ответы (4)


Я наконец-то понял ответ. Опубликуйте его здесь, потому что наверняка найдутся такие новички SEPolicy, как я, ищущие похожие ответы.

Для этой работы мне нужно было иметь доступ к файлу устройства из моего java-приложения, которое реализует мою службу.

Мне нужно было добавить следующее правило в мой каталог sepolicy в новом файле:

allow system_app mydev_device:chr_file rw_file_perms;

Кроме того, необходимо, чтобы мое служебное приложение работало в system_app домене. Для этого мне необходимо:

  1. Установить в priv_app во время сборки Android.
  2. Подпишите его ключом платформы
  3. Объявите общий идентификатор пользователя в манифесте: android.uid.system. Я обнаружил, что без этого приложение работает в platform-app домене и не может получить доступ к файлу моего устройства даже при соответствующем изменении правила SEPolicy. Не знаю почему, но я не стал отлаживать.

Также возможно запустить мое служебное приложение в mydevsrvc_type домене. Я не знал, как это сделать и сработает ли это.

person GPS    schedule 12.01.2018

Вот краткое описание шагов, необходимых для реализации SELinux на вашем устройстве Android:

Добавьте поддержку SELinux в ядро ​​и конфигурацию. Предоставьте каждой службе (процессу или демону), запускаемой из инициализации, свой собственный домен. Определите эти службы следующим образом: Просмотрите файл init..rc и найдите все службы. Изучение предупреждений формы init: Внимание! Для имени службы необходимо определить домен SELinux; пожалуйста исправьте! в выводе dmesg. Проверка ps -Z | grep init, чтобы узнать, какие службы работают в домене init. Обозначьте все новые процессы, драйверы, сокеты и т. Д. Все объекты должны быть правильно помечены, чтобы гарантировать, что они правильно взаимодействуют с применяемыми вами политиками. См. Метки, используемые в AOSP, в качестве примеров для создания имени метки. Установите политики безопасности, которые полностью охватывают все ярлыки и ограничивают разрешения до их абсолютного минимума. В идеале OEM-производители начинают с политик в AOSP, а затем используют их для собственных настроек.

для получения дополнительной информации https://source.android.com/security/selinux/implement.html

person Suzan Mak A    schedule 18.11.2015
comment
Я видел этот текст, сэр. Я не мог понять, как запустить службу Android из init * .rc? Какие именно строки я могу добавить в init.rc для запуска моей службы. В качестве альтернативы, если я запускаю службу с помощью BOOT_COMPLETED, как мне отметить домен в этой службе? - person GPS; 18.11.2015
comment
@Suzan Mak A Я тоже хотел бы узнать больше =) - person HenriqueMS; 04.01.2018

Возможно, добавьте строку в свой файл ueventd.rc или конкретный проект, чтобы дать разрешение

person kdgwill    schedule 04.01.2018

В ответ на ваш вопрос, чтобы запустить службу из init rc, вы можете просто написать один файл rc, как показано ниже. Где он запустит вашу службу при получении boot_completed

on property:sys.boot_completed=1
   start mydevsrvc

для справки http://androidxref.com/9.0.0_r3/xref/device/generic/qemu/init.ranchu.rc#60

person Nitin Rahoria    schedule 12.07.2021