Android 上的 Magisk 如何在没有 setuid 和功能的情况下以 su 方式工作?

Android 上的 Magisk 如何在没有 setuid 和功能的情况下以 su 方式工作?

我读过另一个答案在 Android 上,su二进制文件无需setuid使用文件系统功能,例如cap_setuid.但后来我尝试检查这一点,令我惊讶的是,我发现在启用 Magisk 的 Android 8.0 系统上没有设置任何功能。

这是我检查的方法:

  1. 通过 SimpleSSHD 登录
  2. scp编辑了从 Debian arm64 软件包中获取的以下二进制文件libcap2libcap2-bin并且libc6
    • getcap
    • libc.so.6
    • libcap.so.2.25
    • libcap.so.2
    • ld-2.27.so
  3. 电话上有以下终端会话:

$ 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。发生什么了?它是如何工作的?

答案1

看来/sbin/magisk.bin非 root 用户启动不会自行生成 root shell。相反,它将其请求传达magiskd给以 root 身份执行的 。并且magiskd,在检查权限后,执行请求的命令。 (有趣的是,magiskd是相同的二进制文件 – ,但以 root/sbin/magisk.bin身份运行)。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

请注意,在上面的输出中,在我们exit超级用户 shell 并重新进入它之后,父 PID 仍然保持不变(本会话中为 2606),但不等于原始非 root shell 的 PID(本会话中为 27699) 。而且, 的父 PIDmagiskd是 1,即init,这再次确认它不是我们从非 root shell 启动的。

相关内容