私が読んでもう一つの答えAndroidでは、ファイルシステム機能(例su
:。setuid
cap_setuid
私が確認した方法は次のとおりです。
- 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
ご覧のとおり、バイナリsetuid
にはビットや機能はありません/sbin/magisk.bin
。どうしたの?どのように動作しますか?
答え1
/sbin/magisk.bin
ルート以外のユーザーの起動は、ルートシェルを独自に作成しないようです。代わりに、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
上記の出力でexit
スーパーユーザーシェルを再入力した後も、親PIDはまだ変わりませんが(このセッションでは2606)、ルートではなく元のシェルのPID(このセッションでは27699)とは異なります。 )。また、親PIDはmagiskd
1です。init
これは、ルートではなくシェルで起動しないことをもう一度確認します。