TL; Д.Р .: Это вопрос о последнем шаге в переносимом, ориентированном на разработчика процессе рутирования, который работает на всех машинах Android. Он не основан на каком-либо подвиге - это то, что нам, как разработчикам, разрешено делать юридически и морально на наших собственных машинах. Если я получу ответ и смогу выполнить chroot внутри своего Debian, я сделаю краткое сообщение в блоге с подробным описанием всех этапов этого процесса для всех коллег-разработчиков, которые хотят получить root-доступ к своим планшетам - и не хотят доверять сомнительному происхождению «корни в один клик», которые, как Бог знает, для своих машин (участников ботнета?) ... Единственными зависимостями будут источники ядра машины (которые юридически обязаны предоставлять производители) и образ загрузочного раздела (boot.img
), что составляет 99% времени в предоставленных производителем беспроводных обновлениях, или может быть отдельно загружено как отдельное изображение с возможностью прошивки.
Итак, прошла неделя, когда я проводил все свободное время на своем новом планшете Android.
И я почти полностью преуспел - в создании портативного, ориентированного на разработчика процесса для получения root в моем планшете Android 5.0.2.
Но пока не хватает одной вещи - я не могу сделать chroot (который мне нужен для запуска моего debootstrap
-ed Debian!)
Что я сделал до сих пор
- Сначала я сделал небольшое исправление в исходных текстах ядра моего планшета (предоставленных производителем), а затем скомпилировал свое собственное ядро, где отключил проверки для изменения режима принудительного применения SELINUX . В частности ...
В security/selinux/selinuxfs.c
:
...
if (new_value != selinux_enforcing) {
/* Commented out by ttsiodras.
length = task_has_security(current, SECURITY__SETENFORCE);
if (length)
goto out;
*/
audit_log(current->audit_context, GFP_KERNEL, AUDIT_MAC_STATUS,
"enforcing=%d old_enforcing=%d auid=%u ses=%u",
new_value, selinux_enforcing,
Затем я изменил мое Initrd изображение это
/default.prop
содержать:ro.secure=0
иro.debuggable=1
Так как у моего производителя его не
initrd.img
было, я также скомпилировалsu.c
по адресу https://android.googlesource.com/platform/system/extras/+/master/su/ и поместил полученный бинарный файл в папку/sbin/su
, убедившись, что он установлен в SUID root (chmod 04755 /sbin/su
) ,
После этого я упаковал новое ядро и новый initrd, как я объяснил в Эпизоде 2 моего предыдущего поста, и загрузился с собственного образа:
adb reboot boot-loader ; fastboot boot myboot.img
Итак, вы рут?
Да, изначально он оказался успешным:
$ adb shell
shell@K01E_2:/ $ id
uid=2000(shell) gid=2000(shell) groups=1004(input),1007(log),1011(adb),
1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),
3003(inet),3006(net_bw_stats)
context=u:r:shell:s0
shell@K01E_2:/ $ ls -l /sbin/su /sbin/_su
-rwxr-xr-x root root 131 2015-10-03 10:44 su
-rwsr-xr-x root root 9420 2015-10-03 01:31 _su
(the _su is the binary I compiled, set to SUID root, and "su" is
a script I wrote to tell "su" to add me to all these groups...)
shell@K01E_2:/ $ cat /sbin/su
#!/system/bin/sh
export PATH=/system/bin:$PATH
exec /sbin/_su 0,0,1000,1028,2000,2001,1004,1007,1011,1015,\
1028,3001,3002,3003,3006
И я теперь достиг root:
shell@K01E_2:/ $ su
root@K01E_2:/ # id
uid=0(root) gid=0(root)
groups=1000(system),1004(input),1007(log),1011(adb),
1015(sdcard_rw),1028(sdcard_r),1028(sdcard_r),2000(shell),2001(cache),
3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats)
context=u:r:shell:s0
Я на 100% уверен, что являюсь пользователем root - не только потому, id
что так сказано, но и потому, что я могу делать то, что обычные процессы не могут:
root@K01E_2:/ # ls -l /dev/block/platform/msm_sdcc.1/by-name/boot
lrwxrwxrwx root root 2015-10-03 10:47 boot -> /dev/block/mmcblk0p16
root@K01E_2:/ # dd if=/dev/block/mmcblk0p16 of=/dev/null bs=1M
16+0 records in
16+0 records out
16777216 bytes transferred in 0.569 secs (29485441 bytes/sec)
И вот, наконец, я могу читать сырые разделы из своего планшета!
И SELinux действительно находится в режиме «вниз, собака»:
root@K01E_2:/ # getenforce
Permissive
Но ... есть еще вещи, которые я не могу сделать:
root@K01E_2:/ # mkdir /my_mnt
root@K01E_2:/ # mount -t ext4 /dev/block/mmcblk1p2 /my_mnt
mount: Operation not permitted
То есть я не могу смонтировать отформатированный в EXT4-fs 2-й раздел моей внешней SD-карты.
Я также не могу получить доступ к моему debootstrap
любимому Debian:
root@K01E_2:/ # chroot /data/debian/ /bin/bash
chroot() fail
Operation not permitted
Это из-за SELinux?
Я не знаю - я новичок (очень новый - одна неделя) в SELinux. Я думал, что когда вы усыпляете его ( getenforce
сообщая "Permissive"), это больше не мешает ...
Видимо, я был не прав. Вниз по кроличьей норе мы снова идем ...
Может ли это быть из-за моего контекста процесса?
Помните, что id
возвращено ... "uid = 0 (root) gid = 0 (root) ... context = u: r: shell: s0 "
Могу ли я изменить этот контекст? Будучи root и все, я могу отойти от shell
? И если так, переходите к чему?
Ответ на первый вопрос runcon
:
shell@K01E_2:/ $ runcon u:r:debuggerd:s0 /sbin/su
root@K01E_2:/ # id
uid=0(root) gid=0(root)... context=u:r:debuggerd:s0
Хорошо. Но какой контекст позволит мне mount
и chroot
?
Читая больше о SELinux, вернувшись на свою основную машину, я анализирую /sepolicy
файл в корне initrd.img
:
linuxbox$ $ sesearch -A sepolicy | grep chroot
allow init_shell init_shell : capability { chown sys_chroot ...
allow init init : capability { chown dac_read_search sys_chroot ...
allow kernel kernel : capability { chown dac_override sys_chroot ...
allow asus-dbug-d asus-dbug-d : capability { chown sys_chroot ...
...
ОК, ряд возможностей! Особенно то, что kernel
кажется многообещающим:
shell@K01E_2:/ $ runcon u:r:kernel:s0 /sbin/su
root@K01E_2:/ # id
uid=0(root) gid=0(root)... context=u:r:kernel:s0
root@K01E_2:/ # chroot /data/debian/ /bin/bash
chroot() fail
Operation not permitted
Штопать.
Кто, черт возьми, мешает мне chroot
?
Любые советы приветствуются ...