7 votos

¿Qué privilegios especiales tiene "/system/xbin/su" con respecto al acceso root?

Esta respuesta dice:

Debido a la forma en que están configurados los permisos de directorio/archivo en Android, necesitas tener el binario su en tu partición /system para que funcione. Ponerlo en otro lugar no será suficiente, porque no tendrá los permisos que necesita para permitir que los procesos cambien de usuario.

¿Cuál es el mecanismo que hace que los binarios en /system tengan privilegios especiales?
Específicamente, si moviera /system/xbin/su a /data/xbin/su (y cambiara cualquier cosa relevante para que apunte a /data/xbin/su en lugar de /system/xbin/su), ¿qué sería diferente?


Mi suposición es que estos privilegios son aplicados por SELinux.
Busqué en las fuentes de Android, y encontré en platform/system/sepolicy/private/file_contexts:

/system(/.*)?       u:object_r:system_file:s0

y en platform/system/sepolicy/public/domain.te:

allow { appdomain coredomain } system_file:file { execute read open getattr map };

Sin embargo, también encontré en platform/system/sepolicy/private/file_contexts:

/system/xbin/su     u:object_r:su_exec:s0

y en platform/system/sepolicy/public/domain.te:

# Nadie debería poder ejecutar su en compilaciones de usuario.
# En compilaciones userdebug/eng, solo dumpstate, shell y
# su mismo ejecutan su.
neverallow { domain userdebug_or_eng(`-dumpstate -shell -su') } su_exec:file no_x_file_perms;

Así que estoy confundido.

10voto

Jack Wade Puntos 231

Dado que Android está basado en el kernel de Linux, obtener acceso Root ejecutando /system/xbin/su - como se puede hacer en un sistema Linux - solía funcionar en los buenos tiempos, pero no ahora. La historia es un poco retorcida.

¿QUÉ ES EL SUID?
Lo especial de /system/xbin/su no es que esté en /system partición, pero el set-user-ID-root (SUID) El bit establecido en este binario lo hace especial. SUID ( S y propietario U ser ID up on execution) es un tipo especial de permiso en el kernel de Linux que otorga los permisos del propietario del archivo al nuevo proceso en lugar de heredar los permisos del proceso padre que lo ejecuta. Dado que el propietario de /system/xbin/su es Root (UID 0), puede cambiar el UID efectivo del proceso a 0 cuando se ejecuta, permitiendo así que el proceso que llama tenga acceso a Root.
Esto forma parte del Control de Acceso Discrecional (DAC); uno de Características de seguridad del núcleo de Linux .

CONTROL DE ACCESO OBLIGATORIO (MAC):
Implementado desde KitKat, SELinux puede controlar quién ejecuta su binario, mediante la definición de reglas de Vector de Acceso:

Objeto: /system/xbin/su u:object_r:su_exec:s0
Asunto: service adbd /system/bin/adbd --root_seclabel=u:r:su:s0
Y regula algo así como: allow su su_exec : file { read getattr map execute entrypoint open }

Es evidente que sólo adb daemon cuando se ejecuta como Root, será capaz de ejecutar su binario. Pero adbd no puede ser ejecutado como Root ( 1 , 2 ) sobre el final el usuario construye , ni se incluye el binario su en user construye. Así que, /system/xbin/su está pensado sólo para que los desarrolladores puedan depurar eng inercia o userdebug construye una ROM.
Del mismo modo, algunos otros programas como estado de volcado y cáscara puede hacer transición de tipo para correr con el contexto u:r:su:s0 mientras se ejecuta su para fines de depuración, ya que tiene mencionado .

¿Cómo restringe Android el acceso a root?
Dejando de lado SELinux, en la construcción de una ROM destinada a usuarios finales, colocar su en /system no dará ninguna ventaja, incluso con set-user-ID-root . Una aplicación normal no puede elevar sus privilegios a Root ejecutando su porque:

  • A partir de Jelly Bean Android cambió a las capacidades de archivo (una capacidad es un subconjunto de los privilegios de Root) en lugar de confiar en set-user-ID tipo de vulnerabilidades de seguridad. Un mecanismo más seguro: Capacidades ambientales también se ha introducido en Android Oreo.
  • Los demonios y servicios del sistema pueden hacer uso de las capacidades de los archivos para obtener capacidades de proceso (véase en Transformación de las capacidades durante la ejecución ) pero las aplicaciones tampoco pueden hacerlo porque se ejecutan con el atributo de control de procesos NO_NEW_PRIVS conjunto, ignorando set-user-ID así como las capacidades de los archivos. El SUID también se ignora al montar /system y /data con nosuid para todas las aplicaciones.
  • El UID sólo puede cambiarse si el proceso de llamada tiene SETUID/SETGID en su conjunto Bounding (una de las 5 categorías de capacidades que puede tener un proceso). Pero las aplicaciones de Android están hechas para ejecutarse con todas las capacidades ya caídas en todos los conjuntos.
  • A partir de Oreo, la capacidad de las apps para cambiar el UID/GID se ha suprimido aún más por bloquear ciertas llamadas al sistema utilizando filtros seccomp .

El demonio ADB, sin embargo, se ejecuta con CAP_SETUID y CAP_SETGID . Pero adb shell también no puede conseguirnos capacidades ejecutando un SUID-Root su binario porque NOROOT y NO_SETUID_FIXUP los bits de seguridad están activados en adbd proceso.

Las llamadas al sistema utilizadas en estos métodos de sandboxing: cap_set_proc , setresuid , setresgid , sys_seccomp , prctl (CAPBSET_DROP, SET_NO_NEW_PRIVS, SET_SECUREBITS, SET_SECCOMP) forman parte de Minijail .

¿CÓMO OBTENER ACCESO A root EN ANDROID?
Así que si queremos tener privilegios con UID 0 y todas las 38 capacidades del kernel de Linux, necesitamos una solución de rooting que pueda lidiar con todas las medidas de seguridad descritas anteriormente. Dado que la solución autónoma su binarios dejaron de funcionar con el lanzamiento de Jelly Bean, se hizo una transición al modo su daemon .

Ahora, en un teléfono rooteado, un demonio con todos los privilegios se ejecuta desde el inicio del proceso de arranque (de hecho init se sustituye). Cuando una aplicación necesita acceso a root, ejecuta su binario proporcionado por la solución del rooting . Este su no cambia el UID/GID por sí mismo, sino que sólo se conecta al demonio del superusuario a través de un socket UNIX y pide que se proporcione a la aplicación solicitante un shell Root con todas las capacidades. Para interactuar con el usuario para conceder/denegar su de las aplicaciones, su daemon se conecta con una aplicación que puede mostrar las indicaciones de la interfaz de usuario. El demonio su crea una base de datos de permisos concedidos/denegados para su uso futuro.
Además de eso, las denegaciones de SELinux también se manejan definiendo las reglas de permiso de la política de SELinux cuando se rootea el teléfono.

Los nuevos métodos de Root como Magisk funcionan en modo sin sistema, es decir, sin modificar /system partición. Sólo se modifica la partición de arranque -que contiene el kernel y el initramfs- para inyectar el servicio su daemon y las nuevas políticas de SELiux. Un gestor de arranque bloqueado no arrancará modificado boot.img , por lo que hay que desbloquear el bootloader. Para más detalles sobre esto, ver Desbloqueo del Bootloader . Sin embargo, ha habido algunos hacks del rooting que han funcionado saltándose las implementaciones de seguridad descritas anteriormente sin recurrir a la forma adecuada del rooting. La mayoría de estos exploits y vulnerabilidades en el sistema operativo Android se han solucionado con el tiempo. Aquí hay una buena redactar sobre este tema.
Así, colocando su binario bajo /system o cualquier otro lugar no dará ningún beneficio.

PS: Por favor, ignora tantos enlaces, son para mi propia referencia futura.

0 votos

¿Hay alguna forma de obtener acceso de root en una aplicación en una compilación user_debug? ¡Ejecutar /system/xbin/su falla debido a selinux, incluso en modo permisivo!

2 votos

@Paschalis nada puede fallar debido a SELinux en modo permisivo. Pero no es solo SELinux lo que hace que /system/xbin/su falle. Los problemas más grandes son el atributo NO_NEW_PRIVS y las capacidades eliminadas para todos los procesos de la aplicación. Por eso necesitamos un demonio en segundo plano. La respuesta a tu consulta ya está allí: "Para tener acceso root desde aplicaciones ... necesitamos rootear el teléfono".

0 votos

TWRP no está disponible para Android 10, y al intentar iniciar en él, falla al montar /system. Y el parche de Magisk en boot.img se rompe tan pronto como modifico cosas en /system/lib64 y /system/bin/. Me pregunto si podrías tomarte un tiempo para discutir esto en un chat. ¡Muchas gracias!

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X