Android 上的 Magisk 如何在沒有 setuid 和功能的情況下作為 su 工作?
我在另一個答案中讀到,在 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 身份執行)。您可以按如下方式檢查:
$ 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 開始的。