Eu li em outra resposta que no Android os su
binários evitam a necessidade de setuid
usar recursos do sistema de arquivos como cap_setuid
. Mas então tentei verificar isso e, para minha surpresa, não encontrei recursos definidos no meu sistema Android 8.0 habilitado para Magisk.
Veja como verifiquei:
- Conectado via SimpleSSHD
scp
'ed os seguintes binários retirados dos pacotes Debian arm64 elibcap2
:libcap2-bin
libc6
getcap
libc.so.6
libcap.so.2.25
libcap.so.2
ld-2.27.so
- 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
o bit nem nenhum recurso está presente no /sbin/magisk.bin
binário. Então o que está acontecendo? Como funciona?
Parece que
/sbin/magisk.bin
o usuário não root inicializa não gera o shell root sozinho. Em vez disso, ele comunica sua solicitação paramagiskd
, que é executada como root. Emagiskd
, após verificar as permissões, executa o comando solicitado. (Curiosamente,magiskd
é o mesmo binário –/sbin/magisk.bin
, mas executadoinit
como root).Você pode verificar isso da seguinte forma:
Observe que na saída acima, depois
exit
de inserirmos o shell de superusuário novamente, o PID pai ainda permanece o mesmo (2606 nesta sessão), mas não igual ao PID do shell não raiz original (27699 nesta sessão) . Além disso, o PID pai demagiskd
é 1, ou sejainit
, , que é mais uma confirmação de que não é o que iniciamos em nosso shell não raiz.