TL; DR:这是一个关于可移植,面向开发人员的生根过程的最终步骤的问题,该步骤适用于所有Android机器。它不基于任何漏洞利用-作为开发人员,我们在法律上和道德上都可以对自己的机器进行操作。如果我得到了答案并设法在Debian中使用chroot,我将撰写一篇简洁的博客文章,详细介绍此过程的所有步骤,供所有希望root访问其平板电脑的开发人员-不想信任可疑起源的人“一键式root”对他们的机器(僵尸网络成员?)知道什么......唯一的依赖关系是机器的内核源(制造商有义务提供)和引导分区映像(boot.img
),这是制造商提供的空中下载更新中的99%的时间,也可以作为独立的可闪存映像单独下载。
因此,一周过去了,我将所有空闲时间都花在了新的Android平板电脑上。
我几乎完全成功-创建了一个可移植的,面向开发人员的流程,以实现在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
现在,我已经扎根:
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
也就是说,我无法安装外部SD卡的EXT4-fs格式的第二分区。
我也无法使用我可爱的debootstrap
-ed Debian:
root@K01E_2:/ # chroot /data/debian/ /bin/bash
chroot() fail
Operation not permitted
是因为SELinux吗?
我不知道-我是SELinux的新手(新手-一个星期大)。我以为,当您进入睡眠状态(getenforce
报告“宽松”)时,它就不再干扰...
显然,我错了。在兔子洞下,我们又去了...
可能是因为我的过程环境吗?
请记住,id
返回...“ uid = 0(root)gid = 0(root)... context = u:r:shell:s0 ”
我可以更改上下文吗?作为所有人,我可以离开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
唱歌?
任何建议最欢迎...