Предупреждение 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.
Так что теперь я попал в дилемму, понятия не имею, куда идти. Мои вопросы:
- Кто-нибудь знает, как отключить или установить разрешительный режим в Android?
- Какие файлы я должен изменить, если я хочу определить домен для нового сервиса?
Кроме того, ls -Z /system/bin/myservice
дает это:
u:object_r:system_file:s0
2 ответа
вам нужно su, чтобы установить разрешающий режим. Или вам нужен исходный код для отключения SELinux, например, отключить SELinux в конфигурации ядра или отключить SELinux в BOARD_KERNEL_CMDLINE в device/vendor_name/product_name/BoardConfig.mk.
если у вас есть исходный код, вы можете определить новый домен по своему желанию.
Пожалуйста, обратитесь к официальным документам 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
может быть хорошим кандидатом, но ваш пробег может варьироваться...