2 votos

¿Qué contexto sepolítico permitirá que cualquier otro contexto acceda a él?

Estoy en un bootloader bloqueado Sprint Samsung Galaxy S7, eng boot.img flasheado al teléfono con SELinux permissive , lo que da a Root adb shell desde donde puedo cambiar las particiones del sistema, debloat, instalar Xposed, etc. Pero el kernel es muy malo y tiene fugas de RAM, y al final, el teléfono se ralentiza hasta el extremo. Así que desrooteé instalando el kernel de stock y desactivando DM verity para permitir el arranque de un sistema modificado.

Ahora bien, SELinux es forzoso, pero quiero que sea permisivo, lo que nunca ocurrirá con el kernel de serie. Me doy cuenta de que secontext se define en los tiempos de construcción del kernel y permite que ciertas cosas se ejecuten.

Otra opción es tener un contexto superior para hacer cosas como supolicy --live para parchear la política de SELinux y obtener acceso Root completo con el kernel stock. Estoy tratando de ejecutar un script en el data creado por mi aplicación, pero a menos que seenforcing=false No se ejecuta.

Sé que usando Root puedes chcon un archivo/directorio. Entonces, ¿cuál es el contexto (fuente) que permitirá a:

  • Poner el modo en permisivo, o
  • Modificar la política de SELinux, o
  • Ejecutar un script en el arranque sin negaciones de avc

O ¿cuál es el contexto (de destino) que permitirá a cualquier otro contexto (de origen) ejecutar el script?

4voto

Jack Wade Puntos 231

USUARIO DE LA RAZÓN Y SELINUX:

Usuario root (con UID 0) es el superusuario en la implementación del Control de Acceso Discrecional (DAC) de los sistemas operativos *NIX. DAC es permitido por defecto Es decir, cualquiera puede acceder a cualquier cosa a menos que los UID, GID y el modo de permiso restrinjan algo. Así que root puede hacer cualquier cosa porque es el núcleo SUPER USUARIO que no se le niega nada.

SELinux es el Control de Acceso Obligatorio (MAC) que es denegado por defecto Es decir, nadie puede acceder a nada a menos que se defina una regla de política para permitir el acceso. Así que no hay SUPER CONTEXTO que puede hacer cualquier cosa, sea cual sea el UID. Tienes que definir una regla para permitir cualquier operación que quieras realizar en tu dispositivo.

Tenga en cuenta que los controles de acceso (DAC o MAC) son aplicados por el kernel en el back end, que es el verdadero sistema operativo .

¿Cómo se aplica SELINUX en Android?

Las reglas de política de SELinux se definen al construir la ROM y se guardan como un archivo binario /sepolicy (o como split-policy ). Esta política es cargada por init (el primer proceso iniciado en el kernel Dominio SELinux ) antes de iniciar cualquier servicio/demonio/proceso en el arranque. El núcleo se inicia con SELinux permissive si se construye con la opción SECURITY_SELINUX_DEVELOP=y (que es el valor por defecto, como se discute aquí y aquí ). Después de cargar la política, init - cuando todavía se ejecuta con el contexto del kernel - establece SELinux enforcing (dependiendo del tipo de construcción de la ROM y del parámetro del núcleo androidboot.selinux ( 0 ) ) y luego cambia al contexto propio de init. A partir de aquí, incluso init no está permitido por la política volver a permissive modo ( 1 , 2 ) . La política no puede ser modificada ni siquiera por root usuario ( 3 ) .

Sin embargo, hay una excepción a dichas reglas. En userdebug o eng construye, u:r:su:s0 - que es el contexto adb shell obtiene cuando adbd se ejecuta como Root ( 4 ) o cuando /system/xbin/su se ejecuta ( 5 ) - puede hacer cualquier cosa, incluido el establecimiento de SELinux permisivo ( 6 ) .

Pero en una producción final ( user ) de la ROM, la única manera de setenforce 0 o modificar la política es tomar el control del proceso de arranque antes de que SELinux se establezca enforcing por init . Eso es lo que hacen las soluciones del rooting como Magisk al sustituir/Parcheando /init y /sepolicy en el disco RAM ( boot.img ). Magisk ejecuta procesos Root con contexto u:r:magisk:s0 que está permitido por la política parcheada para hacer cualquier cosa.

Una vez que tenga derechos (otorgados por DAC y MAC) para jugar con la política de SELinux, puede definir nuevas reglas de política de SELinux como se explica aquí .

Pasando a su pregunta:

selinux está haciendo cumplir pero quiero que sea permisivo lo que nunca sucederá con el kernel de stock

No. SELinux está configurado enforcing por init , no por el núcleo, excepto si se construye con SECURITY_SELINUX_ENFORCING=y opción ( 7 ) .

un contexto superior para hacer cosas como supolicy --live para parchear la política de selinux

No hay ningún contexto superior que pueda hacer nada. No se puede establecer el modo permissive y no puede parchear la política en user construye.

¿cuál es el contexto (de destino) que permitirá a cualquier otro contexto (de origen) ejecutar el script?

Como se ha dicho, no hay más alto contexto de la fuente que puede hacer cualquier cosa a los demás. De la misma manera, no hay baja contexto objetivo que permite a los demás hacer cualquier cosa.
También cuando se ejecuta un script, no hay necesariamente un único contexto de destino. Cada archivo que el script utiliza (binarios, configuraciones, registros, etc.) puede tener su etiqueta de contexto diferente. Y typetransitions también puede cambiar los contextos de origen.
Si desea modificar la política, puede obtener todos los avc denials del registro del kernel y luego definir nuevas reglas de SELinux en consecuencia:

~# dmesg -w | grep avc:

Solución:

Como ya está en eng build, sólo sustituye el binario del kernel ( zImage ) en su boot.img si quiere reemplazar el kernel. De lo contrario, te quedas atascado usando init y sepolicy de boot.img de un user construir.
En eng construir:

  • /init no establece SELinux enforcing en el arranque ( 8 )
  • /sepolicy permite a Root adb shell para hacer cualquier cosa, incluyendo setenforce y load_policy como se ha explicado anteriormente

Si su núcleo está construido con SECURITY_SELINUX_ALWAYS_ENFORCE no se puede configurar SELinux permissive una vez que se ha establecido enforcing ( 9 ) .

RELACIONADO:

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