Как установить правильную политику SELinux/SEAndroid для приложения?

Я использую бесплатный SSHelperSSH-сервер на своем телефоне, чтобы получить доступ по SSH. Тем не менее, приложение работает некорректно SELinux, когда установлено в Enforcingрежим, но, кажется, в порядке при использовании Permissiveрежима. Это неудивительно, поскольку он был разработан под CyanogenMod , поэтому автор не знал об этих проблемах для более поздних стандартных AOS SELinux Enforcing.

Проблема возникает, когда приложение пытается выделить /dev/pts/Nпсевдотерминал во время соединения SSH. Это не удается, и полученная оболочка практически бесполезна для разработки. После того, как мы потратили значительное время, пытаясь отследить эту проблему, как описано ЗДЕСЬ . Где я нашел следующие "ошибки" в /data/misc/audit/audit.logфайле:

audit(1401291488.480:203): avc:  denied  { setattr } for  pid=11441 comm="sshelper_sshd" name="0" dev="devpts" ino=3 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:untrusted_app_devpts:s0 tclass=chr_file VE=SEPF_GT-I9195_4.2.2_0022_M
audit(1401291488.480:203): arch=40000028 syscall=15 per=840000 success=no exit=-13 a0=beffd438 a1=190 a2=27da a3=c0000000 items=1 ppid=8499 pid=11441 auid=4294967295 uid=10202 gid=10202 euid=10202 suid=10202 fsuid=10202 egid=10202 sgid=10202 fsgid=10202 tty=(none) ses=4294967295 comm="sshelper_sshd" exe="/data/data/com.arachnoid.sshelper/bin/sshelper_sshd" subj=u:r:untrusted_app:s0 key=(null)
audit(1401291488.480:203):  cwd="/"
audit(1401291488.480:203): item=0 name="/dev/pts/0" inode=3 dev=00:09 mode=020600 ouid=10202 ogid=10202 rdev=88:00 obj=u:object_r:untrusted_app_devpts:s0

Однако, поскольку у меня нет предыдущего опыта работы с SELinux и его загадочными механизмами защиты, мне действительно не помешала бы некоторая помощь. Я даже не знаю, является ли это реальной проблемой, просто предполагаю. Проверка разрешений вышеуказанного файла дает:

# ls -alZ /data/data/com.arachnoid.sshelper/bin/sshelper_sshd
-rwxr-xr-x u0_a202  u0_a202           u:object_r:app_data_file:s0 sshelper_sshd

Но это context, кажется, совсем не соответствует тому, что было показано в журнале .

Как я могу исправить эти разрешения, чтобы они хорошо работали с SELinux в принудительном режиме?

(Кроме того, какие инструменты и файлы доступны в Android, чтобы исправить это?)

Речь идет о разработке приложения или о настройке устройства?
Настройка устройства и "ремонт" приложения, так как приложение уже разработано, но я не смог связаться с разработчиком. Я также пробовал другие подобные приложения с такими же проблемами. Похоже, что большинство разработчиков приложений еще не знают и не понимают, как правильно настраивать и использовать эти загадочные и очень раздражающие функции SELinux.

Ответы (1)

Я думаю, что проблема может заключаться в «неограниченном домене» по умолчанию, когда двоичный файл запускается, когда политика не указана.

Я бы попытался переместить sshelper_sshd(я думаю, это сервер sshd?) куда-нибудь в /systemраздел ( /system/sbin/?)

Я думаю, что лучший и обновленный документ для чтения, посвященный реализации SELinux на Android (SEAndroid), — How-To SU .

Вот выдержка из главы 5.4.4. Андроид 4.4.3

Хорошим примером того, что неограниченный домен не является всемогущим, является выполнение файлов из каталога /data. Начиная с Android 4.4.3, это больше невозможно из неограниченного домена (см. #74082 и #78801).

Установившаяся практика включения бинарных файлов и скриптов в ваш APK, извлечение их в /data/data/[package]/files/ или помещение их в /data/data/[package]/lib/ и выполнение их оттуда через вызов su больше не будет работать из коробки. Хотя возможны и другие обходные пути (например, копирование и выполнение из rootfs), одним из решений является переключение контекстов на контекст не в неограниченном домене (например, u:r:untrusted_app:s0, контекст, который остальная часть вашего приложения, скорее всего, запускать как). Вам нужно будет провести обширное тестирование, чтобы увидеть, все ли вызовы, которые вы хотите сделать, по-прежнему выполняются в выбранном вами контексте, и вам, возможно, придется попробовать несколько разных, чтобы получить желаемые возможности.

Обратите внимание, что выполнение файлов в /data будет по-прежнему работать так, как ожидается от вашего приложения, если вы не пытаетесь запустить его от имени пользователя root.

Да, я читал все это много раз, но до сих пор не уверен, какие именно действия предпринять. Я пытался проверить двоичный файл раньше с неработающими результатами. Возможно, двоичный файл с программной привязкой в ​​/xbin, но как я могу убедиться, что приложение использует его вместо оригинала? Кроме того, в каком контексте это должно быть? Как узнать, какой контекст находится (или нет) в «Неограниченном домене»?
Я должен добавить, что я не являюсь разработчиком этого приложения, поэтому у меня нет возможности его изменить. Я могу изменить расположение и контекст задействованных файлов только из командной строки после установки.