Android의 Magisk는 setuid 및 기능 없이 su 모드에서 어떻게 작동합니까?

Android의 Magisk는 setuid 및 기능 없이 su 모드에서 어떻게 작동합니까?

내가 읽고또 다른 대답Android에서는 파일 시스템 기능(예 su: .setuidcap_setuid

내가 확인한 방법은 다음과 같습니다.

  1. SimpleSSHD를 통해 로그인
  2. scpDebian arm64 패키지 에서 가져온 다음 바이너리 를 편집했습니다 libcap2.libcap2-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루트가 아닌 사용자 시작은 루트 쉘을 자체적으로 생성하지 않는 것 같습니다 . 대신 magiskd루트로 실행 파일에 요청을 전달합니다 . 그리고 magiskd권한을 확인한 후 요청한 명령을 실행합니다. (흥미롭게도 magiskd동일한 바이너리이지만 /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​​수퍼유저 셸을 다시 입력한 후에도 상위 PID는 여전히 동일하게 유지되지만(이 세션에서는 2606) 루트가 아닌 원래 셸의 PID(이 세션에서는 27699)와는 다릅니다. ) . 또한 상위 PID는 magiskd1입니다. init이는 루트가 아닌 쉘에서 시작하지 않는다는 것을 다시 한 번 확인시켜 줍니다.

관련 정보