我在another answer中读到,在Android上,su二进制文件通过使用cap_setuid等文件系统功能来避免需要setuid.但后来我试着检查一下,令我惊讶的是,我发现在我的支持Magisk的Android 8.0系统上没有设置任何功能.
这是我检查的方式:
>通过SimpleSSHD登录
> scp从Debian arm64包中获取以下二进制文件libcap2,libcap2-bin和libc6:
> getcap
> libc.so.6
> libcap.so.2.25
> libcap.so.2
> ld-2.27.so
>手机上有以下终端会话:
$su
# whoami
root
# exit
$type su
su is /sbin/su
$ls -lh /sbin/su
lrwxrwxrwx 1 root root 12 2018-08-12 22:40 /sbin/su -> /sbin/magisk
$ls -lh /sbin/magisk
-rwxr-xr-x 1 root root 94 2018-08-12 22:40 /sbin/magisk
$sed 's@^@> @' /sbin/magisk
> #!/system/bin/sh
> unset LD_LIBRARY_PATH
> unset LD_PRELOAD
> exec /sbin/magisk.bin "${0##*/}" "$@"
$ls -lh /sbin/magisk.bin
-rwxr-xr-x 1 root root 71K 2018-08-12 22:40 /sbin/magisk.bin
$file /sbin/magisk.bin
/sbin/magisk.bin: ELF shared object, 32-bit LSB arm, dynamic (/system/bin/linker), stripped
$LD_LIBRARY_PATH=. ./ld-2.27.so ./getcap -v /sbin/magisk.bin
/sbin/magisk.bin
如您所见,/ sbin / magisk.bin二进制文件中既没有setuid位也没有任何功能.发生什么了?它是如何工作的?
解决方法:
看来/sbin/magisk.bin非root用户启动不会自己生成root shell.相反,它将其请求传递给magiskd,它以root身份执行.并且在检查权限后,magiskd执行请求的命令. (有趣的是,magiskd是相同的二进制文件 – /sbin/magisk.bin,但是作为root运行init).
您可以按如下方式检查:
$echo $$
27699
$su
# echo $PPID
2606
# exit
$su
# echo $PPID
2606
# ps -A|egrep '^[^ ]+ +2606'
root 2606 1 16044 2068 __skb_recv_datagram eb4d2fe0 S magiskd
请注意,在上面的输出中,在我们退出超级用户shell并重新输入之后,父PID仍然保持不变(此会话中为2606),但不等于原始非root shell的PID(此会话中为27699) ).此外,magiskd的父PID是1,即init,这是另一个确认它不是我们从非root shell开始的.