Предупреждение init: службе myservice требуется определенный домен SELinux. Пожалуйста исправьте

Я хочу извинить исполняемый файл при загрузке на целевой плате с Android 5.1, поэтому я добавляю это в init.rc:

on boot
    start myservice

service myservice /system/bin/myservice
    #class main
    user root
    group root
    #oneshot   

Я сделал работу по распаковке и перепаковке.
Однако после внесения изменений экран продолжает печатать:

 init warning: Service myservice needs a SELinux domain defined. Please fix.
 type=1400 ... avc:denied ... scontext ... tcontext ... #some annoying warning messages like this

SELinux кажется мне огромным проектом. Я просто хочу избежать этого. Я попробовал два подхода:

1. setenv kernelargs 'console=ttyS0,115200n8 rootdelay=1 selinux=0' and saveenv
2. set enforce 0

Для метода 1 printenv дает результат:

kernelargs=console=ttyS0,115200n8 rootdelay=1 selinux=0

Итак, вы видите, изменения были сделаны. Но предупреждающие сообщения продолжают печататься после перезагрузки.
Для метода 2 он говорит:

Could not set enforce status. Permission denied.

Так что теперь я попал в дилемму, понятия не имею, куда идти. Мои вопросы:

    1. Кто-нибудь знает, как отключить или установить разрешительный режим в Android?
    1. Какие файлы я должен изменить, если я хочу определить домен для нового сервиса?

Кроме того, ls -Z /system/bin/myservice дает это:

u:object_r:system_file:s0

2 ответа

Решение
  1. вам нужно su, чтобы установить разрешающий режим. Или вам нужен исходный код для отключения SELinux, например, отключить SELinux в конфигурации ядра или отключить SELinux в BOARD_KERNEL_CMDLINE в device/vendor_name/product_name/BoardConfig.mk.

  2. если у вас есть исходный код, вы можете определить новый домен по своему желанию.

Пожалуйста, обратитесь к официальным документам Android: https://source.android.com/security/selinux/device-policy

раздел: обозначить новые услуги и адрес отказа

Вы должны добавить атрибут seclabel к службе в вашем файле init.rc, но я не знаю, будет ли работать ваш контекст. Я только что реализовал это сам с контекстом init_exec:

$ grep yourservice system/sepolicy/file_contexts
/system/bin/vpd u:object_r:init_exec:s0

$ ls -Z path/to/system/bin/yourservice
u:object_r:init_exec:s0 path/to/system/bin/yourservice

$ grep yourservice device/brand/product/init.rc  -A 5
service yourservice /system/bin/yourservice
    seclabel u:r:init:s0
    user root
    group root
    oneshot

Отключить SELinux на Android несложно, и есть много вопросов, рассматривающих этот вопрос. Просто добавьте один из следующих параметров в параметры командной строки вашего ядра (например, bootargs в U-Boot):

androidboot.selinux=permissive
androidboot.selinux=disabled

Сам столкнулся с очень похожей проблемой, и вот что я нашел:

Когда ты бежишь ls -Z /system/bin/myservice и получите это:

u:object_r:system_file:s0

это означает, что ваш файл находится в system_file домен. Теперь это не очень хорошо, так как системные файлы не должны выполняться или, наконец, не во время инициализации (вы все равно сможете выполнить его позже с терминала обычным способом).

В моем случае мне повезло, потому что я заменял существующий системный сервис на настроенный, который я скомпилировал из исходного кода. Это означает, что я смог проверить контекст безопасности исходного файла, который я заменял, и это было из ls -Z /system/bin/myservice.bak:

u:object_r:myservice_exec:s0

Поэтому я обновил свой новый файл до того же chcon u:object_r:myservice_exec:s0 /system/bin/myservice

После этого все работало нормально.

Если вы хотите создать новый сервис, вам может понадобиться использовать домен, уже существующий в вашей политике, просто установив его на myservice_exec, не поможет, так как это будет несуществующий домен в вашем случае. Если бы я был на вашем месте и хотел бы избежать определения собственной политики, я мог бы попытаться найти службу с аналогичной безопасностью, проверить домен в этом и попытаться установить то же самое для моей службы. init_exec может быть хорошим кандидатом, но ваш пробег может варьироваться...

Другие вопросы по тегам