Как установить SELinux на 0 или разрешающий режим в Android 4.4.4 и выше?

Я хочу установить для режима SELinux (Security Enhanced Linux) значение Permissive или (0) на Android 4.4.4 (и выше, если это возможно). Я использую следующую команду: setenforce 0, setenforce permissive и setenforce Permissive под root (мое устройство рутировано). Но выход getenforce всегда Enforcing. Теперь я измучен этой проблемой.

Может ли кто-нибудь дать мне решение? Заранее спасибо.


person Vu Tran    schedule 23.06.2015    source источник


Ответы (3)


Очевидно Google удалил флаг ядра CONFIG_SECURITY_SELINUX_DEVELOP со многих своих Stock< /em> ядра. Таким образом, стандартный трюк, упомянутый Уильямом (ниже), вероятно, не работает. Примером таких устройств является Samsung Note 4 (SM-N910F) с AOS 4.4.4.

По ссылке выше указано:

CONFIG_SECURITY_SELINUX_DEVELOP, также известный как глобальный разрешающий режим, полезен, когда вы впервые разрабатываете политику для конкретной платы (добавьте «androidboot.selinux=permissive» в BOARD_KERNEL_CMDLINE). Он также разрешает временное использование setenforce 0 в сборках -userdebug или -eng, что может быть полезно для разработчиков.

Если загрузчик заблокирован, вы не можете изменить командную строку ядра.

«Кроме того, код в программе инициализации для обработки параметра androidboot.selinux= скомпилирован только в сборках -userdebug и -eng, поэтому даже помимо блокировки загрузчика вы не можете использовать androidboot.selinux=permissive в сборке -user».

Способ проверить, какой у вас тип сборки:

$ getprop ro.build.type
user
person not2qubit    schedule 18.09.2015

В зависимости от того, как ваше устройство было рутировано и какой у вас установлен Android ROM, будет зависеть, как вы можете его отключить. Первое, что нужно попробовать, это:

adb shell su 0 setenforce 0

Это НЕ то же самое, что:

adb shell setenforce 0

Выполнение su вызывает переход домена из оболочки (который не может использовать setenforce) в домен su (который может вызывать setenforce). Например, запустите:

$ adb shell id -Z
context=u:r:shell:s0

в сравнении с:

$ adb shell su 0 id -Z
context=u:r:su:s0

Это может не сработать по трем причинам:

  1. У вас нет исполняемого файла su
  2. Исполняемый файл su имеет неправильную метку
  3. Правила домена su не были скомпилированы в загрузочный образ

Чтобы исправить проблему 2, вы можете (при условии, что adb является корнем):

adb remount
adb shell chcon /system/xbin/su u:object_r:su_exec:s0

Это может привести к сбою, что, скорее всего, укажет на проблему 3. Чтобы исправить проблему 3, вам необходимо перекомпилировать boot.img, содержащий файлы политики su. Если вы компилируете AOSP, просто запустите версию userdebug или eng вашего устройства.

Другой подход состоит в том, чтобы удалить функциональность из init.c, и, как и в случае с проблемой 3, требуется перекомпилировать boot.img. Перейдите в system/core/init/init.c (или .cpp) и удалите все вызовы security_setenforce().

Кроме того, у XDA есть приложение, которое может помочь автоматизировать этот процесс и упростить его, однако я не могу говорить о качестве приложения: http://www.xda-developers.com/easyly-change-ваш-android-selinux-mode/

person William Roberts    schedule 30.06.2015
comment
В моем случае контекст u:r:su:s0 больше не существует с момента последнего обновления поставщика. Как добавить его в /sepolicy? - person user2284570; 28.03.2020

ДОЛЖЕН БЫТЬ рутирован! Не уверен, что это работает на KitKat (так и должно быть), но я использую это на своем Nexus 6. Запустите в терминале или ADB Shell следующее:

su
mount -o remount,rw /system
mkdir /system/su.d
echo "#!/system/bin/sh" > /system/su.d/permissive.sh
echo "echo 0 > /sys/fs/selinux/enforce" >> /system/su.d/permissive.sh
chmod 755 /system/su.d/permissive.sh

И проверьте это после перезагрузки следующим образом:

su
/system/bin/getenforce
person Kristopher    schedule 31.03.2016