Предупреждение инициализации: службе 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. Anyone knows how to disable or set permissive mode in android?
    1. Which files should I modify if I want to define domain for the new service?

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

u:object_r:system_file:s0

person dudu    schedule 25.04.2017    source источник


Ответы (3)


  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

раздел: Маркировка новых услуг и адрес отказов

person kevinems    schedule 25.04.2017
comment
Поскольку мое имя пользователя root, я думаю, что у меня есть привилегии root. Мой коллега сказал мне, что мне все еще нужно su. После su я успешно установил разрешающий режим. В то время как для другой проблемы, мне кажется, что определить новый домен - это такая проблема: исходный код должен быть изменен, а андроид должен быть перекомпилирован. И весь мой проект должен быть перекомпилирован. - person dudu; 25.04.2017

Вы должны добавить атрибут 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
person Bayou    schedule 28.11.2018

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

Когда вы запускаете 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 может быть хорошим кандидатом, но ваш пробег может отличаться...

person sbnc.eu    schedule 29.04.2019