Я использую бесплатный SSHelper
SSH-сервер на своем телефоне, чтобы получить доступ по 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, чтобы исправить это?)
Я думаю, что проблема может заключаться в «неограниченном домене» по умолчанию, когда двоичный файл запускается, когда политика не указана.
Я бы попытался переместить 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.
Vi0
не2кубит