Root

Android 上的 Magisk 如何在沒有 setuid 和功能的情況下作為 su 工作?

  • August 14, 2018

我在另一個答案中讀到,在 Android 上,su二進製文件避免需要setuid使用文件系統功能,如cap_setuid. 但後來我嘗試檢查這一點,令我驚訝的是,我發現我的支持 Magisk 的 Android 8.0 系統上沒有設置任何功能。

這是我檢查的方式:

  1. 通過 SimpleSSHD 登錄
  2. scp‘ed 以下二進製文件取自 Debian arm64 軟體包libcap2libcap2-bin並且libc6
  • getcap
  • libc.so.6
  • libcap.so.2.25
  • libcap.so.2
  • ld-2.27.so
  1. 在電話上進行了以下終端會話:

**``` $ 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 身份執行)。

您可以按如下方式檢查:

$ 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 開始的。

引用自:https://unix.stackexchange.com/questions/462605