我在另一个答案中读到,在 Android 上,su
二进制文件避免需要setuid
使用文件系统功能,如cap_setuid
. 但后来我尝试检查这一点,令我惊讶的是,我发现我的支持 Magisk 的 Android 8.0 系统上没有设置任何功能。
这是我检查的方式:
- 通过 SimpleSSHD 登录
scp
'ed 以下二进制文件取自 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
如您所见,二进制文件中既不setuid
存在位,也不存在任何功能。/sbin/magisk.bin
发生什么了?它是如何工作的?
似乎
/sbin/magisk.bin
非 root 用户启动并不会自行生成 root shell。相反,它将其请求传达magiskd
给以 root 身份执行的 。并且magiskd
,在检查权限后,执行请求的命令。(有趣的是,magiskd
是相同的二进制文件 –/sbin/magisk.bin
,但init
以 root 身份运行)。您可以按如下方式检查:
请注意,在上面的输出中,在我们
exit
超级用户 shell 并重新输入后,父 PID 仍然保持不变(此会话中为 2606),但不等于原始非 root shell 的 PID(此会话中为 27699) . 此外,父 PIDmagiskd
是 1,即init
,这进一步证实了这不是我们从非 root shell 开始的。