root – 如果没有setuid和功能,Android上的Magisk如何工作?

我在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开始的.

上一篇:Linux-- Centos7用户切换,PAM和提权


下一篇:android – 禁用supersu权限对话框