AndroidのMagiskはsetuidと機能なしでsuモードでどのように機能しますか?

AndroidのMagiskはsetuidと機能なしでsuモードでどのように機能しますか?

私が読んでもう一つの答えAndroidでは、ファイルシステム機能(例su:。setuidcap_setuid

私が確認した方法は次のとおりです。

  1. SimpleSSHD経由でログイン
  2. scpDebian arm64パッケージからインポートし、バイナリを編集しましたlibcap2libcap2-binlibc6
    • 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ルート以外のユーザーの起動は、ルートシェルを独自に作成しないようです。代わりに、magiskdrootとして実行可能ファイルに要求を渡します。そしてmagiskd権限を確認した後、要求されたコマンドを実行します。 (興味深いことに、magiskd同じバイナリですが、/sbin/magisk.binrootとして実行されます。)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はmagiskd1です。initこれは、ルートではなくシェルで起動しないことをもう一度確認します。

関連情報