Como o Magisk no Android funciona como su sem setuid e recursos?

2

Li em outra resposta que no Android os su binários evitam a necessidade de ser setuid usando recursos do sistema de arquivos como cap_setuid . Mas então eu tentei verificar isso, e para minha surpresa, não encontrei nenhum recurso definido no meu sistema Android 8.0 habilitado para Magisk.

Veja como eu verifiquei:

  1. Conectado via SimpleSSHD
  2. scp 'os binários seguintes tirados dos pacotes Debian arm64 libcap2 , libcap2-bin e libc6 :
    • getcap
    • libc.so.6
    • libcap.so.2.25
    • libcap.so.2
    • ld-2.27.so
  3. Teve a seguinte sessão de terminal no telefone:

$ 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

Como você pode ver, nem setuid bit, nem quaisquer recursos estão presentes no binário /sbin/magisk.bin . Então o que está acontecendo? Como isso funciona?

    
por Ruslan 14.08.2018 / 23:12

1 resposta

2

Parece que /sbin/magisk.bin o lançamento de usuário não-raiz não gera o shell raiz sozinho. Em vez disso, ele comunica sua solicitação para magiskd , que é executado como raiz. E magiskd , após verificar as permissões, executa o comando solicitado. (Curiosamente, magiskd é o mesmo binário - /sbin/magisk.bin , mas executado por init como root).

Você pode verificar isso da seguinte maneira:

$ 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

Observe que na saída acima, depois de exit o shell de superusuário e redigitá-lo, o PID pai ainda permanece o mesmo (2606 nesta sessão), mas não é igual ao PID do shell original não raiz (27699 nesta sessão). Além disso, o PID pai de magiskd é 1, ou seja, init , que é mais uma confirmação de que não é o que começamos no nosso shell não-raiz.

    
por 14.08.2018 / 23:12